TermiNexus
3bc3c48dee
fix(tpc): 注解解析补齐「有类定义 ⇒ 是类」——模块别名占裸名导致类引用退化成 i8**
类别:a 编译器缺陷(根因修复)。
现场:TransPyV Generator.vp:200 `self.ExprGenFstr = SubExprGenFstr` 报
「指针隐式转换已禁止(层数不同):%\"a7b68c79f39cb4d3.ExprGenFstr\"* → i8**」,
成员槽来源明细显示:class_members[Generator] 下标 11 声明槽类型正确
(%\"a7b68c79f39cb4d3.ExprGenFstr\"*),但布局 struct
'47382dc8277c9d28.Generator' 的 elements[11]=i8**(set_body 只能设一次 →
错布局被永久冻结)。
已核对 temp/47382dc8277c9d28.stub.ll:declare 侧该槽逐字正确
(%"a7b68c79f39cb4d3.ExprGenFstr"*),Generator.vp 46 个字段全写作
`rawptr[X.X]`;.vpi 里注解文本也是 `rawptr[ExprGenFstr.ExprGenFstr]`。
真根因:`import lib.core.Gen.Expr.ExprGenFstr as ExprGenFstr` 的**模块别名**与
模块内 `class ExprGenFstr` 同名,平坦符号表(无前缀)一个名字只留一个条目 ⇒
TypeAnnotationResolver._from_node_attribute / _from_node_name 命中别名条目时
Copy 出「无基类型」的空 CTypeInfo ⇒ rawptr 下标分支按
`PtrCount = slice + rawptr(1)` 得 void 指针链(i8*/i8**),类身份尽失;
该值经成员提取(SymbolExtractor._collect_members → CTypeInfo.FromNode)
写进跨模块共享符号表,再由 FuncGen.setup_from_symbol_table 建出 struct body
→ 槽被冻结成 i8**。哪一字段中招取决于别名/类条目谁最后写入平坦表,
故三次构建分别命中 TypeGenCDef / ExprGenFstr(时变、非固定字段)。
修复:新增 TypeAnnotationResolver._RecoverTypeFromNamespaces —— 平坦条目
**不是类型**(模块别名/函数/变量/define/枚举成员占位)时,按 _namespaces
找回同名 typedef / 结构体(struct·renum·exception)/ 枚举条目,与
LLVMTypeMapper._resolve_name 既有「同名冲突找回类型」分支逐条同构(同一条
规则源)。挂接三处:_from_node_attribute 的条目分支与无条目分支、
_from_node_name 的条目分支。
口径细节:结构体表示与本文件既有 promotion 逐字一致
(BaseType=CStruct(name) + IsStruct + Name,**不加** PtrCount)——
rawptr[X] 的层数由 rawptr 分支自己 +1,此处再加会得 X**。
2026-09-29 12:44:03 +08:00
..
2026-09-14 13:42:14 +08:00
2026-09-29 12:44:03 +08:00
2026-09-28 13:57:04 +08:00
2026-09-28 18:25:57 +08:00
2026-09-26 19:27:22 +08:00
2026-09-26 19:27:22 +08:00
2026-09-12 11:51:42 +08:00
2026-09-28 13:49:28 +08:00
2026-09-26 19:27:22 +08:00
2026-08-17 09:36:38 +08:00
2026-08-17 09:36:38 +08:00