Files
TransPyC/lib
TermiNexus 1903ed14f6 fix(HandlesClassDef): 类体字段与祖先字段重名 ⇒ fail-fast(消"继承段错位写错槽"与 split-brain)
类别:a 编译器缺陷(静默写错槽)+ c 源码违规(子类重复声明父类字段)的入口拦截。

判据(为什么重名必须终止,而不是容忍):
1. 子类同名声明会成为**自有字段**,与**同名继承项**在 class_members 里并存;跨模块侧
   的前置过滤器(HandlesImports._FlattenExt 前置段 :2516-2521)按"名字已在表内"过滤
   ——它本意只是防同一函数重入时重复前置,却把**同名继承项整条丢掉** ⇒ 继承段与
   struct body 的继承前缀失去一一对应:被丢项**之后**的继承字段表内下标整体前移 k,
   而查询侧回退路径用 `base + 表内下标`(FuncGen._get_member_offset)⇒ 落到类型完全
   不同的槽。现场:TypeGenCType 重复声明 5 个父类已有字段后,继承字段
   LastBuiltinsTypedefResult(下标 32)前移为 27 = CTypedefNameIdxBuilt(i32)
   ⇒ `self.Gen.TypeGenCType.LastBuiltinsTypedefResult = "t.CPtr"` 报
   "指针隐式转整数已禁止:不能把指针类型 i8* 赋给整数类型 i32"。
2. 父类方法按父类布局访问该名字的槽、子类方法按自有槽访问 ⇒ 同一变量 split-brain
   (一侧写、另一侧读),运行期静默错值。

实现:在类体自有字段收集段之后(:1047-1116)比对"自有字段名"与"沿 class_parents
传递收集到的全部祖先声明字段名",命中即 compile_error(含 文件:行:列、源码行、
祖先类名与逐字段明细,行号按 _line_offset 还原)+ sys.exit(1)。自有段用快照切分
(:903),祖先未就绪时视为无祖先 ⇒ 只少报不误报。

预检(避免新检查打断既有构建):用 TPC 自家解析器扫 App+includes 全部 .vp
(226 文件 / 382 类,口径=类体 AnnAssign + __init__ 带注解 self.x),既有代码
重名遮蔽数 = 0。

冒烟(合成样例,跑完删除):
  正例 class Child(Base) 重复声明 A ⇒ SystemExit code=1,报文给出 Child/A/Base/6:4;
  反例 Child 只声明新字段 C ⇒ 正常翻译。

配套:TransPyV 侧已撤销 TypeGenCType 的重复声明(0e5ebd0)。
2026-09-30 10:50:23 +08:00
..