An empty zero-length array diverged cs!=ww in asm (both ran correct=7): a [0]int global emitted a spurious DATAW main.X(SB),"", and a [0]int local reserved a $16 frame slot. cstage emits neither. wwstage-only, byte-id-only. The global DATAW emit is now gated on sz > 0 (skips the empty array). The local frame: localreserve dropped its sub-8 floor (if asz<8 asz=8) to mirror cstage's localslot formula (frame+sz+7)&~7 -- but that floor was MASKING slotsize(TY_VOID)=0 (a void local), which cstage defaults to 8B; removing the floor alone collided the zero-size void slot with a spilled param (a real miscompile -- 1132 self-compile hunks). So letslotsize now returns 8 for a void local, while empty-struct / [0]-array stay genuine 0. The frame formula is byte-id-neutral for every sz>=1 local (round8 already >= 8); only true zero-size cases change. cstage unchanged (w6c md5 unchanged). byte-id 990-997 8/8 (the full self-compile is what caught the void-local class); test/wcc/820 un-carves the #9 empty-[0] byte-id exclusion + adds void-local/local-[0] rows.
11 KiB
11 KiB