From 934f19f884d45212dded646d323e2285391f0292 Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Sat, 8 Aug 2026 15:14:03 +0900 Subject: [PATCH] test: own the 926/929/671 run legs as corpus fixtures The three carriers retired this session moved their compile/byte-id/ asm-marker legs to test/asm/tagsret_test.ww, test/asm/memarg_test.ww, and test/misc/packedwwi_test.ww, and audit-assigned their run-exit legs to corpus fixtures that were never created. Create them, sources byte-faithful to the carriers' row tables; every fixture also rides the corpus byte-id sweep, which stayed green (no new DATABYTEID pin). 926_tagged_sret_run.c run rows (all exit 0): wide_lit_roundtrip -> r926_sret_wide_lit_roundtrip wide_local_roundtrip -> r926_sret_wide_local_roundtrip wide_assign_receive -> r926_sret_wide_assign_receive wide_match_scrutinee -> r926_sret_wide_match_scrutinee wide_forward_exact -> r926_sret_wide_forward_exact wide_str_error_variant -> r926_sret_wide_str_error_variant wide_multicall -> r926_sret_wide_multicall wide_bare_return_void -> r926_sret_wide_bare_return_void wide_s4_repro -> r926_sret_wide_s4_repro errno_shaped_tail_read -> r926_sret_errno_shaped_tail_read boundary_s3_register -> r926_sret_boundary_s3_register boundary_str_nomem_register -> r926_sret_boundary_str_nomem_register wide_discard_stmt -> r926_sret_wide_discard_stmt (the seven buildfail rows stay with r926_sret_reject_*.) 929_tagged_memarg_run.c run rows (exit 0 unless noted): mem56_ident_allvariants -> r929_memarg_mem56_ident_allvariants mem64_ident_lateword -> r929_memarg_mem64_ident_lateword mem56_widen_concrete -> r929_memarg_mem56_widen_concrete mem56_subset_remap -> r929_memarg_mem56_subset_remap mem56_srcshapes -> r929_memarg_mem56_srcshapes mem56_mixed_orders -> r929_memarg_mem56_mixed_orders mem56_call_in_loop -> r929_memarg_mem56_call_in_loop mem56_twomem -> r929_memarg_mem56_twomem mem56_inst_shape -> r929_memarg_mem56_inst_shape mem56_elem_source -> r929_memarg_mem56_elem_source mem56_elem_deref_spine -> r929_memarg_mem56_elem_deref_spine mem56_elem_nested_spine -> r929_memarg_mem56_elem_nested_spine mem56_elem_mixed_regs -> r929_memarg_mem56_elem_mixed_regs mem56_elem_callidx_twomem -> r929_memarg_mem56_elem_callidx_twomem mem56_elem_global_slice -> r929_memarg_mem56_elem_global_slice boundary48_register -> r929_memarg_boundary48_register global_uninit_memarg_src -> r929_memarg_global_uninit_memarg_src (91) memarg_idcast_peeled -> r929_memarg_idcast_peeled (the four buildfail rows stay with r929_memarg_reject_*.) 671_struct_packed.c value rows (exit = layout value): unpacked_size -> r671_unpacked_size (16) packed_size -> r671_packed_size (9) packed_off_b -> r671_packed_off_b (1) unpacked_off_b -> r671_unpacked_off_b (8) packed_align -> r671_packed_align (8) packed5_size -> r671_packed5_size (5) packed5_off_b -> r671_packed5_off_b (1) p3_packed_size -> r671_p3_packed_size (4) p3_packed_off_c -> r671_p3_packed_off_c (3) p3_unpacked_size -> r671_p3_unpacked_size (6) field_roundtrip -> r671_field_roundtrip (6) arr_stride_size -> r671_arr_stride_size (15) arr_stride_run -> r671_arr_stride_run (33) byval_arg -> r671_byval_arg (107) frame_offset -> r671_frame_offset (20) Owner-cited, no fixture: wwi_roundtrip needs a real multi-file -I tree (a single-file two-package form emits no .wwi), owned by test/misc/packedwwi_test.ww wwiroundtrip (exit 91 on both drivers); identity_reject is stage-asymmetric, owned there as identityreject. Pins: corpuscount 1680 -> 1726, runexitcount 1109 -> 1155, nativecount 3360 -> 3452, corpushash refreshed. --- internal/wwfixture/types.ww | 8 ++-- test/wcc/data/r671_arr_stride_run/case.ww | 9 ++++ test/wcc/data/r671_arr_stride_size/case.ww | 5 +++ test/wcc/data/r671_byval_arg/case.ww | 9 ++++ test/wcc/data/r671_field_roundtrip/case.ww | 8 ++++ test/wcc/data/r671_frame_offset/case.ww | 10 +++++ test/wcc/data/r671_p3_packed_off_c/case.ww | 8 ++++ test/wcc/data/r671_p3_packed_size/case.ww | 5 +++ test/wcc/data/r671_p3_unpacked_size/case.ww | 5 +++ test/wcc/data/r671_packed5_off_b/case.ww | 8 ++++ test/wcc/data/r671_packed5_size/case.ww | 5 +++ test/wcc/data/r671_packed_align/case.ww | 5 +++ test/wcc/data/r671_packed_off_b/case.ww | 8 ++++ test/wcc/data/r671_packed_size/case.ww | 5 +++ test/wcc/data/r671_unpacked_off_b/case.ww | 8 ++++ test/wcc/data/r671_unpacked_size/case.ww | 5 +++ .../r926_sret_boundary_s3_register/case.ww | 19 +++++++++ .../case.ww | 20 +++++++++ .../r926_sret_errno_shaped_tail_read/case.ww | 24 +++++++++++ .../r926_sret_wide_assign_receive/case.ww | 24 +++++++++++ .../r926_sret_wide_bare_return_void/case.ww | 19 +++++++++ .../data/r926_sret_wide_discard_stmt/case.ww | 17 ++++++++ .../data/r926_sret_wide_forward_exact/case.ww | 21 ++++++++++ .../data/r926_sret_wide_lit_roundtrip/case.ww | 23 ++++++++++ .../r926_sret_wide_local_roundtrip/case.ww | 23 ++++++++++ .../r926_sret_wide_match_scrutinee/case.ww | 18 ++++++++ .../wcc/data/r926_sret_wide_multicall/case.ww | 25 +++++++++++ test/wcc/data/r926_sret_wide_s4_repro/case.ww | 22 ++++++++++ .../r926_sret_wide_str_error_variant/case.ww | 21 ++++++++++ .../r929_memarg_boundary48_register/case.ww | 26 ++++++++++++ .../case.ww | 28 +++++++++++++ .../data/r929_memarg_idcast_peeled/case.ww | 29 +++++++++++++ .../r929_memarg_mem56_call_in_loop/case.ww | 30 +++++++++++++ .../case.ww | 42 +++++++++++++++++++ .../case.ww | 34 +++++++++++++++ .../case.ww | 33 +++++++++++++++ .../r929_memarg_mem56_elem_mixed_regs/case.ww | 36 ++++++++++++++++ .../case.ww | 40 ++++++++++++++++++ .../r929_memarg_mem56_elem_source/case.ww | 38 +++++++++++++++++ .../case.ww | 36 ++++++++++++++++ .../data/r929_memarg_mem56_inst_shape/case.ww | 28 +++++++++++++ .../r929_memarg_mem56_mixed_orders/case.ww | 34 +++++++++++++++ .../data/r929_memarg_mem56_srcshapes/case.ww | 40 ++++++++++++++++++ .../r929_memarg_mem56_subset_remap/case.ww | 32 ++++++++++++++ .../wcc/data/r929_memarg_mem56_twomem/case.ww | 33 +++++++++++++++ .../r929_memarg_mem56_widen_concrete/case.ww | 33 +++++++++++++++ .../r929_memarg_mem64_ident_lateword/case.ww | 30 +++++++++++++ 47 files changed, 985 insertions(+), 4 deletions(-) create mode 100644 test/wcc/data/r671_arr_stride_run/case.ww create mode 100644 test/wcc/data/r671_arr_stride_size/case.ww create mode 100644 test/wcc/data/r671_byval_arg/case.ww create mode 100644 test/wcc/data/r671_field_roundtrip/case.ww create mode 100644 test/wcc/data/r671_frame_offset/case.ww create mode 100644 test/wcc/data/r671_p3_packed_off_c/case.ww create mode 100644 test/wcc/data/r671_p3_packed_size/case.ww create mode 100644 test/wcc/data/r671_p3_unpacked_size/case.ww create mode 100644 test/wcc/data/r671_packed5_off_b/case.ww create mode 100644 test/wcc/data/r671_packed5_size/case.ww create mode 100644 test/wcc/data/r671_packed_align/case.ww create mode 100644 test/wcc/data/r671_packed_off_b/case.ww create mode 100644 test/wcc/data/r671_packed_size/case.ww create mode 100644 test/wcc/data/r671_unpacked_off_b/case.ww create mode 100644 test/wcc/data/r671_unpacked_size/case.ww create mode 100644 test/wcc/data/r926_sret_boundary_s3_register/case.ww create mode 100644 test/wcc/data/r926_sret_boundary_str_nomem_register/case.ww create mode 100644 test/wcc/data/r926_sret_errno_shaped_tail_read/case.ww create mode 100644 test/wcc/data/r926_sret_wide_assign_receive/case.ww create mode 100644 test/wcc/data/r926_sret_wide_bare_return_void/case.ww create mode 100644 test/wcc/data/r926_sret_wide_discard_stmt/case.ww create mode 100644 test/wcc/data/r926_sret_wide_forward_exact/case.ww create mode 100644 test/wcc/data/r926_sret_wide_lit_roundtrip/case.ww create mode 100644 test/wcc/data/r926_sret_wide_local_roundtrip/case.ww create mode 100644 test/wcc/data/r926_sret_wide_match_scrutinee/case.ww create mode 100644 test/wcc/data/r926_sret_wide_multicall/case.ww create mode 100644 test/wcc/data/r926_sret_wide_s4_repro/case.ww create mode 100644 test/wcc/data/r926_sret_wide_str_error_variant/case.ww create mode 100644 test/wcc/data/r929_memarg_boundary48_register/case.ww create mode 100644 test/wcc/data/r929_memarg_global_uninit_memarg_src/case.ww create mode 100644 test/wcc/data/r929_memarg_idcast_peeled/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_call_in_loop/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_elem_callidx_twomem/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_elem_deref_spine/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_elem_global_slice/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_elem_mixed_regs/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_elem_nested_spine/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_elem_source/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_ident_allvariants/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_inst_shape/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_mixed_orders/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_srcshapes/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_subset_remap/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_twomem/case.ww create mode 100644 test/wcc/data/r929_memarg_mem56_widen_concrete/case.ww create mode 100644 test/wcc/data/r929_memarg_mem64_ident_lateword/case.ww diff --git a/internal/wwfixture/types.ww b/internal/wwfixture/types.ww index dfb8a6c1..6f6c2d15 100644 --- a/internal/wwfixture/types.ww +++ b/internal/wwfixture/types.ww @@ -1,13 +1,13 @@ package wwfixture; def protocolversion: i32 = 1; -def corpuscount: i32 = 1680; +def corpuscount: i32 = 1726; def errorcount: i32 = 343; def compilecount: i32 = 19; def runcount: i32 = 209; -def runexitcount: i32 = 1109; -def nativecount: i32 = 3360; -def corpushash: str = "bfc1df1f29f60a79930227b1b93ad01fcbed23a150c3269f1f6befd90e0604d1"; +def runexitcount: i32 = 1155; +def nativecount: i32 = 3452; +def corpushash: str = "870ba4f5140ef331e9effb7cf21fcebe69b5f29d1177cf158e6a1b6db71e9d28"; type directive = enum i32 { ERROR = 0, diff --git a/test/wcc/data/r671_arr_stride_run/case.ww b/test/wcc/data/r671_arr_stride_run/case.ww new file mode 100644 index 00000000..b24be412 --- /dev/null +++ b/test/wcc/data/r671_arr_stride_run/case.ww @@ -0,0 +1,9 @@ +//ww:run-exit 33 +// Run leg of the retired 671_struct_packed.c row arr_stride_run. +package main; +type P = struct @packed { a: u8, b: u32 }; +export fn main() i32 = { + let t: [3]P; + t[0].b = 11u32; t[1].b = 22u32; t[2].b = 33u32; + return t[2].b: i32; +}; diff --git a/test/wcc/data/r671_arr_stride_size/case.ww b/test/wcc/data/r671_arr_stride_size/case.ww new file mode 100644 index 00000000..ff62211b --- /dev/null +++ b/test/wcc/data/r671_arr_stride_size/case.ww @@ -0,0 +1,5 @@ +//ww:run-exit 15 +// Run leg of the retired 671_struct_packed.c row arr_stride_size. +package main; +type P = struct @packed { a: u8, b: u32 }; +export fn main() i32 = { return size([3]P): i32; }; diff --git a/test/wcc/data/r671_byval_arg/case.ww b/test/wcc/data/r671_byval_arg/case.ww new file mode 100644 index 00000000..8193e5da --- /dev/null +++ b/test/wcc/data/r671_byval_arg/case.ww @@ -0,0 +1,9 @@ +//ww:run-exit 107 +// Run leg of the retired 671_struct_packed.c row byval_arg. +package main; +type Q = struct @packed { a: u8, b: u32 }; +fn useq(q: Q) i32 = { return (q.a: i32) + (q.b: i32); }; +export fn main() i32 = { + let q: Q = Q { a = 7u8, b = 100u32 }; + return useq(q); +}; diff --git a/test/wcc/data/r671_field_roundtrip/case.ww b/test/wcc/data/r671_field_roundtrip/case.ww new file mode 100644 index 00000000..c3215dc6 --- /dev/null +++ b/test/wcc/data/r671_field_roundtrip/case.ww @@ -0,0 +1,8 @@ +//ww:run-exit 6 +// Run leg of the retired 671_struct_packed.c row field_roundtrip. +package main; +type P = struct @packed { a: u8, b: u16, c: u8 }; +export fn main() i32 = { + let p: P = P { a = 1u8, b = 2u16, c = 3u8 }; + return (p.a: i32) + (p.b: i32) + (p.c: i32); +}; diff --git a/test/wcc/data/r671_frame_offset/case.ww b/test/wcc/data/r671_frame_offset/case.ww new file mode 100644 index 00000000..a8474c40 --- /dev/null +++ b/test/wcc/data/r671_frame_offset/case.ww @@ -0,0 +1,10 @@ +//ww:run-exit 20 +// Run leg of the retired 671_struct_packed.c row frame_offset. +package main; +type Q = struct @packed { a: u8, b: u32 }; +export fn main() i32 = { + let p: Q = Q { a = 1u8, b = 5u32 }; + let after: i32 = 77; + p.b = 200u32; + return (p.b: i32) + after - (p.a: i32); +}; diff --git a/test/wcc/data/r671_p3_packed_off_c/case.ww b/test/wcc/data/r671_p3_packed_off_c/case.ww new file mode 100644 index 00000000..be93b72e --- /dev/null +++ b/test/wcc/data/r671_p3_packed_off_c/case.ww @@ -0,0 +1,8 @@ +//ww:run-exit 3 +// Run leg of the retired 671_struct_packed.c row p3_packed_off_c. +package main; +type P = struct @packed { a: u8, b: u16, c: u8 }; +export fn main() i32 = { + let p: P = P { a = 1u8, b = 2u16, c = 3u8 }; + return offset(p.c): i32; +}; diff --git a/test/wcc/data/r671_p3_packed_size/case.ww b/test/wcc/data/r671_p3_packed_size/case.ww new file mode 100644 index 00000000..9432e2eb --- /dev/null +++ b/test/wcc/data/r671_p3_packed_size/case.ww @@ -0,0 +1,5 @@ +//ww:run-exit 4 +// Run leg of the retired 671_struct_packed.c row p3_packed_size. +package main; +type P = struct @packed { a: u8, b: u16, c: u8 }; +export fn main() i32 = { return size(P): i32; }; diff --git a/test/wcc/data/r671_p3_unpacked_size/case.ww b/test/wcc/data/r671_p3_unpacked_size/case.ww new file mode 100644 index 00000000..92da78b3 --- /dev/null +++ b/test/wcc/data/r671_p3_unpacked_size/case.ww @@ -0,0 +1,5 @@ +//ww:run-exit 6 +// Run leg of the retired 671_struct_packed.c row p3_unpacked_size. +package main; +type U = struct { a: u8, b: u16, c: u8 }; +export fn main() i32 = { return size(U): i32; }; diff --git a/test/wcc/data/r671_packed5_off_b/case.ww b/test/wcc/data/r671_packed5_off_b/case.ww new file mode 100644 index 00000000..80afe5ea --- /dev/null +++ b/test/wcc/data/r671_packed5_off_b/case.ww @@ -0,0 +1,8 @@ +//ww:run-exit 1 +// Run leg of the retired 671_struct_packed.c row packed5_off_b. +package main; +type P = struct @packed { a: u8, b: u32 }; +export fn main() i32 = { + let p: P = P { a = 1u8, b = 2u32 }; + return offset(p.b): i32; +}; diff --git a/test/wcc/data/r671_packed5_size/case.ww b/test/wcc/data/r671_packed5_size/case.ww new file mode 100644 index 00000000..68386279 --- /dev/null +++ b/test/wcc/data/r671_packed5_size/case.ww @@ -0,0 +1,5 @@ +//ww:run-exit 5 +// Run leg of the retired 671_struct_packed.c row packed5_size. +package main; +type P = struct @packed { a: u8, b: u32 }; +export fn main() i32 = { return size(P): i32; }; diff --git a/test/wcc/data/r671_packed_align/case.ww b/test/wcc/data/r671_packed_align/case.ww new file mode 100644 index 00000000..88a8ecbe --- /dev/null +++ b/test/wcc/data/r671_packed_align/case.ww @@ -0,0 +1,5 @@ +//ww:run-exit 8 +// Run leg of the retired 671_struct_packed.c row packed_align. +package main; +type P = struct @packed { a: u8, b: u64 }; +export fn main() i32 = { return align(P): i32; }; diff --git a/test/wcc/data/r671_packed_off_b/case.ww b/test/wcc/data/r671_packed_off_b/case.ww new file mode 100644 index 00000000..9cd3e37e --- /dev/null +++ b/test/wcc/data/r671_packed_off_b/case.ww @@ -0,0 +1,8 @@ +//ww:run-exit 1 +// Run leg of the retired 671_struct_packed.c row packed_off_b. +package main; +type P = struct @packed { a: u8, b: u64 }; +export fn main() i32 = { + let p: P = P { a = 1u8, b = 2u64 }; + return offset(p.b): i32; +}; diff --git a/test/wcc/data/r671_packed_size/case.ww b/test/wcc/data/r671_packed_size/case.ww new file mode 100644 index 00000000..6a1e991a --- /dev/null +++ b/test/wcc/data/r671_packed_size/case.ww @@ -0,0 +1,5 @@ +//ww:run-exit 9 +// Run leg of the retired 671_struct_packed.c row packed_size. +package main; +type P = struct @packed { a: u8, b: u64 }; +export fn main() i32 = { return size(P): i32; }; diff --git a/test/wcc/data/r671_unpacked_off_b/case.ww b/test/wcc/data/r671_unpacked_off_b/case.ww new file mode 100644 index 00000000..8b86c03e --- /dev/null +++ b/test/wcc/data/r671_unpacked_off_b/case.ww @@ -0,0 +1,8 @@ +//ww:run-exit 8 +// Run leg of the retired 671_struct_packed.c row unpacked_off_b. +package main; +type U = struct { a: u8, b: u64 }; +export fn main() i32 = { + let u: U = U { a = 1u8, b = 2u64 }; + return offset(u.b): i32; +}; diff --git a/test/wcc/data/r671_unpacked_size/case.ww b/test/wcc/data/r671_unpacked_size/case.ww new file mode 100644 index 00000000..4cf863a7 --- /dev/null +++ b/test/wcc/data/r671_unpacked_size/case.ww @@ -0,0 +1,5 @@ +//ww:run-exit 16 +// Run leg of the retired 671_struct_packed.c row unpacked_size. +package main; +type U = struct { a: u8, b: u64 }; +export fn main() i32 = { return size(U): i32; }; diff --git a/test/wcc/data/r926_sret_boundary_s3_register/case.ww b/test/wcc/data/r926_sret_boundary_s3_register/case.ww new file mode 100644 index 00000000..8f38e64b --- /dev/null +++ b/test/wcc/data/r926_sret_boundary_s3_register/case.ww @@ -0,0 +1,19 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row boundary_s3_register. +package main; +type s3 = struct { a: i64, b: i64, c: i64 }; +fn mk(ok: bool) (s3 | bool) = { + if (!ok) { return false; }; + return s3 { a = 7, b = 8, c = 9 }; +}; +export fn main() i32 = { + match (mk(true)) { + case let v: s3 => { if (v.c != 9) { return 1; }; }; + case let b: bool => return 2; + }; + match (mk(false)) { + case let v: s3 => return 3; + case let b: bool => { if (b) { return 4; }; }; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_boundary_str_nomem_register/case.ww b/test/wcc/data/r926_sret_boundary_str_nomem_register/case.ww new file mode 100644 index 00000000..c5967c46 --- /dev/null +++ b/test/wcc/data/r926_sret_boundary_str_nomem_register/case.ww @@ -0,0 +1,20 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row boundary_str_nomem_register. +package main; +type nomem = !void; +fn pick(ok: bool) (str | nomem) = { + if (ok) { return "hello"; }; + let nm: nomem; + return nm; +}; +export fn main() i32 = { + match (pick(true)) { + case let s: str => { if (s.len != 5) { return 1; }; }; + case nomem => return 2; + }; + match (pick(false)) { + case let s: str => return 3; + case nomem => { }; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_errno_shaped_tail_read/case.ww b/test/wcc/data/r926_sret_errno_shaped_tail_read/case.ww new file mode 100644 index 00000000..42ce8091 --- /dev/null +++ b/test/wcc/data/r926_sret_errno_shaped_tail_read/case.ww @@ -0,0 +1,24 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row errno_shaped_tail_read. +package main; +type opq = struct { h: i64, data: [3]u64 }; +fn wrap(e: i64) (opq | bool) = { + let o: opq; + o.h = 7; + o.data[0] = e: u64; + o.data[1] = 1111u64; + o.data[2] = 2222u64; + return o; +}; +export fn main() i32 = { + match (wrap(5)) { + case let o: opq => { + if (o.data[2] != 2222u64) { return 1; }; + if (o.data[1] != 1111u64) { return 2; }; + if (o.data[0] != 5u64) { return 3; }; + if (o.h != 7) { return 4; }; + }; + case let b: bool => return 5; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_assign_receive/case.ww b/test/wcc/data/r926_sret_wide_assign_receive/case.ww new file mode 100644 index 00000000..3d0c4a7f --- /dev/null +++ b/test/wcc/data/r926_sret_wide_assign_receive/case.ww @@ -0,0 +1,24 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_assign_receive. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn mk(b: []u8, n: i64) (wide | oops | nomem) = { + return wide { xs = b, ys = b, n = n }; +}; +export fn main() i32 = { + let canary1: i64 = 111; + let buf: [4]u8 = [1u8, 2u8, 3u8, 4u8]; + let r: (wide | oops | nomem) = mk(buf[0:4], 5); + let canary2: i64 = 222; + r = mk(buf[0:4], 6); + if (canary1 != 111) { return 21; }; + if (canary2 != 222) { return 22; }; + match (r) { + case let w: wide => { if (w.n != 6) { return 1; }; }; + case let e: oops => return 13; + case nomem => return 14; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_bare_return_void/case.ww b/test/wcc/data/r926_sret_wide_bare_return_void/case.ww new file mode 100644 index 00000000..e5d78420 --- /dev/null +++ b/test/wcc/data/r926_sret_wide_bare_return_void/case.ww @@ -0,0 +1,19 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_bare_return_void. +package main; +type s4 = struct { a: i64, b: i64, c: i64, d: i64 }; +fn maybe(n: i64) (s4 | void) = { + if (n == 0) { return; }; + return s4 { a = 1, b = 2, c = 3, d = n }; +}; +export fn main() i32 = { + match (maybe(0)) { + case let v: s4 => return 1; + case void => { }; + }; + match (maybe(5)) { + case let v: s4 => { if (v.d != 5) { return 2; }; }; + case void => return 3; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_discard_stmt/case.ww b/test/wcc/data/r926_sret_wide_discard_stmt/case.ww new file mode 100644 index 00000000..ac2a272d --- /dev/null +++ b/test/wcc/data/r926_sret_wide_discard_stmt/case.ww @@ -0,0 +1,17 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_discard_stmt. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn mk(b: []u8) (wide | oops | nomem) = { + return wide { xs = b, ys = b, n = 1 }; +}; +export fn main() i32 = { + let canary: i64 = 777; + let buf: [4]u8 = [1u8, 2u8, 3u8, 4u8]; + mk(buf[0:4]); + mk(buf[0:4]); + if (canary != 777) { return 1; }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_forward_exact/case.ww b/test/wcc/data/r926_sret_wide_forward_exact/case.ww new file mode 100644 index 00000000..01aedd6d --- /dev/null +++ b/test/wcc/data/r926_sret_wide_forward_exact/case.ww @@ -0,0 +1,21 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_forward_exact. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn inner(b: []u8, n: i64) (wide | oops | nomem) = { + return wide { xs = b, ys = b, n = n }; +}; +fn outer(b: []u8, n: i64) (wide | oops | nomem) = { + return inner(b, n); +}; +export fn main() i32 = { + let buf: [4]u8 = [1u8, 2u8, 3u8, 4u8]; + match (outer(buf[0:4], 11)) { + case let w: wide => { if (w.n != 11) { return 1; }; }; + case let e: oops => return 13; + case nomem => return 14; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_lit_roundtrip/case.ww b/test/wcc/data/r926_sret_wide_lit_roundtrip/case.ww new file mode 100644 index 00000000..b11ef0ef --- /dev/null +++ b/test/wcc/data/r926_sret_wide_lit_roundtrip/case.ww @@ -0,0 +1,23 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_lit_roundtrip. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn mk(b: []u8, n: i64) (wide | oops | nomem) = { + return wide { xs = b, ys = b, n = n }; +}; +export fn main() i32 = { + let buf: [4]u8 = [9u8, 8u8, 7u8, 6u8]; + match (mk(buf[0:4], 42)) { + case let w: wide => { + if (w.n != 42) { return 1; }; + if (w.xs.len != 4) { return 2; }; + if (w.ys.len != 4) { return 3; }; + if (w.xs[3] != 6u8) { return 4; }; + }; + case let e: oops => return 13; + case nomem => return 14; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_local_roundtrip/case.ww b/test/wcc/data/r926_sret_wide_local_roundtrip/case.ww new file mode 100644 index 00000000..17d0802f --- /dev/null +++ b/test/wcc/data/r926_sret_wide_local_roundtrip/case.ww @@ -0,0 +1,23 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_local_roundtrip. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn mk(b: []u8, n: i64) (wide | oops | nomem) = { + let w: wide = wide { xs = b, ys = b, n = n }; + return w; +}; +export fn main() i32 = { + let buf: [4]u8 = [1u8, 2u8, 3u8, 4u8]; + let r: (wide | oops | nomem) = mk(buf[0:4], 7); + match (r) { + case let w: wide => { + if (w.n != 7) { return 1; }; + if (w.ys[0] != 1u8) { return 2; }; + }; + case let e: oops => return 13; + case nomem => return 14; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_match_scrutinee/case.ww b/test/wcc/data/r926_sret_wide_match_scrutinee/case.ww new file mode 100644 index 00000000..8c728b57 --- /dev/null +++ b/test/wcc/data/r926_sret_wide_match_scrutinee/case.ww @@ -0,0 +1,18 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_match_scrutinee. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn mk(b: []u8, n: i64) (wide | oops | nomem) = { + return wide { xs = b, ys = b, n = n }; +}; +export fn main() i32 = { + let buf: [4]u8 = [1u8, 2u8, 3u8, 4u8]; + match (mk(buf[0:4], 9)) { + case let w: wide => { if (w.n != 9) { return 1; }; }; + case let e: oops => return 13; + case nomem => return 14; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_multicall/case.ww b/test/wcc/data/r926_sret_wide_multicall/case.ww new file mode 100644 index 00000000..1fe7eb04 --- /dev/null +++ b/test/wcc/data/r926_sret_wide_multicall/case.ww @@ -0,0 +1,25 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_multicall. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn mk(b: []u8, n: i64) (wide | oops | nomem) = { + return wide { xs = b, ys = b, n = n }; +}; +export fn main() i32 = { + let buf: [4]u8 = [1u8, 2u8, 3u8, 4u8]; + let r1: (wide | oops | nomem) = mk(buf[0:4], 100); + let r2: (wide | oops | nomem) = mk(buf[0:4], 200); + match (r1) { + case let w: wide => { if (w.n != 100) { return 1; }; }; + case let e: oops => return 13; + case nomem => return 14; + }; + match (r2) { + case let w: wide => { if (w.n != 200) { return 2; }; }; + case let e: oops => return 13; + case nomem => return 14; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_s4_repro/case.ww b/test/wcc/data/r926_sret_wide_s4_repro/case.ww new file mode 100644 index 00000000..a667ccc9 --- /dev/null +++ b/test/wcc/data/r926_sret_wide_s4_repro/case.ww @@ -0,0 +1,22 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_s4_repro. +package main; +type s4 = struct { a: i64, b: i64, c: i64, d: i64 }; +fn taglit4() (s4 | bool) = { + return s4 { a = 1, b = 2, c = 3, d = 4 }; +}; +fn taglocal4() (s4 | bool) = { + let v: s4 = s4 { a = 1, b = 2, c = 3, d = 4 }; + return v; +}; +export fn main() i32 = { + match (taglit4()) { + case let r: s4 => { if (r.d != 4) { return 2; }; }; + case let b: bool => return 3; + }; + match (taglocal4()) { + case let r: s4 => { if (r.d != 4) { return 4; }; }; + case let b: bool => return 5; + }; + return 0; +}; diff --git a/test/wcc/data/r926_sret_wide_str_error_variant/case.ww b/test/wcc/data/r926_sret_wide_str_error_variant/case.ww new file mode 100644 index 00000000..2a940395 --- /dev/null +++ b/test/wcc/data/r926_sret_wide_str_error_variant/case.ww @@ -0,0 +1,21 @@ +//ww:run-exit 0 +// Run leg of the retired 926_tagged_sret_run.c row wide_str_error_variant. +package main; +type oops = !str; +type nomem = !void; +type wide = struct { xs: []u8, ys: []u8, n: i64 }; +fn mk(b: []u8, n: i64) (wide | oops | nomem) = { + if (n < 0) { return "neg": oops; }; + return wide { xs = b, ys = b, n = n }; +}; +export fn main() i32 = { + let buf: [4]u8 = [1u8, 2u8, 3u8, 4u8]; + match (mk(buf[0:4], -1)) { + case let w: wide => return 1; + case let e: oops => { + if ((e: str).len != 3) { return 2; }; + }; + case nomem => return 3; + }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_boundary48_register/case.ww b/test/wcc/data/r929_memarg_boundary48_register/case.ww new file mode 100644 index 00000000..f647299e --- /dev/null +++ b/test/wcc/data/r929_memarg_boundary48_register/case.ww @@ -0,0 +1,26 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row boundary48_register. +package main; +type t_lit = rune; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size }; +type t_u = (t_lit | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { return 1; }; + case let r: t_rep => { + if (r.m2 != 12) { return 92; }; + return 2; + }; + }; + return 99; +}; +export fn main() i32 = { + let a: t_u = ('x': t_lit); + if (probe(a) != 1) { return 1; }; + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, + m1 = 11, m2 = 12 }; + let b: t_u = r; + if (probe(b) != 2) { return 2; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_global_uninit_memarg_src/case.ww b/test/wcc/data/r929_memarg_global_uninit_memarg_src/case.ww new file mode 100644 index 00000000..c6116d32 --- /dev/null +++ b/test/wcc/data/r929_memarg_global_uninit_memarg_src/case.ww @@ -0,0 +1,28 @@ +//ww:run-exit 91 +// Run leg of the retired 929_tagged_memarg_run.c row global_uninit_memarg_src. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +let g: t_u; +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + return probe(g); +}; diff --git a/test/wcc/data/r929_memarg_idcast_peeled/case.ww b/test/wcc/data/r929_memarg_idcast_peeled/case.ww new file mode 100644 index 00000000..db6176d3 --- /dev/null +++ b/test/wcc/data/r929_memarg_idcast_peeled/case.ww @@ -0,0 +1,29 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row memarg_idcast_peeled. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let a: t_u = ('x': t_lit); + if (probe((a: t_u)) != 1) { return 1; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_call_in_loop/case.ww b/test/wcc/data/r929_memarg_mem56_call_in_loop/case.ww new file mode 100644 index 00000000..44e9ec1a --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_call_in_loop/case.ww @@ -0,0 +1,30 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_call_in_loop. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn grab(a: t_u) i64 = { + match (a) { + case let r: t_rep => { return r.m3: i64; }; + case => { return -1; }; + }; + return -2; +}; +export fn main() i32 = { + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let a: t_u = r; + let canary: i64 = 4242; + let sum: i64 = 0; + let i: i64 = 0; + for (i < 200000) { + sum += grab(a) - 1234; + i += 1; + }; + if (canary != 4242) { return 2; }; + if (sum != 0) { return 1; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_elem_callidx_twomem/case.ww b/test/wcc/data/r929_memarg_mem56_elem_callidx_twomem/case.ww new file mode 100644 index 00000000..f73a7097 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_elem_callidx_twomem/case.ww @@ -0,0 +1,42 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_elem_callidx_twomem. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +fn pick() size = { + return 1; +}; +fn two(a: t_u, b: t_u) i32 = { + return probe(a) * 10 + probe(b); +}; +export fn main() i32 = { + let xs: []t_u = []; + let a: t_u = ('x': t_lit); + append(xs, a); + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let b: t_u = r; + append(xs, b); + if (two(xs[0], xs[pick()]) != 13) { return 1; }; + if (two(xs[pick()], xs[0]) != 31) { return 2; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_elem_deref_spine/case.ww b/test/wcc/data/r929_memarg_mem56_elem_deref_spine/case.ww new file mode 100644 index 00000000..c1cd62d7 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_elem_deref_spine/case.ww @@ -0,0 +1,34 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_elem_deref_spine. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let xs: []t_u = []; + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let b: t_u = r; + append(xs, b); + let p: *[]t_u = &xs; + if (probe((*p)[0]) != 3) { return 1; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_elem_global_slice/case.ww b/test/wcc/data/r929_memarg_mem56_elem_global_slice/case.ww new file mode 100644 index 00000000..48b2edd4 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_elem_global_slice/case.ww @@ -0,0 +1,33 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_elem_global_slice. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +let gxs: []t_u; +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let b: t_u = r; + append(gxs, b); + if (probe(gxs[0]) != 3) { return 1; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_elem_mixed_regs/case.ww b/test/wcc/data/r929_memarg_mem56_elem_mixed_regs/case.ww new file mode 100644 index 00000000..94c711fc --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_elem_mixed_regs/case.ww @@ -0,0 +1,36 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_elem_mixed_regs. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn before(k: i64, s: str, a: t_u) i64 = { + if (k != 5) { return 91; }; + if (s.len != 3) { return 92; }; + match (a) { + case let r: t_rep => { return k + (r.m3: i64); }; + case => { return 93; }; + }; + return 99; +}; +fn after(a: t_u, k: i64, s: str) i64 = { + if (k != 6) { return 91; }; + if (s.len != 3) { return 92; }; + match (a) { + case let r: t_rep => { return k + (r.m3: i64); }; + case => { return 93; }; + }; + return 99; +}; +export fn main() i32 = { + let xs: []t_u = []; + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let b: t_u = r; + append(xs, b); + if (before(5, "abc", xs[0]) != 1239) { return 1; }; + if (after(xs[0], 6, "abc") != 1240) { return 2; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_elem_nested_spine/case.ww b/test/wcc/data/r929_memarg_mem56_elem_nested_spine/case.ww new file mode 100644 index 00000000..69e5cd8d --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_elem_nested_spine/case.ww @@ -0,0 +1,40 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_elem_nested_spine. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +type re_t = struct { flag: i64, insts: []t_u }; +type thr = struct { pc: size, gen: i64 }; +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let xs: []t_u = []; + let a: t_u = ('x': t_lit); + append(xs, a); + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let b: t_u = r; + append(xs, b); + let re: re_t = re_t { flag = 4, insts = xs }; + let threads: []thr = []; + append(threads, thr { pc = 1, gen = 5 }); + if (probe(re.insts[threads[0].pc]) != 3) { return 1; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_elem_source/case.ww b/test/wcc/data/r929_memarg_mem56_elem_source/case.ww new file mode 100644 index 00000000..590bf425 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_elem_source/case.ww @@ -0,0 +1,38 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_elem_source. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let xs: []t_u = []; + let a: t_u = ('x': t_lit); + append(xs, a); + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let b: t_u = r; + append(xs, b); + if (probe(xs[0]) != 1) { return 1; }; + if (probe(xs[1]) != 3) { return 2; }; + let i: size = 1; + if (probe(xs[i]) != 3) { return 3; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_ident_allvariants/case.ww b/test/wcc/data/r929_memarg_mem56_ident_allvariants/case.ww new file mode 100644 index 00000000..54804e6d --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_ident_allvariants/case.ww @@ -0,0 +1,36 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_ident_allvariants. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let a: t_u = ('x': t_lit); + if (probe(a) != 1) { return 1; }; + let av: t_any; + let b: t_u = av; + if (probe(b) != 2) { return 2; }; + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let cc: t_u = r; + if (probe(cc) != 3) { return 3; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_inst_shape/case.ww b/test/wcc/data/r929_memarg_mem56_inst_shape/case.ww new file mode 100644 index 00000000..c2747dd4 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_inst_shape/case.ww @@ -0,0 +1,28 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_inst_shape. +package main; +type inst_lit = rune; +type inst_any = void; +type inst_repeat = struct { id: size, origin: size, + min: (void | size), max: (void | size) }; +type inst = (inst_lit | inst_any | inst_repeat); +fn is_consuming(a: inst) bool = { + return a is inst_lit || a is inst_any; +}; +fn rep_id(a: inst) i64 = { + match (a) { + case let r: inst_repeat => { return r.origin: i64; }; + case => { return -1; }; + }; + return -2; +}; +export fn main() i32 = { + let a: inst = ('x': inst_lit); + if (!is_consuming(a)) { return 1; }; + let r: inst_repeat = inst_repeat { id = 7, origin = 9, + min = (11: size), max = (1234: size) }; + let b: inst = r; + if (is_consuming(b)) { return 2; }; + if (rep_id(b) != 9) { return 3; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_mixed_orders/case.ww b/test/wcc/data/r929_memarg_mem56_mixed_orders/case.ww new file mode 100644 index 00000000..d71fafe7 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_mixed_orders/case.ww @@ -0,0 +1,34 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_mixed_orders. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn before(k: i64, s: str, a: t_u) i64 = { + if (k != 5) { return 91; }; + if (s.len != 3) { return 92; }; + match (a) { + case let r: t_rep => { return k + (r.m3: i64); }; + case => { return 93; }; + }; + return 99; +}; +fn after(a: t_u, k: i64, s: str) i64 = { + if (k != 6) { return 91; }; + if (s.len != 3) { return 92; }; + match (a) { + case let r: t_rep => { return k + (r.m3: i64); }; + case => { return 93; }; + }; + return 99; +}; +export fn main() i32 = { + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let a: t_u = r; + if (before(5, "abc", a) != 1239) { return 1; }; + if (after(a, 6, "abc") != 1240) { return 2; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_srcshapes/case.ww b/test/wcc/data/r929_memarg_mem56_srcshapes/case.ww new file mode 100644 index 00000000..abfecd4b --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_srcshapes/case.ww @@ -0,0 +1,40 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_srcshapes. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +type holder = struct { k: i64, u: t_u }; +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let arr: [2]t_u = [ + ('x': t_lit): t_u, + ('x': t_lit): t_u, + ]; + if (probe(arr[1]) != 1) { return 1; }; + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let h: holder = holder { k = 9, u = r }; + if (probe(h.u) != 3) { return 2; }; + let x: t_u = ('x': t_lit); + let p: *t_u = &x; + if (probe(*p) != 1) { return 3; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_subset_remap/case.ww b/test/wcc/data/r929_memarg_mem56_subset_remap/case.ww new file mode 100644 index 00000000..b29bb699 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_subset_remap/case.ww @@ -0,0 +1,32 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_subset_remap. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +type t_sub = (t_lit | t_any); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + let s: t_sub = ('x': t_lit); + if (probe(s) != 1) { return 1; }; + let s2: t_sub = (void: t_any); + if (probe(s2) != 2) { return 2; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_twomem/case.ww b/test/wcc/data/r929_memarg_mem56_twomem/case.ww new file mode 100644 index 00000000..f5e1a9de --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_twomem/case.ww @@ -0,0 +1,33 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_twomem. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +type w_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size, m4: size }; +type w_u = (t_lit | w_rep); +fn both(a: t_u, b: w_u) i64 = { + let x: i64 = 0; + match (a) { + case let r: t_rep => { x = r.m3: i64; }; + case => { return 91; }; + }; + match (b) { + case let r: w_rep => { return x + (r.m4: i64); }; + case => { return 92; }; + }; + return 99; +}; +export fn main() i32 = { + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + let a: t_u = r; + let w: w_rep = w_rep { id = 1, origin = 2, m0 = 3, + m1 = 4, m2 = 5, m3 = 6, m4 = 2 }; + let b: w_u = w; + if (both(a, b) != 1236) { return 1; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem56_widen_concrete/case.ww b/test/wcc/data/r929_memarg_mem56_widen_concrete/case.ww new file mode 100644 index 00000000..4d3b9111 --- /dev/null +++ b/test/wcc/data/r929_memarg_mem56_widen_concrete/case.ww @@ -0,0 +1,33 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem56_widen_concrete. +package main; +type t_lit = rune; +type t_any = void; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size }; +type t_u = (t_lit | t_any | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'x') { return 1; }; + return 91; + }; + case t_any => { return 2; }; + case let r: t_rep => { + if (r.m3 != 1234) { return 92; }; + if (r.m2 != 12) { return 93; }; + if (r.id != 7) { return 94; }; + return 3; + }; + }; + return 99; +}; +export fn main() i32 = { + if (probe('x': t_lit) != 1) { return 1; }; + let av: t_any; + if (probe(av) != 2) { return 2; }; + let r: t_rep = t_rep { id = 7, origin = 9, m0 = 10, m1 = 11, m2 = 12, + m3 = 1234 }; + if (probe(r) != 3) { return 3; }; + return 0; +}; diff --git a/test/wcc/data/r929_memarg_mem64_ident_lateword/case.ww b/test/wcc/data/r929_memarg_mem64_ident_lateword/case.ww new file mode 100644 index 00000000..5ae64c6b --- /dev/null +++ b/test/wcc/data/r929_memarg_mem64_ident_lateword/case.ww @@ -0,0 +1,30 @@ +//ww:run-exit 0 +// Run leg of the retired 929_tagged_memarg_run.c row mem64_ident_lateword. +package main; +type t_lit = rune; +type t_rep = struct { id: size, origin: size, m0: size, + m1: size, m2: size, m3: size, m4: size }; +type t_u = (t_lit | t_rep); +fn probe(a: t_u) i32 = { + match (a) { + case let l: t_lit => { + if (l == 'y') { return 1; }; + return 91; + }; + case let r: t_rep => { + if (r.m4 != 7777) { return 92; }; + if (r.m3 != 5) { return 93; }; + return 2; + }; + }; + return 99; +}; +export fn main() i32 = { + let a: t_u = ('y': t_lit); + if (probe(a) != 1) { return 1; }; + let r: t_rep = t_rep { id = 1, origin = 2, m0 = 3, + m1 = 4, m2 = 5, m3 = 5, m4 = 7777 }; + let b: t_u = r; + if (probe(b) != 2) { return 2; }; + return 0; +};