// oddstruct_byval_ret_test — by-value RETURN of a struct whose total size is an // "odd" sub-8 width {3,5,6,7} (a single INTEGER eightbyte in RAX), migrated from // test/wcc/949_oddstruct_byval_ret_run.c (#107). Pre-#107 cstage's N_LET receive // fell past every arm for these sizes and SILENTLY DROPPED the CALL (exit 0, // reading an uninit slot); wwstage's generic fallback emitted a single MOVQ, so // it was both a silent miscompile AND a gate-blind cs≠ww divergence. The #107 // fix mirrors wwstage's single-MOVQ receive. Each @test reads back the planted // fields as primitives (the whole eightbyte must reach the caller, not just AX's // low byte); T2 keeps the cs==ww net. Sizes 8/12/24 lock the existing // sized-tail / multi-word receive paths were not perturbed. package oddstruct_byval_ret_test; type T3 = struct { a: u8, b: u8, c: u8 }; type T5 = struct @packed { a: u8, b: u32 }; type T6 = struct { a: u16, b: u16, c: u16 }; type T7 = struct @packed { a: u8, b: u16, c: u32 }; type T8 = struct { a: i32, b: i32 }; type T12 = struct { a: i32, b: i32, c: i32 }; type T24 = struct { a: i64, b: i64, c: i64 }; fn mk3() T3 = { return T3 { a = 116u8, b = 22u8, c = 33u8 }; }; fn mk5() T5 = { return T5 { a = 9u8, b = 116u32 }; }; fn mk6() T6 = { return T6 { a = 9u16, b = 22u16, c = 116u16 }; }; fn mk7() T7 = { return T7 { a = 9u8, b = 22u16, c = 116u32 }; }; fn mk8() T8 = { return T8 { a = 116, b = 22 }; }; fn mk12() T12 = { return T12 { a = 9, b = 22, c = 116 }; }; fn mk24() T24 = { return T24 { a = 9i64, b = 22i64, c = 116i64 }; }; @test fn s3_u8x3_fieldA() void = { let r: T3 = mk3(); assert(r.a: i32 == 116); assert(r.b: i32 == 22); assert(r.c: i32 == 33); }; @test fn s5_packed_fieldB() void = { let r: T5 = mk5(); assert(r.a: i32 == 9); assert(r.b: i32 == 116); }; @test fn s6_u16x3_fieldC() void = { let r: T6 = mk6(); assert(r.a: i32 == 9); assert(r.b: i32 == 22); assert(r.c: i32 == 116); }; @test fn s7_packed_fieldC() void = { let r: T7 = mk7(); assert(r.a: i32 == 9); assert(r.b: i32 == 22); assert(r.c: i32 == 116); }; @test fn s8_i32x2_fieldA() void = { let r: T8 = mk8(); assert(r.a == 116); assert(r.b == 22); }; @test fn s12_i32x3_fieldC() void = { let r: T12 = mk12(); assert(r.a == 9); assert(r.b == 22); assert(r.c == 116); }; @test fn s24_i64x3_fieldC() void = { let r: T24 = mk24(); assert(r.a == 9i64); assert(r.b == 22i64); assert(r.c == 116i64); };