fold-2 chunk C2 (drew's Fam8-13 plan): 14 tuple value-row C drivers migrate to 15 test/lang/*_test.ww @test row-tables (the +1 is 954_tuprecv, slimmed not deleted -- its value rows split out while the asserttyped-stamp dimension stays as a carrier-split C pin, mutation-proven non-vacuous). Reject rows move to 32 test/wcc/data/*/case.ww //ww:error carriers (runww asserts the substring in BOTH stages). The test-lang byte-id (LANGBYTEID) gate gives cs==ww automatically and is strictly more sensitive than re-running the wwstage leg; floor 59->74. Tuple surfaced zero cs!=ww as the plan predicted -- no value-only carve. The 945 trio folds in here; 940_global_sret / 940_str_forrange / 926_tagscr untouched (routed to drew per-file). Test count 402->388 = the 14 retired drivers.
1454 lines
37 KiB
Plaintext
1454 lines
37 KiB
Plaintext
// tuple_slot_layout_test — tuple arc layout SSoT (user-ratified): the tuple
|
|
// SLOT layout (str/slice = 24B header, everything else one 8B eightbyte;
|
|
// tagged = roundup8(size(elem))) is the single source of truth the checker
|
|
// size, the cgen cursor transports, and the t.N read walk all agree on.
|
|
// Migrated from test/wcc/941_tuple_slot_layout_run.c — the value rows become
|
|
// @test fns here (T1 `ww test` runs the runtime asserts; T2 test-lang-byteid
|
|
// keeps cs==ww); the reject rows become fold-3 //ww:error carriers under
|
|
// test/wcc/data/tslot_*/. Never-taken match arms / failure-checks that were
|
|
// `return K` become assert(false) / assert(!(COND)).
|
|
//
|
|
// Helper fns and types are suffixed with the row label to keep each migrated
|
|
// `package main` row's decls collision-free at this single file scope.
|
|
|
|
package tuple_slot_layout_test;
|
|
|
|
fn f_letcall_packed() (u32, u32) = {
|
|
return (3, 4);
|
|
};
|
|
|
|
@test fn letcall_packed() void = {
|
|
let t: (u32, u32) = f_letcall_packed();
|
|
assert(!(t.0 != 3));
|
|
assert(!(t.1 != 4));
|
|
};
|
|
|
|
fn f_letcall_float_packed() (u32, f64) = {
|
|
let a: u32 = 9;
|
|
let x: f64 = 2.5;
|
|
return (a, x);
|
|
};
|
|
|
|
@test fn letcall_float_packed() void = {
|
|
let t: (u32, f64) = f_letcall_float_packed();
|
|
assert(!(t.0 != 9));
|
|
assert(!(t.1 != 2.5));
|
|
};
|
|
|
|
fn f_letcall_signed_packed() (i32, i32) = {
|
|
let a: i32 = -5;
|
|
let b: i32 = -6;
|
|
return (a, b);
|
|
};
|
|
|
|
@test fn letcall_signed_packed() void = {
|
|
let t: (i32, i32) = f_letcall_signed_packed();
|
|
assert(!(t.0 != -5));
|
|
assert(!(t.1 != -6));
|
|
assert(!(t.0 + t.1 != -11));
|
|
};
|
|
|
|
fn f_letcall_mixed_packed() (u32, str) = {
|
|
let a: u32 = 7;
|
|
let s: str = "hello";
|
|
return (a, s);
|
|
};
|
|
|
|
@test fn letcall_mixed_packed() void = {
|
|
let t: (u32, str) = f_letcall_mixed_packed();
|
|
assert(!(t.0 != 7));
|
|
assert(!(len(t.1) != 5));
|
|
};
|
|
|
|
fn f_letcall_16_neutral() (i64, i64) = {
|
|
return (41, 17);
|
|
};
|
|
|
|
@test fn letcall_16_neutral() void = {
|
|
let t: (i64, i64) = f_letcall_16_neutral();
|
|
assert(!(t.0 != 41));
|
|
assert(!(t.1 != 17));
|
|
};
|
|
|
|
fn f_letcall_32_neutral() (i64, str) = {
|
|
let a: i64 = 12;
|
|
let s: str = "wxyz";
|
|
return (a, s);
|
|
};
|
|
|
|
@test fn letcall_32_neutral() void = {
|
|
let t: (i64, str) = f_letcall_32_neutral();
|
|
assert(!(t.0 != 12));
|
|
assert(!(len(t.1) != 4));
|
|
};
|
|
|
|
fn f_mlet_packed_neutral() (u32, u32) = {
|
|
return (3, 4);
|
|
};
|
|
|
|
@test fn mlet_packed_neutral() void = {
|
|
let (a, b) = f_mlet_packed_neutral();
|
|
assert(!(a != 3));
|
|
assert(!(b != 4));
|
|
};
|
|
|
|
@test fn c0_sizefold_slot() void = {
|
|
assert(!(size((u32, u32)) != 16));
|
|
assert(!(size((size, size)) != 16));
|
|
assert(!(size((u32, str)) != 32));
|
|
assert(!(size((str, str)) != 48));
|
|
assert(!(align((u32, u32)) != 4));
|
|
};
|
|
|
|
type holder_c0_sizefold_recursive = struct { t: (u32, u32), x: i64 };
|
|
|
|
@test fn c0_sizefold_recursive() void = {
|
|
assert(!(size(holder_c0_sizefold_recursive) != 24));
|
|
assert(!(size([4](u32, u32)) != 64));
|
|
};
|
|
|
|
@test fn t22_sizefold_tagged() void = {
|
|
assert(!(size(((void | size), size)) != 24));
|
|
assert(!(size((size, (void | size))) != 24));
|
|
assert(!(size(((void | size), (void | size), size)) != 40));
|
|
assert(!(align(((void | size), size)) != 8));
|
|
assert(!(size((u64, void)) != 8));
|
|
};
|
|
|
|
fn mk_t22_roundtrip() ((void | size), size) = {
|
|
let mn: (void | size) = 5: size;
|
|
return (mn, 4);
|
|
};
|
|
|
|
fn mk2_t22_roundtrip() (size, (void | size)) = {
|
|
let mx: (void | size) = 7: size;
|
|
return (9, mx);
|
|
};
|
|
|
|
fn mkv_t22_roundtrip() ((void | size), size) = {
|
|
let mn: (void | size) = void;
|
|
return (mn, 3);
|
|
};
|
|
|
|
@test fn t22_roundtrip() void = {
|
|
let t = mk_t22_roundtrip();
|
|
assert(!(!(t.0 is size)));
|
|
assert(!(t.0 as size != 5));
|
|
assert(!(t.1 != 4));
|
|
let u = mk2_t22_roundtrip();
|
|
assert(!(u.0 != 9));
|
|
assert(!(!(u.1 is size)));
|
|
assert(!(u.1 as size != 7));
|
|
let v = mkv_t22_roundtrip();
|
|
assert(!(!(v.0 is void)));
|
|
assert(!(v.1 != 3));
|
|
let (a, b) = mk_t22_roundtrip();
|
|
assert(!(!(a is size)));
|
|
assert(!(a as size != 5));
|
|
assert(!(b != 4));
|
|
let mn: (void | size) = 6: size;
|
|
let w: ((void | size), size) = (mn, 2);
|
|
assert(!(!(w.0 is size)));
|
|
assert(!(w.0 as size != 6));
|
|
assert(!(w.1 != 2));
|
|
};
|
|
|
|
fn mk_t22_float_mix() (f64, (void | size), i64) = {
|
|
let mn: (void | size) = 6: size;
|
|
return (2.5, mn, 9);
|
|
};
|
|
|
|
@test fn t22_float_mix() void = {
|
|
let t = mk_t22_float_mix();
|
|
assert(!(t.0 != 2.5));
|
|
assert(!(!(t.1 is size)));
|
|
assert(!(t.1 as size != 6));
|
|
assert(!(t.2 != 9));
|
|
let (x, y, z) = mk_t22_float_mix();
|
|
assert(!(x != 2.5));
|
|
assert(!(!(y is size)));
|
|
assert(!(y as size != 6));
|
|
assert(!(z != 9));
|
|
};
|
|
|
|
fn mk_t22_two_tagged() ((void | u32), (void | i64)) = {
|
|
let a: (void | u32) = 9: u32;
|
|
let b: (void | i64) = -5: i64;
|
|
return (a, b);
|
|
};
|
|
|
|
fn mkv_t22_two_tagged() ((void | u32), (void | i64)) = {
|
|
let a: (void | u32) = void;
|
|
let b: (void | i64) = -41: i64;
|
|
return (a, b);
|
|
};
|
|
|
|
@test fn t22_two_tagged() void = {
|
|
let t = mk_t22_two_tagged();
|
|
assert(!(!(t.0 is u32)));
|
|
assert(!(t.0 as u32 != 9));
|
|
assert(!(!(t.1 is i64)));
|
|
assert(!(t.1 as i64 != -5));
|
|
let v = mkv_t22_two_tagged();
|
|
assert(!(!(v.0 is void)));
|
|
assert(!(v.1 as i64 != -41));
|
|
let (a, b) = mk_t22_two_tagged();
|
|
assert(!(a as u32 != 9));
|
|
assert(!(b as i64 != -5));
|
|
};
|
|
|
|
fn mk_t22_float_mix_rev() ((void | size), f64) = {
|
|
let mn: (void | size) = 6: size;
|
|
return (mn, 0.25);
|
|
};
|
|
|
|
@test fn t22_float_mix_rev() void = {
|
|
let t = mk_t22_float_mix_rev();
|
|
assert(!(!(t.0 is size)));
|
|
assert(!(t.0 as size != 6));
|
|
assert(!(t.1 != 0.25));
|
|
let (y, z) = mk_t22_float_mix_rev();
|
|
assert(!(y as size != 6));
|
|
assert(!(z != 0.25));
|
|
};
|
|
|
|
fn takes_t22_elem_arg(v: (void | size)) size = {
|
|
if (v is size) { return v as size; };
|
|
return 0;
|
|
};
|
|
|
|
@test fn t22_elem_arg() void = {
|
|
let mn: (void | size) = 5: size;
|
|
let t: ((void | size), size) = (mn, 4);
|
|
assert(!(takes_t22_elem_arg(t.0) != 5));
|
|
assert(!(takes_t22_elem_arg(t.0) + t.1 != 9));
|
|
};
|
|
|
|
fn pr_b22_parse_repetition() ((void | size), (void | size), size) = {
|
|
let mn: (void | size) = void;
|
|
let mx: (void | size) = 5: size;
|
|
mn = 3: size;
|
|
return (mn, mx, 9);
|
|
};
|
|
|
|
@test fn b22_parse_repetition() void = {
|
|
let t = pr_b22_parse_repetition();
|
|
assert(!(!(t.0 is size)));
|
|
assert(!(t.0 as size != 3));
|
|
assert(!(!(t.1 is size)));
|
|
assert(!(t.1 as size != 5));
|
|
assert(!(t.2 != 9));
|
|
let (a, b, n) = pr_b22_parse_repetition();
|
|
assert(!(a as size != 3));
|
|
assert(!(b as size != 5));
|
|
assert(!(n != 9));
|
|
let a2: (void | size) = void;
|
|
let b2: (void | size) = void;
|
|
let n2: size = 0;
|
|
a2, b2, n2 = pr_b22_parse_repetition();
|
|
assert(!(a2 as size != 3));
|
|
assert(!(b2 as size != 5));
|
|
assert(!(n2 != 9));
|
|
};
|
|
|
|
fn ph_b22_head_mid_tail() ((void | size), size, size, size, size) = {
|
|
let a: (void | size) = 11: size;
|
|
return (a, 1, 2, 3, 4);
|
|
};
|
|
|
|
fn pm_b22_head_mid_tail() (size, size, (void | size), size, size) = {
|
|
let a: (void | size) = 12: size;
|
|
return (1, 2, a, 3, 4);
|
|
};
|
|
|
|
fn pt_b22_head_mid_tail() (size, size, size, size, (void | size)) = {
|
|
let a: (void | size) = 13: size;
|
|
return (1, 2, 3, 4, a);
|
|
};
|
|
|
|
fn pv_b22_head_mid_tail() ((void | size), (void | size), size) = {
|
|
let a: (void | size) = void;
|
|
let b: (void | size) = void;
|
|
return (a, b, 9);
|
|
};
|
|
|
|
@test fn b22_head_mid_tail() void = {
|
|
let h = ph_b22_head_mid_tail();
|
|
assert(!(h.0 as size != 11));
|
|
assert(!(h.4 != 4));
|
|
let m = pm_b22_head_mid_tail();
|
|
assert(!(m.0 != 1));
|
|
assert(!(m.2 as size != 12));
|
|
assert(!(m.4 != 4));
|
|
let t = pt_b22_head_mid_tail();
|
|
assert(!(t.3 != 4));
|
|
assert(!(t.4 as size != 13));
|
|
let v = pv_b22_head_mid_tail();
|
|
assert(!(!(v.0 is void)));
|
|
assert(!(!(v.1 is void)));
|
|
assert(!(v.2 != 9));
|
|
let (x, y, z) = v;
|
|
assert(!(!(x is void)));
|
|
assert(!(!(y is void)));
|
|
assert(!(z != 9));
|
|
};
|
|
|
|
fn pr_b22_str_tagged_mix() (str, (void | size), size, size) = {
|
|
let mid: (void | size) = 4: size;
|
|
return ("hello", mid, 6, 7);
|
|
};
|
|
|
|
@test fn b22_str_tagged_mix() void = {
|
|
let t = pr_b22_str_tagged_mix();
|
|
assert(!(t.0.len != 5));
|
|
assert(!(t.1 as size != 4));
|
|
assert(!(t.2 != 6));
|
|
assert(!(t.3 != 7));
|
|
};
|
|
|
|
fn pr_b22_sse_mix() ((void | size), f64, f64, f64) = {
|
|
let a: (void | size) = 6: size;
|
|
return (a, 1.5, 2.5, 3.5);
|
|
};
|
|
|
|
@test fn b22_sse_mix() void = {
|
|
let t = pr_b22_sse_mix();
|
|
assert(!(t.0 as size != 6));
|
|
assert(!(t.1 != 1.5));
|
|
assert(!(t.2 != 2.5));
|
|
assert(!(t.3 != 3.5));
|
|
let (a, x, y, z) = pr_b22_sse_mix();
|
|
assert(!(a as size != 6));
|
|
assert(!(x != 1.5));
|
|
assert(!(y != 2.5));
|
|
assert(!(z != 3.5));
|
|
};
|
|
|
|
fn pr_b22_underscore_skip() ((void | size), (void | size), size) = {
|
|
let mn: (void | size) = 3: size;
|
|
let mx: (void | size) = 5: size;
|
|
return (mn, mx, 9);
|
|
};
|
|
|
|
@test fn b22_underscore_skip() void = {
|
|
let a: (void | size) = void;
|
|
let n: size = 0;
|
|
a, _, n = pr_b22_underscore_skip();
|
|
assert(!(a as size != 3));
|
|
assert(!(n != 9));
|
|
let (q, _, r) = pr_b22_underscore_skip();
|
|
assert(!(q as size != 3));
|
|
assert(!(r != 9));
|
|
};
|
|
|
|
type four_c37_big_box_t0_read = struct { a: u64, b: u64, c: u64, d: u64, };
|
|
|
|
fn g_c37_big_box_t0_read() (void | four_c37_big_box_t0_read) = {
|
|
let v: four_c37_big_box_t0_read = four_c37_big_box_t0_read{a=1u64, b=2u64, c=3u64, d=4u64};
|
|
return v;
|
|
};
|
|
|
|
fn pr_c37_big_box_t0_read() ((void | four_c37_big_box_t0_read), size) = {
|
|
let e: (void | four_c37_big_box_t0_read) = g_c37_big_box_t0_read();
|
|
return (e, 7);
|
|
};
|
|
|
|
@test fn c37_big_box_t0_read() void = {
|
|
let t = pr_c37_big_box_t0_read();
|
|
assert(!(t.1 != 7));
|
|
assert(!(!(t.0 is four_c37_big_box_t0_read)));
|
|
match (t.0) {
|
|
case let f: four_c37_big_box_t0_read => {
|
|
assert(!(f.a != 1));
|
|
assert(!(f.b != 2));
|
|
assert(!(f.c != 3));
|
|
assert(!(f.d != 4));
|
|
};
|
|
case void => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_c37_idx_match_56 = rune;
|
|
type inst_repeat_c37_idx_match_56 = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_c37_idx_match_56 = (inst_lit_c37_idx_match_56 | inst_repeat_c37_idx_match_56);
|
|
|
|
@test fn c37_idx_match_56() void = {
|
|
let insts: []inst_c37_idx_match_56 = [];
|
|
let r = inst_repeat_c37_idx_match_56{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(insts, r);
|
|
append(insts, ('A': inst_lit_c37_idx_match_56));
|
|
let pc: size = 0;
|
|
match (insts[pc]) {
|
|
case let ir: inst_repeat_c37_idx_match_56 => {
|
|
assert(!(ir.id != 7));
|
|
assert(!(ir.origin != 3));
|
|
assert(!(!(ir.min is size)));
|
|
assert(!(ir.min as size != 11));
|
|
assert(!(!(ir.max is size)));
|
|
assert(!(ir.max as size != 22));
|
|
};
|
|
case let l: inst_lit_c37_idx_match_56 => { assert(false); };
|
|
};
|
|
match (insts[1]) {
|
|
case let l: inst_lit_c37_idx_match_56 => {
|
|
assert(!(l != 'A'));
|
|
};
|
|
case let ir: inst_repeat_c37_idx_match_56 => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type lit2_c37_idx_match_str_nested = rune;
|
|
type rep2_c37_idx_match_str_nested = struct {
|
|
name: str,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type in2_c37_idx_match_str_nested = (lit2_c37_idx_match_str_nested | rep2_c37_idx_match_str_nested);
|
|
|
|
@test fn c37_idx_match_str_nested() void = {
|
|
let xs: []in2_c37_idx_match_str_nested = [];
|
|
let r = rep2_c37_idx_match_str_nested{name="deadbeef", min=(2: size), max=(5: size)};
|
|
append(xs, r);
|
|
match (xs[0]) {
|
|
case let v: rep2_c37_idx_match_str_nested => {
|
|
assert(!(v.name.len != 8));
|
|
assert(!(v.name[0] != 'd'));
|
|
assert(!(v.name[7] != 'f'));
|
|
assert(!(!(v.min is size)));
|
|
assert(!(v.min as size != 2));
|
|
assert(!(v.max as size != 5));
|
|
};
|
|
case let l: lit2_c37_idx_match_str_nested => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_c37_idx_let_is_assign = rune;
|
|
type inst_repeat_c37_idx_let_is_assign = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_c37_idx_let_is_assign = (inst_lit_c37_idx_let_is_assign | inst_repeat_c37_idx_let_is_assign);
|
|
|
|
@test fn c37_idx_let_is_assign() void = {
|
|
let insts: []inst_c37_idx_let_is_assign = [];
|
|
let r = inst_repeat_c37_idx_let_is_assign{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(insts, r);
|
|
append(insts, ('A': inst_lit_c37_idx_let_is_assign));
|
|
assert(!(!(insts[0] is inst_repeat_c37_idx_let_is_assign)));
|
|
assert(!(insts[0] is inst_lit_c37_idx_let_is_assign));
|
|
let w = insts[0];
|
|
match (w) {
|
|
case let ir: inst_repeat_c37_idx_let_is_assign => {
|
|
assert(!(ir.max as size != 22));
|
|
};
|
|
case let l: inst_lit_c37_idx_let_is_assign => { assert(false); };
|
|
};
|
|
w = insts[1];
|
|
assert(!(!(w is inst_lit_c37_idx_let_is_assign)));
|
|
w = insts[0];
|
|
match (w) {
|
|
case let ir: inst_repeat_c37_idx_let_is_assign => {
|
|
assert(!(ir.min as size != 11));
|
|
};
|
|
case let l: inst_lit_c37_idx_let_is_assign => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_c37_idx_return = rune;
|
|
type inst_repeat_c37_idx_return = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_c37_idx_return = (inst_lit_c37_idx_return | inst_repeat_c37_idx_return);
|
|
|
|
fn pick_c37_idx_return(insts: []inst_c37_idx_return, pc: size) inst_c37_idx_return = {
|
|
return insts[pc];
|
|
};
|
|
|
|
@test fn c37_idx_return() void = {
|
|
let insts: []inst_c37_idx_return = [];
|
|
let r = inst_repeat_c37_idx_return{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(insts, r);
|
|
let w = pick_c37_idx_return(insts, 0);
|
|
match (w) {
|
|
case let ir: inst_repeat_c37_idx_return => {
|
|
assert(!(ir.id != 7));
|
|
assert(!(ir.min as size != 11));
|
|
};
|
|
case let l: inst_lit_c37_idx_return => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_c37_widen_and_memarg = rune;
|
|
type inst_repeat_c37_widen_and_memarg = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_c37_widen_and_memarg = (inst_lit_c37_widen_and_memarg | inst_repeat_c37_widen_and_memarg);
|
|
type wide_c37_widen_and_memarg = (inst_lit_c37_widen_and_memarg | inst_repeat_c37_widen_and_memarg | str);
|
|
|
|
fn idof_c37_widen_and_memarg(i: inst_c37_widen_and_memarg) size = {
|
|
match (i) {
|
|
case let ir: inst_repeat_c37_widen_and_memarg => { return ir.id; };
|
|
case let l: inst_lit_c37_widen_and_memarg => { return 999; };
|
|
};
|
|
return 998;
|
|
};
|
|
|
|
@test fn c37_widen_and_memarg() void = {
|
|
let insts: []inst_c37_widen_and_memarg = [];
|
|
let r = inst_repeat_c37_widen_and_memarg{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(insts, r);
|
|
let w: wide_c37_widen_and_memarg = insts[0];
|
|
match (w) {
|
|
case let ir: inst_repeat_c37_widen_and_memarg => {
|
|
assert(!(ir.max as size != 22));
|
|
};
|
|
case let l: inst_lit_c37_widen_and_memarg => { assert(false); };
|
|
case let s2: str => { assert(false); };
|
|
};
|
|
assert(!(idof_c37_widen_and_memarg(insts[0]) != 7));
|
|
};
|
|
|
|
type inst_lit_c37_widen_remap = rune;
|
|
type inst_repeat_c37_widen_remap = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type rev_c37_widen_remap = (inst_repeat_c37_widen_remap | inst_lit_c37_widen_remap);
|
|
type wide_c37_widen_remap = (inst_lit_c37_widen_remap | inst_repeat_c37_widen_remap | str);
|
|
|
|
@test fn c37_widen_remap() void = {
|
|
let xs: []rev_c37_widen_remap = [];
|
|
let r = inst_repeat_c37_widen_remap{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(xs, r);
|
|
let w: wide_c37_widen_remap = xs[0];
|
|
match (w) {
|
|
case let ir: inst_repeat_c37_widen_remap => {
|
|
assert(!(ir.id != 7));
|
|
assert(!(!(ir.max is size)));
|
|
assert(!(ir.max as size != 22));
|
|
};
|
|
case let l: inst_lit_c37_widen_remap => { assert(false); };
|
|
case let s2: str => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type st_c37_x1_compose = struct { a: size, m: (void | size), };
|
|
|
|
fn pr_c37_x1_compose() ((void | st_c37_x1_compose), size, size) = {
|
|
let e: (void | st_c37_x1_compose) = st_c37_x1_compose{a=4: size, m=(2: size)};
|
|
return (e, 5, 6);
|
|
};
|
|
|
|
@test fn c37_x1_compose() void = {
|
|
let t = pr_c37_x1_compose();
|
|
assert(!(!(t.0 is st_c37_x1_compose)));
|
|
match (t.0) {
|
|
case let v: st_c37_x1_compose => {
|
|
assert(!(v.a != 4));
|
|
assert(!(!(v.m is size)));
|
|
assert(!(v.m as size != 2));
|
|
};
|
|
case void => { assert(false); };
|
|
};
|
|
assert(!(t.1 != 5));
|
|
assert(!(t.2 != 6));
|
|
};
|
|
|
|
type box_c37_idx_at_cap = (void | str);
|
|
|
|
@test fn c37_idx_at_cap() void = {
|
|
let bs: []box_c37_idx_at_cap = [];
|
|
let s: str = "abcdefgh";
|
|
append(bs, s);
|
|
match (bs[0]) {
|
|
case let v: str => {
|
|
assert(!(v.len != 8));
|
|
};
|
|
case void => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_c37_ptr_field_match = rune;
|
|
type inst_repeat_c37_ptr_field_match = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_c37_ptr_field_match = (inst_lit_c37_ptr_field_match | inst_repeat_c37_ptr_field_match);
|
|
type holder_c37_ptr_field_match = struct { pre: size, f: inst_c37_ptr_field_match, };
|
|
|
|
@test fn c37_ptr_field_match() void = {
|
|
let g = holder_c37_ptr_field_match{pre=9: size, f=inst_repeat_c37_ptr_field_match{id=7: size, origin=3: size, min=(11: size), max=(55: size)}};
|
|
let p = &g;
|
|
assert(!(!(p.f is inst_repeat_c37_ptr_field_match)));
|
|
match (p.f) {
|
|
case let ir: inst_repeat_c37_ptr_field_match => {
|
|
assert(!(ir.id != 7));
|
|
assert(!(ir.max as size != 55));
|
|
};
|
|
case let l: inst_lit_c37_ptr_field_match => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_c37_deref_idx_match = rune;
|
|
type inst_repeat_c37_deref_idx_match = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_c37_deref_idx_match = (inst_lit_c37_deref_idx_match | inst_repeat_c37_deref_idx_match);
|
|
|
|
@test fn c37_deref_idx_match() void = {
|
|
let insts: []inst_c37_deref_idx_match = [];
|
|
let r = inst_repeat_c37_deref_idx_match{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(insts, r);
|
|
let p = &insts;
|
|
match ((*p)[0]) {
|
|
case let ir: inst_repeat_c37_deref_idx_match => {
|
|
assert(!(ir.id != 7));
|
|
assert(!(ir.max as size != 22));
|
|
};
|
|
case let l: inst_lit_c37_deref_idx_match => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_fc_deref_56_slice_let = rune;
|
|
type inst_repeat_fc_deref_56_slice_let = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_fc_deref_56_slice_let = (inst_lit_fc_deref_56_slice_let | inst_repeat_fc_deref_56_slice_let);
|
|
|
|
@test fn fc_deref_56_slice_let() void = {
|
|
let insts: []inst_fc_deref_56_slice_let = [];
|
|
let r = inst_repeat_fc_deref_56_slice_let{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(insts, r);
|
|
let p = &insts[0];
|
|
let w = *p;
|
|
assert(!(!(w is inst_repeat_fc_deref_56_slice_let)));
|
|
match (w) {
|
|
case let ir: inst_repeat_fc_deref_56_slice_let => {
|
|
assert(!(ir.id != 7 || ir.origin != 3));
|
|
assert(!((ir.min as size) != 11));
|
|
assert(!((ir.max as size) != 22));
|
|
};
|
|
case let l: inst_lit_fc_deref_56_slice_let => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type inst_lit_fc_deref_56_slice_match = rune;
|
|
type inst_repeat_fc_deref_56_slice_match = struct {
|
|
id: size,
|
|
origin: size,
|
|
min: (void | size),
|
|
max: (void | size),
|
|
};
|
|
type inst_fc_deref_56_slice_match = (inst_lit_fc_deref_56_slice_match | inst_repeat_fc_deref_56_slice_match);
|
|
|
|
@test fn fc_deref_56_slice_match() void = {
|
|
let insts: []inst_fc_deref_56_slice_match = [];
|
|
let r = inst_repeat_fc_deref_56_slice_match{id=7: size, origin=3: size, min=(11: size), max=(22: size)};
|
|
append(insts, r);
|
|
let p = &insts[0];
|
|
match (*p) {
|
|
case let ir: inst_repeat_fc_deref_56_slice_match => {
|
|
assert(!(ir.id != 7));
|
|
assert(!(!(ir.min is size)));
|
|
assert(!((ir.max as size) != 22));
|
|
};
|
|
case let l: inst_lit_fc_deref_56_slice_match => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type four_b22_big_box_mlet = struct { a: u64, b: u64, c: u64, d: u64, };
|
|
|
|
fn g_b22_big_box_mlet() (void | four_b22_big_box_mlet) = {
|
|
let v: four_b22_big_box_mlet = four_b22_big_box_mlet{a=1u64, b=2u64, c=3u64, d=4u64};
|
|
return v;
|
|
};
|
|
|
|
fn pr_b22_big_box_mlet() ((void | four_b22_big_box_mlet), size) = {
|
|
let e: (void | four_b22_big_box_mlet) = g_b22_big_box_mlet();
|
|
return (e, 7);
|
|
};
|
|
|
|
@test fn b22_big_box_mlet() void = {
|
|
let e2 = g_b22_big_box_mlet();
|
|
assert(!(!(e2 is four_b22_big_box_mlet)));
|
|
let (e, n) = pr_b22_big_box_mlet();
|
|
assert(!(n != 7));
|
|
assert(!(!(e is four_b22_big_box_mlet)));
|
|
};
|
|
|
|
fn mk_b22_void_elem_k4() (void, size, size, size, size, size) = {
|
|
return (void, 1, 2, 3, 4, 5);
|
|
};
|
|
|
|
@test fn b22_void_elem_k4() void = {
|
|
let (v, a, b, c, d, e) = mk_b22_void_elem_k4();
|
|
assert(!(a != 1));
|
|
assert(!(b != 2));
|
|
assert(!(c != 3));
|
|
assert(!(d != 4));
|
|
assert(!(e != 5));
|
|
};
|
|
|
|
fn mk_b22_k5_box_at_cap() ((void | str), size, size) = {
|
|
let m: (void | str) = "boundary";
|
|
return (m, 5, 6);
|
|
};
|
|
|
|
@test fn b22_k5_box_at_cap() void = {
|
|
let t = mk_b22_k5_box_at_cap();
|
|
assert(!(!(t.0 is str)));
|
|
match (t.0) {
|
|
case let s: str => {
|
|
assert(!(s.len != 8));
|
|
};
|
|
case void => { assert(false); };
|
|
};
|
|
assert(!(t.1 != 5));
|
|
assert(!(t.2 != 6));
|
|
};
|
|
|
|
fn pr_b22_both_tagged_2elem() ((void | str), (void | size)) = {
|
|
let a: (void | str) = "boundary";
|
|
let b: (void | size) = 7: size;
|
|
return (a, b);
|
|
};
|
|
|
|
@test fn b22_both_tagged_2elem() void = {
|
|
let t = pr_b22_both_tagged_2elem();
|
|
assert(!(!(t.0 is str)));
|
|
match (t.0) {
|
|
case let s: str => { assert(!(s.len != 8)); };
|
|
case void => { assert(false); };
|
|
};
|
|
assert(!(!(t.1 is size)));
|
|
assert(!(t.1 as size != 7));
|
|
let (x, y) = pr_b22_both_tagged_2elem();
|
|
assert(!(!(x is str)));
|
|
assert(!(y as size != 7));
|
|
};
|
|
|
|
fn g_b22_chained_sret() ((void | size), (void | size), size) = {
|
|
let mn: (void | size) = 3: size;
|
|
let mx: (void | size) = 5: size;
|
|
return (mn, mx, 9);
|
|
};
|
|
|
|
fn h_b22_chained_sret() ((void | size), (void | size), size) = {
|
|
let (a, b, n) = g_b22_chained_sret();
|
|
return (a, b, n + 1);
|
|
};
|
|
|
|
@test fn b22_chained_sret() void = {
|
|
let t = h_b22_chained_sret();
|
|
assert(!(t.0 as size != 3));
|
|
assert(!(t.1 as size != 5));
|
|
assert(!(t.2 != 10));
|
|
};
|
|
|
|
fn f_sret_narrow_mix_let() (str, u32, str) = {
|
|
let a: str = "abc";
|
|
let b: u32 = 7;
|
|
let c: str = "wxyz";
|
|
return (a, b, c);
|
|
};
|
|
|
|
@test fn sret_narrow_mix_let() void = {
|
|
let t = f_sret_narrow_mix_let();
|
|
assert(!(len(t.0) != 3));
|
|
assert(!(t.1 != 7));
|
|
assert(!(len(t.2) != 4));
|
|
};
|
|
|
|
fn f_sret_narrow_mix_mlet() (str, u32, str) = {
|
|
let a: str = "abc";
|
|
let b: u32 = 7;
|
|
let c: str = "wxyz";
|
|
return (a, b, c);
|
|
};
|
|
|
|
@test fn sret_narrow_mix_mlet() void = {
|
|
let (a, b, c) = f_sret_narrow_mix_mlet();
|
|
assert(!(len(a) != 3));
|
|
assert(!(b != 7));
|
|
assert(!(len(c) != 4));
|
|
};
|
|
|
|
fn f_sret_narrow_mix_massign() (str, u32, str) = {
|
|
let a: str = "abc";
|
|
let b: u32 = 7;
|
|
let c: str = "wxyz";
|
|
return (a, b, c);
|
|
};
|
|
|
|
@test fn sret_narrow_mix_massign() void = {
|
|
let a: str = "";
|
|
let b: u32 = 0;
|
|
let c: str = "";
|
|
a, b, c = f_sret_narrow_mix_massign();
|
|
assert(!(len(a) != 3));
|
|
assert(!(b != 7));
|
|
assert(!(len(c) != 4));
|
|
};
|
|
|
|
fn second_t1_lit_packed() u32 = {
|
|
let t: (u32, u32) = (3, 4);
|
|
if (t.0 != 3) { return 99; };
|
|
return t.1;
|
|
};
|
|
|
|
@test fn t1_lit_packed() void = {
|
|
assert(!(second_t1_lit_packed() != 4));
|
|
};
|
|
|
|
@test fn t1_lit_16() void = {
|
|
let t: (i64, i64) = (3, 4);
|
|
assert(!(t.0 != 3));
|
|
assert(!(t.1 != 4));
|
|
};
|
|
|
|
@test fn t1_lit_mixed() void = {
|
|
let t: (i64, str) = (12, "wxyz");
|
|
assert(!(t.0 != 12));
|
|
assert(!(len(t.1) != 4));
|
|
};
|
|
|
|
fn second_t1_lit_3scalar() i64 = {
|
|
let t: (i64, i64, i64) = (3, 4, 5);
|
|
if (t.0 != 3) { return -1; };
|
|
if (t.1 != 4) { return -2; };
|
|
return t.2;
|
|
};
|
|
|
|
@test fn t1_lit_3scalar() void = {
|
|
assert(!(second_t1_lit_3scalar() != 5));
|
|
};
|
|
|
|
fn f_t1_call_3scalar() (i64, i64, i64) = {
|
|
return (7, 8, 9);
|
|
};
|
|
|
|
@test fn t1_call_3scalar() void = {
|
|
let t: (i64, i64, i64) = f_t1_call_3scalar();
|
|
assert(!(t.0 != 7));
|
|
assert(!(t.1 != 8));
|
|
assert(!(t.2 != 9));
|
|
};
|
|
|
|
fn f_t1_call_noannot_neutral() (i64, i64) = {
|
|
return (3, 4);
|
|
};
|
|
|
|
@test fn t1_call_noannot_neutral() void = {
|
|
let t = f_t1_call_noannot_neutral();
|
|
assert(!(t.0 != 3));
|
|
assert(!(t.1 != 4));
|
|
};
|
|
|
|
fn pick_t2_param_packed(t: (u32, u32), k: i32) u32 = {
|
|
if (k == 0) { return t.0; };
|
|
return t.1;
|
|
};
|
|
|
|
@test fn t2_param_packed() void = {
|
|
let t: (u32, u32) = (41, 17);
|
|
assert(!(pick_t2_param_packed(t, 0) != 41));
|
|
assert(!(pick_t2_param_packed(t, 1) != 17));
|
|
};
|
|
|
|
fn pick_t2_param_16(t: (i64, i64), k: i32) i64 = {
|
|
if (k == 0) { return t.0; };
|
|
return t.1;
|
|
};
|
|
|
|
@test fn t2_param_16() void = {
|
|
let t: (i64, i64) = (41, 17);
|
|
assert(!(pick_t2_param_16(t, 0) != 41));
|
|
assert(!(pick_t2_param_16(t, 1) != 17));
|
|
};
|
|
|
|
fn g_t2_mixed_order(a: i64, t: (u32, u32), b: i64) i64 = {
|
|
return a*1000 + (t.0: i64)*100 + (t.1: i64)*10 + b;
|
|
};
|
|
|
|
fn h_t2_mixed_order(t: (i64, i64), s: str, k: i64) i64 = {
|
|
return t.0 + t.1 + (len(s): i64) + k;
|
|
};
|
|
|
|
@test fn t2_mixed_order() void = {
|
|
let t: (u32, u32) = (3, 4);
|
|
assert(!(g_t2_mixed_order(1, t, 2) != 1342));
|
|
let u: (i64, i64) = (10, 20);
|
|
assert(!(h_t2_mixed_order(u, "abc", 7) != 40));
|
|
};
|
|
|
|
fn pick_t2_lit_arg(t: (i64, i64), k: i32) i64 = {
|
|
if (k == 0) { return t.0; };
|
|
return t.1;
|
|
};
|
|
|
|
@test fn t2_lit_arg() void = {
|
|
assert(!(pick_t2_lit_arg((41, 17), 0) != 41));
|
|
assert(!(pick_t2_lit_arg((41, 17), 1) != 17));
|
|
};
|
|
|
|
fn fsum_t2_float_param(t: (f64, i64)) f64 = {
|
|
return t.0 + (t.1: f64);
|
|
};
|
|
|
|
@test fn t2_float_param() void = {
|
|
let t: (f64, i64) = (2.5, 4);
|
|
assert(!(fsum_t2_float_param(t) != 6.5));
|
|
};
|
|
|
|
fn mk_t2_unwrap_arg() ((i64, i64) | nomem) = {
|
|
let a: i64 = 5;
|
|
let b: i64 = 6;
|
|
return (a, b);
|
|
};
|
|
|
|
fn sum_t2_unwrap_arg(t: (i64, i64)) i64 = {
|
|
return t.0 + t.1;
|
|
};
|
|
|
|
@test fn t2_unwrap_arg() void = {
|
|
assert(!(sum_t2_unwrap_arg(mk_t2_unwrap_arg()!) != 11));
|
|
};
|
|
|
|
fn f_t2_gp_pressure(a: i64, b: i64, c: i64, d: i64, t: (i64, i64), e: i64) i64 = {
|
|
if (e != 60) { return -1; };
|
|
if (a != 1 || b != 2 || c != 3 || d != 4) { return -2; };
|
|
return t.0 * 100 + t.1;
|
|
};
|
|
|
|
@test fn t2_gp_pressure() void = {
|
|
let t: (i64, i64) = (7, 9);
|
|
assert(!(f_t2_gp_pressure(1, 2, 3, 4, t, 60) != 709));
|
|
};
|
|
|
|
fn g_t2_variadic_after_tuple(t: (i64, i64), xs: i64...) i64 = {
|
|
let s: i64 = t.0 + t.1;
|
|
for (let x .. xs) { s += x; };
|
|
return s;
|
|
};
|
|
|
|
@test fn t2_variadic_after_tuple() void = {
|
|
let t: (i64, i64) = (3, 4);
|
|
assert(!(g_t2_variadic_after_tuple(t, 1, 2) != 10));
|
|
};
|
|
|
|
fn first_t2_variadic_of_tuples(ts: (i64, i64)...) i64 = {
|
|
if (len(ts) == 0) { return -1; };
|
|
return ts[0].0;
|
|
};
|
|
|
|
@test fn t2_variadic_of_tuples() void = {
|
|
let t: (i64, i64) = (3, 4);
|
|
assert(!(first_t2_variadic_of_tuples(t) != 3));
|
|
};
|
|
|
|
let g_t3_global_elem: (str, i64) = ("hello", 9);
|
|
let h_t3_global_elem: (u32, u32) = (5, 6);
|
|
|
|
@test fn t3_global_elem() void = {
|
|
assert(!(len(g_t3_global_elem.0) != 5));
|
|
assert(!(g_t3_global_elem.1 != 9));
|
|
assert(!(h_t3_global_elem.0 != 5));
|
|
assert(!(h_t3_global_elem.1 != 6));
|
|
};
|
|
|
|
fn take_fc_arg_deref_16(e: (void | size)) size = {
|
|
if (!(e is size)) { return 99; };
|
|
return e as size;
|
|
};
|
|
|
|
@test fn fc_arg_deref_16() void = {
|
|
let v: (void | size) = 7: size;
|
|
let p: *(void | size) = &v;
|
|
assert(!(take_fc_arg_deref_16(*p) != 7));
|
|
};
|
|
|
|
type un16_fc_deref_let_match_16 = (void | size);
|
|
|
|
@test fn fc_deref_let_match_16() void = {
|
|
let v: un16_fc_deref_let_match_16 = 5: size;
|
|
let p: *un16_fc_deref_let_match_16 = &v;
|
|
let w = *p;
|
|
assert(!(!(w is size)));
|
|
match (*p) {
|
|
case let s: size => { assert(!(s != 5)); };
|
|
case void => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type un32_fc_deref_let_match_32str = (void | str);
|
|
|
|
@test fn fc_deref_let_match_32str() void = {
|
|
let v: un32_fc_deref_let_match_32str = "atcap";
|
|
let p: *un32_fc_deref_let_match_32str = &v;
|
|
let w = *p;
|
|
assert(!(!(w is str)));
|
|
match (*p) {
|
|
case let s: str => { assert(!(s.len != 5)); };
|
|
case void => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type un16_fc_deref_asg_16 = (void | size);
|
|
|
|
@test fn fc_deref_asg_16() void = {
|
|
let v: un16_fc_deref_asg_16 = 5: size;
|
|
let p: *un16_fc_deref_asg_16 = &v;
|
|
let w: un16_fc_deref_asg_16 = void;
|
|
w = *p;
|
|
assert(!(!(w is size)));
|
|
assert(!((w as size) != 5));
|
|
};
|
|
|
|
type un16_fc_deref_ret_16 = (void | size);
|
|
|
|
fn get_fc_deref_ret_16(p: *un16_fc_deref_ret_16) un16_fc_deref_ret_16 = {
|
|
return *p;
|
|
};
|
|
|
|
@test fn fc_deref_ret_16() void = {
|
|
let v: un16_fc_deref_ret_16 = 5: size;
|
|
let w = get_fc_deref_ret_16(&v);
|
|
assert(!(!(w is size)));
|
|
assert(!((w as size) != 5));
|
|
};
|
|
|
|
type un16_fc_deref_is_as_16 = (void | size);
|
|
|
|
@test fn fc_deref_is_as_16() void = {
|
|
let v: un16_fc_deref_is_as_16 = 5: size;
|
|
let p: *un16_fc_deref_is_as_16 = &v;
|
|
assert(!(!((*p) is size)));
|
|
assert(!(((*p) as size) != 5));
|
|
};
|
|
|
|
type un32_fc_deref_as_32str = (void | str);
|
|
|
|
@test fn fc_deref_as_32str() void = {
|
|
let v: un32_fc_deref_as_32str = "atcap";
|
|
let p: *un32_fc_deref_as_32str = &v;
|
|
let s = (*p) as str;
|
|
assert(!(s.len != 5));
|
|
};
|
|
|
|
type un32_fc_deref_arg_32str = (void | str);
|
|
|
|
fn take_fc_deref_arg_32str(e: un32_fc_deref_arg_32str) i32 = {
|
|
if (!(e is str)) { return 99; };
|
|
let s = e as str;
|
|
if (s.len != 5) { return 98; };
|
|
return 0;
|
|
};
|
|
|
|
@test fn fc_deref_arg_32str() void = {
|
|
let v: un32_fc_deref_arg_32str = "atcap";
|
|
let p: *un32_fc_deref_arg_32str = &v;
|
|
assert(!(take_fc_deref_arg_32str(*p) != 0));
|
|
};
|
|
|
|
type un16_fc_deref_widen_16to24 = (void | size);
|
|
type un3_fc_deref_widen_16to24 = (void | size | str);
|
|
|
|
@test fn fc_deref_widen_16to24() void = {
|
|
let v: un16_fc_deref_widen_16to24 = 5: size;
|
|
let p: *un16_fc_deref_widen_16to24 = &v;
|
|
let w: un3_fc_deref_widen_16to24 = *p;
|
|
assert(!(!(w is size)));
|
|
assert(!((w as size) != 5));
|
|
};
|
|
|
|
type s2_fc_deref_struct24_neighbor = struct { a: size, b: size };
|
|
type un24_fc_deref_struct24_neighbor = (void | s2_fc_deref_struct24_neighbor);
|
|
|
|
@test fn fc_deref_struct24_neighbor() void = {
|
|
let lo: size = 111;
|
|
let v: un24_fc_deref_struct24_neighbor = s2_fc_deref_struct24_neighbor { a = 5, b = 6 };
|
|
let hi: size = 222;
|
|
let p: *un24_fc_deref_struct24_neighbor = &v;
|
|
let w = *p;
|
|
assert(!(!(w is s2_fc_deref_struct24_neighbor)));
|
|
match (w) {
|
|
case let s: s2_fc_deref_struct24_neighbor => { assert(!(s.a != 5 || s.b != 6)); };
|
|
case void => { assert(false); };
|
|
};
|
|
assert(!(lo != 111));
|
|
assert(!(hi != 222));
|
|
};
|
|
|
|
type big_fc_deref_56_memread = struct { a: u64, b: u64, c: u64, d: u64, e: u64, f: u64 };
|
|
type un56_fc_deref_56_memread = (void | big_fc_deref_56_memread);
|
|
|
|
@test fn fc_deref_56_memread() void = {
|
|
let v: un56_fc_deref_56_memread = big_fc_deref_56_memread { a = 1u64, b = 2u64, c = 3u64, d = 4u64, e = 5u64, f = 6u64 };
|
|
let p: *un56_fc_deref_56_memread = &v;
|
|
let w = *p;
|
|
assert(!(!(w is big_fc_deref_56_memread)));
|
|
match (*p) {
|
|
case let s: big_fc_deref_56_memread => { assert(!(s.a != 1u64 || s.f != 6u64)); };
|
|
case void => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type un16_fc_cast_ident_arg = (void | size);
|
|
|
|
fn take_fc_cast_ident_arg(e: un16_fc_cast_ident_arg) size = {
|
|
if (!(e is size)) { return 99; };
|
|
return e as size;
|
|
};
|
|
|
|
@test fn fc_cast_ident_arg() void = {
|
|
let v: un16_fc_cast_ident_arg = 7: size;
|
|
assert(!(take_fc_cast_ident_arg((v: un16_fc_cast_ident_arg)) != 7));
|
|
};
|
|
|
|
type un16_fc_cast_widen_let = (void | size);
|
|
type un3_fc_cast_widen_let = (void | size | str);
|
|
|
|
@test fn fc_cast_widen_let() void = {
|
|
let v: un16_fc_cast_widen_let = 5: size;
|
|
let w: un3_fc_cast_widen_let = (v: un3_fc_cast_widen_let);
|
|
assert(!(!(w is size)));
|
|
assert(!((w as size) != 5));
|
|
};
|
|
|
|
type un16_fc_unwrap_tagged_let = (void | size);
|
|
type err_fc_unwrap_tagged_let = !void;
|
|
|
|
fn get_fc_unwrap_tagged_let() (un16_fc_unwrap_tagged_let | err_fc_unwrap_tagged_let) = {
|
|
let v: un16_fc_unwrap_tagged_let = 7: size;
|
|
return v;
|
|
};
|
|
|
|
fn use_fc_unwrap_tagged_let() (size | err_fc_unwrap_tagged_let) = {
|
|
let w = get_fc_unwrap_tagged_let()?;
|
|
if (!(w is size)) { return 99; };
|
|
return w as size;
|
|
};
|
|
|
|
@test fn fc_unwrap_tagged_let() void = {
|
|
match (use_fc_unwrap_tagged_let()) {
|
|
case let s: size => { assert(!(s != 7)); };
|
|
case err_fc_unwrap_tagged_let => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type err_fc_unwrap_ident = !void;
|
|
|
|
fn use_fc_unwrap_ident(v: (size | err_fc_unwrap_ident)) (size | err_fc_unwrap_ident) = {
|
|
let w = v?;
|
|
return w: size;
|
|
};
|
|
|
|
@test fn fc_unwrap_ident() void = {
|
|
let v: (size | err_fc_unwrap_ident) = 7: size;
|
|
match (use_fc_unwrap_ident(v)) {
|
|
case let s: size => { assert(!(s != 7)); };
|
|
case err_fc_unwrap_ident => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type err_fc_unwrap_deref = !void;
|
|
|
|
fn use_fc_unwrap_deref(p: *(size | err_fc_unwrap_deref)) (size | err_fc_unwrap_deref) = {
|
|
let x = (*p)?;
|
|
return x: size;
|
|
};
|
|
|
|
@test fn fc_unwrap_deref() void = {
|
|
let v: (size | err_fc_unwrap_deref) = 7: size;
|
|
match (use_fc_unwrap_deref(&v)) {
|
|
case let s: size => { assert(!(s != 7)); };
|
|
case err_fc_unwrap_deref => { assert(false); };
|
|
};
|
|
};
|
|
|
|
type un16_fc_cast_deref_arg = (void | size);
|
|
|
|
fn take_fc_cast_deref_arg(e: un16_fc_cast_deref_arg) size = {
|
|
if (!(e is size)) { return 99; };
|
|
return e as size;
|
|
};
|
|
|
|
@test fn fc_cast_deref_arg() void = {
|
|
let v: un16_fc_cast_deref_arg = 7: size;
|
|
let p: *un16_fc_cast_deref_arg = &v;
|
|
assert(!(take_fc_cast_deref_arg(((*p): un16_fc_cast_deref_arg)) != 7));
|
|
};
|
|
|
|
type un16_fc_deref_void_16 = (void | size);
|
|
|
|
@test fn fc_deref_void_16() void = {
|
|
let v: un16_fc_deref_void_16 = void;
|
|
let p: *un16_fc_deref_void_16 = &v;
|
|
match (*p) {
|
|
case let s: size => { assert(false); };
|
|
case void => { };
|
|
};
|
|
assert(!((*p) is size));
|
|
let w = *p;
|
|
assert(!(!(w is void)));
|
|
};
|
|
|
|
type un16_fc_deref_slice_elem_16 = (void | size);
|
|
|
|
@test fn fc_deref_slice_elem_16() void = {
|
|
let xs: []un16_fc_deref_slice_elem_16 = [];
|
|
append(xs, 11: size);
|
|
append(xs, void);
|
|
let p: *un16_fc_deref_slice_elem_16 = &xs[0];
|
|
match (*p) {
|
|
case let s: size => { assert(!(s != 11)); };
|
|
case void => { assert(false); };
|
|
};
|
|
let q: *un16_fc_deref_slice_elem_16 = &xs[1];
|
|
assert(!(!((*q) is void)));
|
|
};
|
|
|
|
type big4_fc_deref_arg_40 = struct { a: u64, b: u64, c: u64, d: u64 };
|
|
type un40_fc_deref_arg_40 = (void | big4_fc_deref_arg_40);
|
|
|
|
fn take_fc_deref_arg_40(e: un40_fc_deref_arg_40) u64 = {
|
|
match (e) {
|
|
case let g: big4_fc_deref_arg_40 => {
|
|
if (g.b != 2u64 || g.c != 3u64) { return 90u64; };
|
|
return g.a + g.d;
|
|
};
|
|
case void => { return 0u64; };
|
|
};
|
|
};
|
|
|
|
@test fn fc_deref_arg_40() void = {
|
|
let v: un40_fc_deref_arg_40 = big4_fc_deref_arg_40 { a = 30u64, b = 2u64, c = 3u64, d = 12u64 };
|
|
let p: *un40_fc_deref_arg_40 = &v;
|
|
assert(!(take_fc_deref_arg_40(*p) != 42u64));
|
|
};
|
|
|
|
type big_fc_deref_arg_56 = struct { a: u64, b: u64, c: u64, d: u64, e: u64, f: u64 };
|
|
type un56_fc_deref_arg_56 = (void | big_fc_deref_arg_56);
|
|
|
|
fn take_fc_deref_arg_56(e: un56_fc_deref_arg_56) u64 = {
|
|
match (e) {
|
|
case let g: big_fc_deref_arg_56 => {
|
|
if (g.b != 2u64 || g.e != 5u64) { return 90u64; };
|
|
return g.a + g.f;
|
|
};
|
|
case void => { return 0u64; };
|
|
};
|
|
};
|
|
|
|
@test fn fc_deref_arg_56() void = {
|
|
let v: un56_fc_deref_arg_56 = big_fc_deref_arg_56 { a = 30u64, b = 2u64, c = 3u64, d = 4u64, e = 5u64, f = 12u64 };
|
|
let p: *un56_fc_deref_arg_56 = &v;
|
|
assert(!(take_fc_deref_arg_56(*p) != 42u64));
|
|
};
|
|
|
|
type un16_fc_arg_balance_multi = (void | size);
|
|
|
|
fn take_fc_arg_balance_multi(a: size, e: un16_fc_arg_balance_multi, b: size) size = {
|
|
if (a != 100) { return 90; };
|
|
if (!(e is size)) { return 91; };
|
|
if ((e as size) != 7) { return 92; };
|
|
if (b != 200) { return 93; };
|
|
return a + (e as size) + b;
|
|
};
|
|
|
|
@test fn fc_arg_balance_multi() void = {
|
|
let v: un16_fc_arg_balance_multi = 7: size;
|
|
let p: *un16_fc_arg_balance_multi = &v;
|
|
assert(!(take_fc_arg_balance_multi(100, *p, 200) != 307));
|
|
assert(!(take_fc_arg_balance_multi(100, *p, 200) != 307));
|
|
};
|
|
|
|
@test fn t44_inferred_let_cast() void = {
|
|
let t = (4: size, 2: size);
|
|
assert(!(t.0 != 4));
|
|
assert(!(t.1 != 2));
|
|
};
|
|
|
|
@test fn t44_inferred_let_bare() void = {
|
|
let t = (4, 2);
|
|
assert(!(t.0 != 4));
|
|
assert(!(t.1 != 2));
|
|
};
|
|
|
|
@test fn t44_inferred_let_mixed3() void = {
|
|
let t = (4: size, 2, 36: size);
|
|
assert(!(t.0 + t.2 != 40));
|
|
assert(!(t.1 != 2));
|
|
};
|
|
|
|
@test fn t44_inferred_let_float() void = {
|
|
let t = (1.5, 2.5);
|
|
assert(!(t.0 + t.1 != 4.0));
|
|
};
|
|
|
|
@test fn t44_inferred_destructure() void = {
|
|
let t = (40: size, 2: size);
|
|
let (a, b) = t;
|
|
assert(!(a + b != 42));
|
|
};
|
|
|
|
fn add_t44_inferred_arg(t: (size, size)) size = {
|
|
return t.0 + t.1;
|
|
};
|
|
|
|
@test fn t44_inferred_arg() void = {
|
|
let t = (40: size, 2: size);
|
|
assert(!(add_t44_inferred_arg(t) != 42));
|
|
};
|
|
|
|
type un16_t57_ret_cast_elem = (void | size);
|
|
|
|
fn mk_t57_ret_cast_elem() (un16_t57_ret_cast_elem, size) = {
|
|
return (5: size, 9);
|
|
};
|
|
|
|
@test fn t57_ret_cast_elem() void = {
|
|
let t = mk_t57_ret_cast_elem();
|
|
assert(!(t.1 != 9));
|
|
let (a, b) = mk_t57_ret_cast_elem();
|
|
assert(!(!(a is size)));
|
|
assert(!(a as size != 5));
|
|
assert(!(b != 9));
|
|
};
|
|
|
|
fn mk_t57_ret_inline_union() ((void | size), size) = {
|
|
return (5: size, 9);
|
|
};
|
|
|
|
@test fn t57_ret_inline_union() void = {
|
|
let (a, b) = mk_t57_ret_inline_union();
|
|
assert(!(!(a is size)));
|
|
assert(!(b != 9));
|
|
assert(!(a as size != 5));
|
|
};
|
|
|
|
type un16_t57_let_literal = (void | size);
|
|
|
|
@test fn t57_let_literal() void = {
|
|
let t: (un16_t57_let_literal, size) = (5: size, 9);
|
|
assert(!(t.1 != 9));
|
|
assert(!(!(t.0 is size)));
|
|
assert(!(t.0 as size != 5));
|
|
};
|
|
|
|
type un16_t57_tagged_second_elem = (void | size);
|
|
|
|
fn mk2_t57_tagged_second_elem() (size, un16_t57_tagged_second_elem) = {
|
|
return (3, 7: size);
|
|
};
|
|
|
|
@test fn t57_tagged_second_elem() void = {
|
|
let (a, b) = mk2_t57_tagged_second_elem();
|
|
assert(!(a != 3));
|
|
assert(!(!(b is size)));
|
|
assert(!(b as size != 7));
|
|
};
|
|
|
|
type unf_t57_float_payload = (void | f64);
|
|
|
|
fn mkf_t57_float_payload() (unf_t57_float_payload, size) = {
|
|
return (1.5, 9);
|
|
};
|
|
|
|
@test fn t57_float_payload() void = {
|
|
let (a, b) = mkf_t57_float_payload();
|
|
assert(!(b != 9));
|
|
assert(!(!(a is f64)));
|
|
assert(!(a as f64 != 1.5));
|
|
};
|
|
|
|
type un_t57_tagged_mid_elem = (void | size);
|
|
|
|
fn mk3_t57_tagged_mid_elem() (size, un_t57_tagged_mid_elem, size) = {
|
|
return (1, 5: size, 9);
|
|
};
|
|
|
|
@test fn t57_tagged_mid_elem() void = {
|
|
let (a, b, c) = mk3_t57_tagged_mid_elem();
|
|
assert(!(a != 1));
|
|
assert(!(!(b is size)));
|
|
assert(!(b as size != 5));
|
|
assert(!(c != 9));
|
|
};
|
|
|
|
type un_t57_two_tagged_void_elem = (void | size);
|
|
|
|
fn mk_t57_two_tagged_void_elem() (un_t57_two_tagged_void_elem, un_t57_two_tagged_void_elem) = {
|
|
return (5: size, void);
|
|
};
|
|
|
|
@test fn t57_two_tagged_void_elem() void = {
|
|
let t = mk_t57_two_tagged_void_elem();
|
|
assert(!(!(t.0 is size)));
|
|
assert(!(t.0 as size != 5));
|
|
assert(!(!(t.1 is void)));
|
|
};
|
|
|
|
type un_t57_sse_coexist = (void | size);
|
|
|
|
fn mk_t57_sse_coexist() (f64, un_t57_sse_coexist) = {
|
|
return (0.5, 7: size);
|
|
};
|
|
|
|
@test fn t57_sse_coexist() void = {
|
|
let (x, e) = mk_t57_sse_coexist();
|
|
assert(!(x * 4.0 != 2.0));
|
|
assert(!(!(e is size)));
|
|
assert(!(e as size != 7));
|
|
};
|
|
|
|
type un16_t57_bare_untyped_payload = (void | size);
|
|
|
|
fn mkb_t57_bare_untyped_payload() (un16_t57_bare_untyped_payload, size) = {
|
|
return (5, 9);
|
|
};
|
|
|
|
@test fn t57_bare_untyped_payload() void = {
|
|
let (a, b) = mkb_t57_bare_untyped_payload();
|
|
assert(!(!(a is size)));
|
|
assert(!(a as size != 5));
|
|
assert(!(b != 9));
|
|
};
|
|
|
|
type un16_t57_ident_no_regress = (void | size);
|
|
|
|
fn mk_t57_ident_no_regress() (un16_t57_ident_no_regress, size) = {
|
|
let e: un16_t57_ident_no_regress = 5: size;
|
|
return (e, 9);
|
|
};
|
|
|
|
@test fn t57_ident_no_regress() void = {
|
|
let t = mk_t57_ident_no_regress();
|
|
assert(!(t.1 != 9));
|
|
assert(!(!(t.0 is size)));
|
|
assert(!(t.0 as size != 5));
|
|
};
|