Post-#1, size(str) == size(slice) == 24. emitletdataw's str arm (~cgen.ww:2074) and slice arm (~cgen.ww:2139) were sequential `if`s gated on SIZE alone, so a bare 24-byte global matched BOTH and BOTH fired the no-rhs zero fallback — two `DATAW main.g` rows. cstage discriminates on type kind (let_isstr/let_isslice, cgen.c:1026/1036) and emits one; the link+run is correct either way, so the divergence was byte-id-visible only. Gate the two arms on the declared type kind via the new letdeclkind helper (d.lhs.type_, TY_NAMED-peeled — the resolvewalk-stamped type-expression node), mutually exclusive: a 24B global now hits one arm. Falls to the str arm when unstamped, where the zero-init bytes are identical, so byte-id holds for that case too. cstage already correct — no change. New test 686 (5 runtime rows + 5 byte-id rows) pins single-emit + cs==ww.
80 KiB
80 KiB