diff --git a/lib/core/LLVMCG/FuncGen.py b/lib/core/LLVMCG/FuncGen.py index 2238834..3919cf5 100644 --- a/lib/core/LLVMCG/FuncGen.py +++ b/lib/core/LLVMCG/FuncGen.py @@ -604,8 +604,23 @@ class FuncGenMixin: # _MemberSlotAccepts):表自洽(长度 == 字段区)时本路径不介入, # 对既有正确行为零变化;REnum 是 max-variant 镜像布局,不适用。 _FieldArea: int = len(_OffEls) - _BaseNow() + # 【前置校验·必需】尾部对齐只对"**缺父类前缀**"的表成立,判据是 + # 前缀数 == 父类 struct 的槽数(展平前缀就是父类整份布局,含其继承链)。 + # 缺了这条,一张**只含前若干字段**的残缺表会被锚到 body 末尾: + # 现场 `SubTypeGen.Gen = self`(Generator.vp:136)——TypeGenMixin 表 + # 仅 ['Gen'](且其声明类型是通用指针/未解析),body 41 槽 ⇒ 被锚到 + # 槽 40(= Specs,%TypeSpecArena*)⇒ 报"Generator* 不能隐式转 + # TypeSpecArena*"。父类 struct 不可得(跨模块未加载/opaque)时 + # **不介入**(保守落回配对 / 旧路径)。 + _ParentCls: str | None = self.class_parent.get(_ResolvedClass) + _ParentSt: Any = self.structs.get(_ParentCls) if _ParentCls else None + _ParentLen: int = -1 + if isinstance(_ParentSt, ir.IdentifiedStructType) and _ParentSt.elements is not None: + _ParentLen = len(_ParentSt.elements) if (len(_OffMembers) < _FieldArea - and not self._IsRenumLayoutClass(_ResolvedClass)): + and not self._IsRenumLayoutClass(_ResolvedClass) + and _ParentLen > 0 + and len(_OffEls) - len(_OffMembers) == _ParentLen): _TailBase: int = len(_OffEls) - len(_OffMembers) _TailOk: bool = _TailBase >= 0 _iT: int = 0