//ww:run package main; type pair = struct { a: i64, b: i64 }; fn full_range() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); delete(xs[:]); return len(xs): i32 + 7; }; fn full_explicit() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); delete(xs[0:3]); return len(xs): i32 + 8; }; fn full_twice() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); delete(xs[:]); delete(xs[:]); return len(xs): i32 + 9; }; fn head() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 2); append(xs, 3); delete(xs[:2]); return xs[0]: i32 + len(xs)*10; }; fn mid() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 2); append(xs, 3); append(xs, 4); append(xs, 5); delete(xs[1:3]); return (xs[0]*100 + xs[1]*10 + xs[2]): i32 + len(xs); }; fn tail_open() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 2); append(xs, 3); delete(xs[1:]); return xs[0]: i32 + len(xs)*10; }; fn empty_range() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 2); delete(xs[1:1]); return (xs[0] + xs[1]): i32 + len(xs)*10; }; fn end_boundary() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 2); delete(xs[len(xs):len(xs)]); return (xs[0]*10 + xs[1]): i32 + len(xs)*100; }; fn empty_explicit() i32 = { let xs: []i64 = []; delete(xs[0:0]); return len(xs): i32 + 31; }; fn single_via_range() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); delete(xs[1:2]); let ys: []i64 = []; append(ys, 7); append(ys, 11); append(ys, 13); delete(ys[1]); if (len(xs) != len(ys)) { return 99; }; if (xs[0] != ys[0]) { return 98; }; if (xs[1] != ys[1]) { return 97; }; return 42; }; fn cap_preserved() 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[:]); return (xs.cap*10 + xs.len): i32; }; fn u8_narrow() i32 = { let xs: []u8 = []; append(xs, 1u8); append(xs, 2u8); append(xs, 3u8); append(xs, 4u8); append(xs, 5u8); delete(xs[1:4]); return (xs[0]*10u8 + xs[1]): i32 + len(xs)*100; }; fn u16_narrow() i32 = { let xs: []u16 = []; append(xs, 1u16); append(xs, 2u16); append(xs, 3u16); append(xs, 4u16); delete(xs[1:3]); return (xs[0] + xs[1]): i32 + len(xs)*10; }; fn i32_narrow() i32 = { let xs: []i32 = []; append(xs, 10i32); append(xs, 20i32); append(xs, 30i32); append(xs, 40i32); delete(xs[2:4]); return xs[0] + xs[1] + len(xs)*10; }; fn struct16() i32 = { let xs: []pair = []; append(xs, pair { a = 1, b = 2 }); append(xs, pair { a = 3, b = 4 }); append(xs, pair { a = 5, b = 6 }); delete(xs[1:2]); return (xs[0].a*10 + xs[1].b): i32 + len(xs)*100; }; fn str_elem() i32 = { let xs: []str = []; let a: str = "abc"; let b: str = "de"; let g: str = "fghi"; let h: str = "jklmn"; append(xs, a); append(xs, b); append(xs, g); append(xs, h); delete(xs[1:3]); return (xs[0].len*10 + xs[1].len): i32 + len(xs)*100; }; fn regex_exact() i32 = { let jump_idxs: [][]size = []; let lvl0: []size = []; let a: size = 3; let b: size = 9; append(lvl0, a); append(lvl0, b); append(jump_idxs, lvl0); let group_level: size = 0; delete(jump_idxs[group_level][:]); return len(jump_idxs[0]): i32 + len(jump_idxs): i32 * 10; }; fn clear(p: *[]u8) void = { delete((*p)[:]); }; fn deref_shape() i32 = { let xs: []u8 = []; append(xs, 5u8); append(xs, 6u8); clear(&xs); return len(xs): i32 + 17; }; let trace: i64 = 0; fn lof() size = { trace = trace*10 + 1; return 1; }; fn hif() size = { trace = trace*10 + 2; return 3; }; fn order_of_eval() i32 = { trace = 0; let xs: []i64 = []; append(xs, 1); append(xs, 2); append(xs, 3); append(xs, 4); delete(xs[lof():hif()]); if (trace != 12) { return 90; }; return (xs[0]*10 + xs[1]): i32 + len(xs); }; fn poke(p: *[]i64) size = { (*p)[0] = 9; return 1; }; fn alias_visible() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 2); append(xs, 3); delete(xs[poke(&xs):]); return xs[0]: i32 * 10 + len(xs); }; export fn main() i32 = { if (full_range() != 7) { return 1; }; if (full_explicit() != 8) { return 2; }; if (full_twice() != 9) { return 3; }; if (head() != 13) { return 4; }; if (mid() != 148) { return 5; }; if (tail_open() != 11) { return 6; }; if (empty_range() != 23) { return 7; }; if (end_boundary() != 212) { return 8; }; if (empty_explicit() != 31) { return 9; }; if (single_via_range() != 42) { return 10; }; if (cap_preserved() != 80) { return 11; }; if (u8_narrow() != 215) { return 12; }; if (u16_narrow() != 25) { return 13; }; if (i32_narrow() != 50) { return 14; }; if (struct16() != 216) { return 15; }; if (str_elem() != 235) { return 16; }; if (regex_exact() != 10) { return 17; }; if (deref_shape() != 17) { return 18; }; if (order_of_eval() != 16) { return 19; }; if (alias_visible() != 91) { return 20; }; return 0; };