Files
ViperC/App
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。
2026-09-30 17:43:15 +08:00
..