diff --git a/lib/core/Handles/HandlesTypeMerge.py b/lib/core/Handles/HandlesTypeMerge.py index f26db16..ae8c0b3 100644 --- a/lib/core/Handles/HandlesTypeMerge.py +++ b/lib/core/Handles/HandlesTypeMerge.py @@ -97,10 +97,26 @@ class HandlesTypeMerge(BaseHandle): Result.Name = TypeName Result.PtrCount = 1 # REnum 变量默认为指针(和 struct 一致) return Result - # 类名与枚举成员名冲突时(如 Constant 既是 ASTKind.Constant 枚举成员又是结构体类名), - # 优先检查 Gen.structs:类型注解应解析为结构体而非枚举值 + # 类名与枚举成员名冲突时(如 Constant 既是 ASTKind.Constant 枚举成员又是 + # 结构体类名),类型注解应解析为结构体而非枚举值。判据是"该名**有类定义**", + # 两个来源都要查(与下方 Attribute 分支 L241-269 的判据**同一条规则源**, + # 也与 TypeConvert._type_str_to_llvm_base 的 `type_str in self.structs or + # type_str in self._struct_sha1_map` 守卫同口径): + # ① Gen.structs:本模块已创建的结构体(原判据); + # ② Gen._struct_sha1_map:预扫描登记了"类名 → 模块 sha1"、但本模块尚未 + # 建出结构体的类(跨模块 import 的类)。 + # 只查①漏②时的现场:`rawptr[Constant]`(includes/ast/exprs.vp:59 的 + # accessor,`class Constant` 声明在同文件更后面)在导入侧解析时该名先命中 + # 平坦符号表里的枚举成员 `Constant: t.State`(ast/base.vp)→ 走下方 + # `Entry.IsEnum` 分支返回枚举 → 与 t.CPtr 合并后经 _ctype_to_llvm 的 + # IsEnum 分支(枚举名未登记 ⇒ 宽度退化为 i32)得 **i32\***,与调用点实参 + # %".Constant"* 分裂 → FuncGen._adjust_args fail-fast。 + # 查②后 BaseType=CStruct('Constant'),_get_or_create_struct 会按 + # `_struct_sha1_map` 拼出 `".Constant"`(BaseGen.py:527-528), + # 与声明端/实参同一结构体对象。 _Gen = getattr(self.Trans, 'LlvmGen', None) - if _Gen and TypeName in _Gen.structs: + if _Gen and (TypeName in _Gen.structs + or TypeName in getattr(_Gen, '_struct_sha1_map', {})): Result = CTypeInfo() Result.BaseType = t.CStruct(name=TypeName) Result.IsStruct = True