TermiNexus
a92b38e826
fix(Translator): 文件级类名预登记覆盖三种 _declare_only 模式(修 Phase 1a 的类型实参裸名分裂)
类别:a(编译器缺陷)
现象:编译 includes/ast/base.vp 报
ERROR [TypeGen]: [类型实参归属] 裸类名 'AST' 本次保留裸名(可能与带前缀形式分裂):
entry_present=0 entry.Ty=None cur_def_mod=d1ed020479454541 cur_def_cls=ASTFlag
is_module_class=0 find_struct_by_module=0 from_imports=*:stdint TokOp:ast.tokens
file=./includes/ast/base.vp
根因链(逐条对应报文):
报文来自 TypeGenResolve._norm_type_arg_name 规则 5.5:五类证据全落空即返回裸名。
- ④ entry_present=0 / ① find_struct_by_module=0:'AST' 尚未 register_struct
(AST 在 base.vp:313;本次归一化发生在更早的模块级函数签名处)。
- ② is_module_class=0:'AST' 的 mark_module_class 尚未执行(类定义入口按 AST 顺序走)。
- ③ cur_def_cls=ASTFlag:CurDefClassName 停在更早的 enum ASTFlag(类结束后不复位),
与裸名 'AST' 逐字不同 ⇒ ③ 不适用(该值同时证明本次不是"泛型特化平移窗口")。
- ⑤ is_file_class + get_file_module_sha1 本应兜住"本文件自己声明的类名",但
register_file_classes 的调用被 `if self._declare_only == 0:` 整块门住;而本次是
Phase 1a(_declare_only == 1)——TranslatorGenMixin 在 1a 会调用
_prescan_funcdef_signatures **预解析模块级函数签名**(含注解归一化)⇒ 证据⑤ 恒落空。
⇒ 该实参特化名被冻结成**裸名**版本,与 1b 全量翻译期解析出的带 SHA1 形式分裂成两个
特化结构体名,后续以"非基本类型指针不可隐式转换"报出(同类旧现场 base.vp:359)。
修复:把 GenApi.register_file_classes(pool, self.ModuleSha1, tree) 从 `_declare_only == 0`
块内提到 _translate_module_level 开头,三种模式(1a=1 / 1a-pre=2 / 全量=0)共用。
该登记只依赖 tree + 本文件模块 SHA1,与导入、类定义窗口、类定义顺序都无关;
reset_visible_structs 在每个模式的 translate 之前调用(BuildPipeline:226 /
Phase1Main:643),FileClassNames 与键同池创建,无悬空风险。未放宽任何 fail-fast。