//ww:run package main; type s6 = struct { a: i64, b: i64, c: i64, d: i64, e: i64, f: i64 }; type cell = (s6 | bool); type thread = struct { pc: i64, matched: bool }; fn i64_first() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); delete(xs[0]); return (xs[0] + xs[1]): i32 + len(xs)*10; }; fn i64_middle() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); delete(xs[1]); return (xs[0] + xs[1]): i32 + len(xs)*10; }; fn i64_last() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); delete(xs[2]); return (xs[0] + xs[1]): i32 + len(xs)*10; }; fn i32_narrow() i32 = { let xs: []i32 = []; append(xs, 4i32); append(xs, 9i32); append(xs, 2i32); delete(xs[0]); return xs[0] + xs[1]*10 + len(xs)*100; }; fn u16_narrow() i32 = { let xs: []u16 = []; append(xs, 4u16); append(xs, 9u16); append(xs, 2u16); delete(xs[1]); return (xs[0] + xs[1]): i32 + len(xs)*10; }; fn u8_narrow() i32 = { let xs: []u8 = []; append(xs, 5u8); append(xs, 9u8); append(xs, 3u8); delete(xs[1]); return (xs[0] + xs[1]): i32 + len(xs)*10; }; fn cap_unchanged() i32 = { let hb: [8]u8; hb[0] = 4u8; hb[1] = 6u8; hb[2] = 9u8; let xs: []u8; xs.ptr = &hb[0]; xs.len = 3; xs.cap = 8; delete(xs[1]); return (xs.cap*10 + xs.len): i32 + xs[1]: i32; }; fn delete_to_empty() i32 = { let xs: []u8 = []; append(xs, 5u8); delete(xs[0]); return len(xs) + 7; }; fn str_elem() i32 = { let xs: []str = []; let a: str = "abc"; let b: str = "de"; let g: str = "fghi"; append(xs, a); append(xs, b); append(xs, g); delete(xs[1]); return (xs[0].len*10 + xs[1].len): i32 + len(xs)*100; }; fn tagged_56b() i32 = { let xs: []cell = []; let p0: s6 = s6 { a = 1, b = 2, c = 3, d = 4, e = 5, f = 6 }; let p1: s6 = s6 { a = 7, b = 8, c = 9, d = 10, e = 11, f = 12 }; let p2: s6 = s6 { a = 13, b = 14, c = 15, d = 16, e = 17, f = 18 }; append(xs, p0); append(xs, p1); append(xs, p2); delete(xs[1]); let r: i32 = 0; match (xs[1]) { case let s: s6 => r = s.a: i32; case bool => r = 99; }; let bp: *u8 = xs.ptr: *u8; r += bp[104]: i32; return r + len(xs)*100; }; fn delete_thread(i: i64, threads: *[]thread) void = { delete((*threads)[i]); }; fn regex_shape() i32 = { let xs: []thread = []; append(xs, thread { pc = 1, matched = false }); append(xs, thread { pc = 2, matched = false }); append(xs, thread { pc = 3, matched = false }); delete_thread(1, &xs); let r: i32 = (xs[0].pc + xs[1].pc): i32; return r + len(xs)*10; }; fn delete_in_loop() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 2); append(xs, 3); append(xs, 4); let acc: i64 = 0; for (len(xs) > 0) { acc = acc*4 + xs[0]; delete(xs[0]); }; return acc: i32 + len(xs)*1000; }; export fn main() i32 = { if (i64_first() != 44) { return 1; }; if (i64_middle() != 40) { return 2; }; if (i64_last() != 38) { return 3; }; if (i32_narrow() != 229) { return 4; }; if (u16_narrow() != 26) { return 5; }; if (u8_narrow() != 28) { return 6; }; if (cap_unchanged() != 91) { return 7; }; if (delete_to_empty() != 7) { return 8; }; if (str_elem() != 234) { return 9; }; if (tagged_56b() != 231) { return 10; }; if (regex_shape() != 24) { return 11; }; if (delete_in_loop() != 112) { return 12; }; return 0; };