len(str-or-slice-global) was wrong in both stages, differently. cstage's len() arm did a BP-relative slot load; localfind returns 0 for a global, so it emitted `MOVQ 8(BP),AX` — a bogus stack slot. wwstage's arm only handled locals; a global fell through to cgexpr, which loads the whole header and leaves AX=.ptr, not .len. Both stages now emit the global .len load — LEAQ name(SB),CX; MOVQ 8(CX),AX (.len field; header is ptr@0/len@8/cap@16). The LEAQ symbol routes through the post-#1 value mangle (cstage mahint c->cur_mod, wwstage emitsymnamehint c.curmod), not a raw name, so a private same-module same-leaf str global can't re-open the #1 collision. The local-str case is unchanged (control). Slice-global rows wait on #233 (cstage rejects `let g: []u8 = [...]` init); the str global proves the path. Byte-id-blind, so a committed runtime + cs==ww test (797) is the net.
242 KiB
242 KiB