wwstage cgen resolved struct LAYOUT by bare-leaf name (structlookup / structparamsize) at three caller-side sites — the by-value arg push (cgenutil), the let-receive copy width (cgenstmt), and the field-read offset (cgenexpr). Under a cross-module same-leaf collision (two modules each exporting a `pair`, 16B vs 24B) the name lookup first-matches the WRONG type, so the push dropped the 2nd eightbyte, the receive over-copied, and the field read the wrong offset. cstage type-keys off the stamped tinfo and is correct; this aligns wwstage UP to it (ww-only change). Route all three sites through the stamped node.type_ via a new structabisizetn(*tinfo) accessor (push + receive) and tichase(type_).fields (field-read, structlookupchain removed). One commit (rule-11 carve-out): the collision drives all three at once and no per-site fixture isolates, so it cannot bisect-split. A scoped slice of the #209/#211 name-keyed-cgen cluster retirement; the cgdot *struct-ptr/global and let-copy siblings stay name-keyed and are filed (#31). New table-driven test 793_xmod_struct_argpush_collide_run (4 scenarios: push/recv/field over 16B and 12B tails) reddens under a revert of the three cgen files. Full make test green (336 passed); make sizelint clean.
127 KiB
127 KiB