// sret_narrow_field_test — sret callee's narrow trailing-field copy (#33), // migrated from test/wcc/930_sret_narrow_field_run.c. A >24B struct that ends in // a narrow primitive (bool / u8 / i16 / i32) must copy exactly that field's // width; pre-fix cstage's N_IDENT word-copy tail used a slot-padded MOVQ that // swept the bordering @sretarg save byte into the trailing field. Each @test // asserts the trailing field round-trips as a primitive; T2 keeps the cs==ww net. // The mixed row interleaves bool + i32 + i64 after the 24B slice payload so each // trailing field must emit its declared width at its natural offset. package sret_narrow_field_test; type tbool = struct { a: i32, s: []u8, r: bool }; type tu8 = struct { a: i32, s: []u8, r: u8 }; type ti16 = struct { a: i32, s: []u8, r: i16 }; type ti32 = struct { a: i32, s: []u8, r: i32 }; type tmix = struct { s: []u8, r: bool, n: i32, k: i64 }; fn mk_bt() tbool = { let v: tbool; let z: []u8; v.s = z; v.a = 7; v.r = true; return v; }; fn mk_bf() tbool = { let v: tbool; let z: []u8; v.s = z; v.a = 9; v.r = false; return v; }; fn mk_u8() tu8 = { let v: tu8; let z: []u8; v.s = z; v.a = 0; v.r = 0xFFu8; return v; }; fn mk_i16() ti16 = { let v: ti16; let z: []u8; v.s = z; v.a = 0; v.r = -123i16; return v; }; fn mk_i32() ti32 = { let v: ti32; let z: []u8; v.s = z; v.a = 0; v.r = -424242; return v; }; fn mk_mix() tmix = { let v: tmix; let z: []u8; v.s = z; v.r = true; v.n = 1234567; v.k = 9876543210i64; return v; }; @test fn bool_true() void = { let x: tbool = mk_bt(); assert(x.a == 7); assert(x.r); }; @test fn bool_false() void = { let x: tbool = mk_bf(); assert(x.a == 9); assert(!x.r); }; @test fn u8_high_bit() void = { let x: tu8 = mk_u8(); assert(x.r == 0xFFu8); }; @test fn i16_negative() void = { let x: ti16 = mk_i16(); assert(x.r == -123i16); }; @test fn i32_negative() void = { let x: ti32 = mk_i32(); assert(x.r == -424242); }; @test fn mixed_narrow_after_slice() void = { let x: tmix = mk_mix(); assert(x.r); assert(x.n == 1234567); assert(x.k == 9876543210i64); };