// glob_slice_field_test — a SLICE field of a module-GLOBAL struct, assigned // with `g.field = `, must store the full {ptr,len,cap} 24B header (not // just {ptr}), migrated from test/wcc/989_globslicefield_run.c (F8-c1, #35). // The wwstage single-dot global-struct field-assign gated the 3-word DX store // on isstrtype ONLY, so a non-str slice field fell to the 1-word scalar store // and silently DROPPED .len+.cap; the fix widens to isstrtype||isslicetype // (align UP to cstage's TY_STR||TY_SLICE). cs==ww held byte-id-blind, so a // behavioral @test is the net. A dropped .len/.cap reads back 0 (a fresh global // is zeroed), so len()/.cap directly catch it; glob_off_len pins the non-zero // field offset; the str/scalar rows are regression controls for the pre-existing // arm and the 1-word store the slice arm must not steal. package glob_slice_field_test; type box1 = struct { sl: []i64 }; type box2 = struct { pad: i64, sl: []i64 }; type box3 = struct { name: str }; type box4 = struct { n: i64 }; let g1: box1; let g2: box2; let g3: box3; let g4: box4; @test fn glob_slice_len() void = { let b: [4]i64 = [10, 11, 12, 13]; g1.sl = b[0:3]; assert(len(g1.sl): i32 == 3); }; @test fn glob_slice_cap() void = { let b: [4]i64 = [10, 11, 12, 13]; g1.sl = b[0:3]; assert(g1.sl.cap: i32 == 4); }; @test fn glob_off_len() void = { // slice field at a NON-ZERO field offset (pad@0, sl@8) pins the // DX+foff+8 header store. let b: [4]i64 = [10, 11, 12, 13]; g2.pad = 99; g2.sl = b[0:2]; assert(g2.pad == 99); assert(len(g2.sl): i32 == 2); }; @test fn glob_str_len() void = { // str field on a global struct — the pre-existing isstrtype arm; a // regression pin that the widened gate keeps correct. g3.name = "hello"; assert(len(g3.name): i32 == 5); }; @test fn glob_scalar_n() void = { // scalar field — the generic 1-word store the slice arm must not divert. g4.n = 7; assert(g4.n: i32 == 7); };