// aggret_source_test — aggregate return-by-value from every ADDRESSABLE source // shape (#272), migrated from test/wcc/949_aggret_source_run.c. The N_RETURN // aggregate arms gated the source on N_IDENT || N_STRUCTLIT; every OTHER // aggregate rvalue (array literal, struct/array field N_DOT, array element // N_INDEX, deref *p) fell to the scalar-AX default = a silent truncation to the // first 8 bytes, and both stages emitted byte-IDENTICAL wrong asm (#263 pure // form — byte-id alone could NOT catch it). Each @test asserts every returned // member as a primitive (a dropped word fails); T2 keeps the cs==ww net. Also // covers the #272 commit-2 caller-half: receive into a GLOBAL ≤24B / >24B array. package aggret_source_test; type box_da = struct { a: [3]i64 }; type pair_sd = struct { a: i64, b: i64 }; type box_sd = struct { p: pair_sd }; type pair_sr = struct { a: i64, b: i64 }; let g2_idx: [2][3]i64 = [[1i64,2i64,3i64],[4i64,5i64,6i64]]; let g_recv: [3]i64 = [0i64, 0i64, 0i64]; let g_recv4: [4]i64 = [0i64,0i64,0i64,0i64]; fn mk_arrlit() [3]i64 = { return [1i64, 2i64, 3i64]; }; fn mk_da() [3]i64 = { let o: box_da = box_da { a = [10i64, 20i64, 30i64] }; return o.a; }; fn mk_idx() [3]i64 = { return g2_idx[1]; }; fn mk_deref(p: *[3]i64) [3]i64 = { return *p; }; fn mk_ident() [3]i64 = { let a: [3]i64 = [2i64, 4i64, 6i64]; return a; }; fn mk_deref4(p: *[4]i64) [4]i64 = { return *p; }; fn mk_sd() pair_sd = { let bx: box_sd = box_sd { p = pair_sd { a = 3i64, b = 4i64 } }; return bx.p; }; fn mk_sr(p: *pair_sr) pair_sr = { return *p; }; fn mk_grecv() [3]i64 = { return [4i64, 5i64, 6i64]; }; fn mk_grecv4(p: *[4]i64) [4]i64 = { return *p; }; @test fn arrlit() void = { let r: [3]i64 = mk_arrlit(); assert(r[0] == 1i64); assert(r[1] == 2i64); assert(r[2] == 3i64); }; @test fn dot_arrfield() void = { let r: [3]i64 = mk_da(); assert(r[0] == 10i64); assert(r[1] == 20i64); assert(r[2] == 30i64); }; @test fn index_elem() void = { let r: [3]i64 = mk_idx(); assert(r[0] == 4i64); assert(r[1] == 5i64); assert(r[2] == 6i64); }; @test fn deref() void = { let a: [3]i64 = [7i64, 8i64, 9i64]; let r: [3]i64 = mk_deref(&a); assert(r[0] == 7i64); assert(r[1] == 8i64); assert(r[2] == 9i64); }; @test fn ident_ctl() void = { let r: [3]i64 = mk_ident(); assert(r[0] == 2i64); assert(r[1] == 4i64); assert(r[2] == 6i64); }; @test fn deref_sret() void = { let a: [4]i64 = [1i64, 2i64, 3i64, 4i64]; let r: [4]i64 = mk_deref4(&a); assert(r[0] == 1i64); assert(r[1] == 2i64); assert(r[2] == 3i64); assert(r[3] == 4i64); }; @test fn struct_dot() void = { let r: pair_sd = mk_sd(); assert(r.a == 3i64); assert(r.b == 4i64); }; @test fn struct_deref() void = { let x: pair_sr = pair_sr { a = 5i64, b = 9i64 }; let r: pair_sr = mk_sr(&x); assert(r.a == 5i64); assert(r.b == 9i64); }; @test fn global_recv() void = { g_recv = mk_grecv(); assert(g_recv[0] == 4i64); assert(g_recv[1] == 5i64); assert(g_recv[2] == 6i64); }; @test fn global_recv_sret() void = { let a: [4]i64 = [4i64, 5i64, 6i64, 7i64]; g_recv4 = mk_grecv4(&a); assert(g_recv4[0] == 4i64); assert(g_recv4[1] == 5i64); assert(g_recv4[2] == 6i64); assert(g_recv4[3] == 7i64); };