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
..
2026-09-14 13:42:14 +08:00
2026-09-30 10:50:23 +08:00
2026-09-28 13:57:04 +08:00
2026-09-29 16:26:44 +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