diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index 7109374..7416ec6 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -1995,6 +1995,12 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): cls_nm = nm.id if from_imports is not None: sha1 = self.Gen.CallGenBase._lookup_mod_sha1(pool, from_imports, cls_nm, 0) + # 本文件顶层类(如自我引用 JsonValue | t.CPtr,或同文件内前向引用): + # register_file_classes 已登记"名字 → 本文件模块 SHA1"(规则 5.5 证据⑤同源), + # 用它前向声明——与 TPC 的同类前向引用同等处理。 + if sha1 is None: + if self.Gen.StructGen.is_file_class(pool, cls_nm) != 0: + sha1 = self.Gen.StructGen.get_file_module_sha1() else: return None if cls_nm is None or sha1 is None or sha1[0] == '\0': @@ -3619,10 +3625,16 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): self.Gen.TypeGenErr.fatal_type_error(node, "t.CPtr 模块未导入") inner_cptr_ty: llvmlite.LLVMType* = self.resolve_annotation_type(pool, sub.slice, imported_modules, from_imports, trans, depth + 1) if inner_cptr_ty is None: - # 元素类型依赖未就绪(如 t.CPtr[类] 中类尚未注册):返回 None 交上层多遍 - # 收敛,不在此 fatal 中断 Phase 1a 预注册(UINT 等只经 CTypedef 动态表解析, - # Phase 1a 无 vpi 注入时依赖 typedef 的类会被跳过)。与裸名 CArray 路径及 - # ClassGenDef 字段 pending 机制一致;真实类型错误由 Phase A 收敛检查暴露。 + # 元素类型依赖未就绪(如 t.CPtr[类]/rawptr[类] 中类尚未注册, + # rawptr[T] 经 builtins typedef 归一到本分支):优先**前向声明** + # 具名占位 {sha}.Class 并返回 Ptr(占位.Ty),保住类身份(对齐 + # X|t.CPtr 分支与 TPC);无法确定类名/模块时仍返回 None 交上层 + # 多遍收敛,不在此 fatal 中断 Phase 1a 预注册(UINT 等只经 + # CTypedef 动态表解析)。真实类型错误由 Phase A 收敛检查暴露。 + _fwd_cptr_ty: llvmlite.LLVMType* = self._forward_declare_ptr_from_node( + pool, sub.slice, imported_modules, from_imports) + if _fwd_cptr_ty is not None: + return _fwd_cptr_ty return None return llvmlite.Ptr(pool, inner_cptr_ty) if string.strcmp(arr_at.attr, "CArray") != 0: