//ww:run package main; type p2t = struct { x: i64, y: i64 }; type s6 = struct { a: i64, b: i64, c: i64, d: i64, e: i64, f: i64 }; type cell = (s6 | bool); type inst_lit = rune; type inst_split = i64; type inst = (inst_lit | inst_split); type un_size_void = (size | void); type un_void_size = (void | size); type un_str_void = (str | void); type minrep_split = size; type minrep_un = (minrep_split | void); fn i64_front() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); insert(xs[0], 5); return (xs[0] + xs[1]*10): i32 + len(xs)*10; }; fn i64_middle() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); insert(xs[1], 5); return (xs[0] + xs[1]*10): i32 + len(xs)*10; }; fn i64_end() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13); insert(xs[3], 5); return (xs[0] + xs[1]*10): i32 + len(xs)*10; }; fn end_insert_len() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); insert(xs[len(xs)], 13); if (len(xs) != 3) { return 1; }; return xs[2]: i32; }; fn pregrow_len_idx() i32 = { let xs: []i64 = []; append(xs, 7); append(xs, 11); insert(xs[len(xs)-1], 13); if (len(xs) != 3) { return 1; }; if (xs[0] != 7) { return 2; }; if (xs[1] != 13) { return 3; }; if (xs[2] != 11) { return 4; }; return 48; }; fn i32_narrow() i32 = { let xs: []i32 = []; append(xs, 4i32); append(xs, 2i32); insert(xs[1], 9i32); if (len(xs) != 3) { return 1; }; if (xs[0] != 4i32) { return 2; }; if (xs[1] != 9i32) { return 3; }; if (xs[2] != 2i32) { return 4; }; return 42; }; fn u16_narrow() i32 = { let xs: []u16 = []; append(xs, 4u16); append(xs, 2u16); insert(xs[1], 9u16); if (len(xs) != 3) { return 1; }; if (xs[0] != 4u16) { return 2; }; if (xs[1] != 9u16) { return 3; }; if (xs[2] != 2u16) { return 4; }; return 43; }; fn u8_narrow() i32 = { let xs: []u8 = []; append(xs, 5u8); append(xs, 3u8); insert(xs[0], 2u8); if (len(xs) != 3) { return 1; }; if (xs[0] != 2u8) { return 2; }; if (xs[1] != 5u8) { return 3; }; if (xs[2] != 3u8) { return 4; }; return 44; }; fn empty_insert() i32 = { let xs: []i64 = []; insert(xs[0], 5); return xs[0]: i32 + len(xs)*10; }; fn str_elem() i32 = { let xs: []str = []; let a: str = "abc"; let g: str = "fghi"; append(xs, a); append(xs, g); let b: str = "de"; insert(xs[1], b); if (len(xs) != 3) { return 1; }; if (xs[0].len != 3) { return 2; }; if (xs[1].len != 2) { return 3; }; if (xs[2].len != 4) { return 4; }; return 45; }; fn struct_elem() i32 = { let xs: []p2t = []; append(xs, p2t { x = 1, y = 2 }); append(xs, p2t { x = 5, y = 6 }); insert(xs[1], p2t { x = 3, y = 4 }); if (len(xs) != 3) { return 1; }; if (xs[0].x != 1 || xs[0].y != 2) { return 2; }; if (xs[1].x != 3 || xs[1].y != 4) { return 3; }; if (xs[2].x != 5 || xs[2].y != 6) { return 4; }; return 46; }; fn tagged_56b() i32 = { let xs: []cell = []; let p0: s6 = s6 { a = 1, b = 2, c = 3, d = 4, e = 5, f = 6 }; let p2: s6 = s6 { a = 13, b = 14, c = 15, d = 16, e = 17, f = 18 }; append(xs, p0); append(xs, p2); let p1: cell = (s6 { a = 7, b = 8, c = 9, d = 10, e = 11, f = 12 }); insert(xs[1], p1); 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[160]: i32) * 10; return r + len(xs)*10; }; fn tagged_cast() i32 = { let insts: []inst = []; append(insts, ('a': inst_lit)); append(insts, ('b': inst_lit)); insert(insts[1], (7: inst_split)); if (len(insts) != 3) { return 1; }; let r: i32 = 0; match (insts[1]) { case let z: inst_split => r += z: i32; case => return 2; }; match (insts[2]) { case let l: inst_lit => { if ((l: rune) == 'b') { r += 20; }; }; case => return 3; }; return r; }; fn ins_at(i: i64, p: *[]i64, v: i64) void = { insert((*p)[i], v); }; fn regex_shape() i32 = { let xs: []i64 = []; append(xs, 1); append(xs, 3); ins_at(1, &xs, 2); if (len(xs) != 3) { return 1; }; return (xs[0] + xs[1]*10 + xs[2]*50): i32; }; fn insert_in_loop() i32 = { let xs: []i64 = []; let v: i64 = 1; for (v <= 4) { insert(xs[0], v); v += 1; }; if (len(xs) != 4) { return 1; }; let k: i32 = 0; for (k < 4) { if (xs[k] != (4-k): i64) { return 2+k; }; k += 1; }; return 47; }; fn tagged_pregrow_val() i32 = { let xs: []un_size_void = []; append(xs, 10: size); append(xs, 20: size); insert(xs[1], (xs.len: size)+2); match (xs[1]) { case let v: size => { if (v != 4) { return (v: i32)+10; }; }; case void => return 2; }; if (len(xs) != 3) { return 3; }; return 50; }; fn scalar_pregrow_val() i32 = { let xs: []size = []; append(xs, 10: size); append(xs, 20: size); insert(xs[1], len(xs): size); if (xs[1] != 2) { return 1; }; if (len(xs) != 3) { return 2; }; return 55; }; fn tagged_selfref_val() i32 = { let xs: []un_size_void = []; append(xs, 10: size); append(xs, 20: size); insert(xs[0], xs[1]); match (xs[0]) { case let v: size => { if (v != 20) { return 1; }; }; case void => return 2; }; match (xs[1]) { case let v: size => { if (v != 10) { return 3; }; }; case void => return 4; }; match (xs[2]) { case let v: size => { if (v != 20) { return 5; }; }; case void => return 6; }; if (len(xs) != 3) { return 7; }; return 51; }; fn tagged_str_payload() i32 = { let ss: []un_str_void = []; append(ss, "aa"); insert(ss[0], "bb"); match (ss[0]) { case let s: str => { if (s.len != 2) { return 1; }; if (s[0] != 'b') { return 2; }; }; case void => return 3; }; match (ss[1]) { case let s: str => { if (s[0] != 'a') { return 4; }; }; case void => return 5; }; return 52; }; fn tagged_regex_minrep() i32 = { let xs: []minrep_un = []; append(xs, 7: minrep_split); append(xs, 8: minrep_split); insert(xs[0], ((xs.len: size)+2): minrep_split); match (xs[0]) { case let v: minrep_split => { if (v != 4) { return (v: i32)+10; }; }; case void => return 2; }; if (len(xs) != 3) { return 3; }; return 53; }; fn tagged_realloc_selfref_loop() i32 = { let xs: []un_void_size = []; append(xs, 100: size); let i: size = 0; for (i < 30) { append(xs, (xs[0] as size)+i); i += 1; }; if (len(xs) != 31) { return 1; }; let k: size = 1; for (k < 31) { match (xs[k]) { case let v: size => { if (v != 100+(k-1)) { return 2; }; }; case void => return 3; }; k += 1; }; return 56; }; fn tagged_append_pregrow_val() i32 = { let xs: []un_size_void = []; append(xs, 10: size); append(xs, 20: size); append(xs, (xs.len: size)+2); match (xs[2]) { case let v: size => { if (v != 4) { return (v: i32)+10; }; }; case void => return 2; }; if (len(xs) != 3) { return 3; }; return 54; }; fn tagged_seq_positions() i32 = { let xs: []un_void_size = []; append(xs, 10: size); append(xs, 20: size); insert(xs[0], (xs.len: size)*100); match (xs[0]) { case let v: size => { if (v != 200) { return 1; }; }; case void => return 2; }; insert(xs[2], (xs.len: size)+1); match (xs[2]) { case let v: size => { if (v != 4) { return 3; }; }; case void => return 4; }; match (xs[1]) { case let v: size => { if (v != 10) { return 5; }; }; case void => return 6; }; match (xs[3]) { case let v: size => { if (v != 20) { return 7; }; }; case void => return 8; }; if (len(xs) != 4) { return 9; }; return 57; }; fn tagged_void_variant() i32 = { let xs: []un_void_size = []; append(xs, 5: size); insert(xs[0], void); if (!(xs[0] is void)) { return 1; }; match (xs[1]) { case let v: size => { if (v != 5) { return 2; }; }; case void => return 3; }; insert(xs[1], xs.len: size); match (xs[1]) { case let v: size => { if (v != 2) { return 4; }; }; case void => return 5; }; if (len(xs) != 3) { return 6; }; return 58; }; export fn main() i32 = { if (i64_front() != 115) { return 1; }; if (i64_middle() != 97) { return 2; }; if (i64_end() != 157) { return 3; }; if (end_insert_len() != 13) { return 4; }; if (pregrow_len_idx() != 48) { return 5; }; if (i32_narrow() != 42) { return 6; }; if (u16_narrow() != 43) { return 7; }; if (u8_narrow() != 44) { return 8; }; if (empty_insert() != 15) { return 9; }; if (str_elem() != 45) { return 10; }; if (struct_elem() != 46) { return 11; }; if (tagged_56b() != 217) { return 12; }; if (tagged_cast() != 27) { return 13; }; if (regex_shape() != 171) { return 14; }; if (insert_in_loop() != 47) { return 15; }; if (tagged_pregrow_val() != 50) { return 16; }; if (scalar_pregrow_val() != 55) { return 17; }; if (tagged_selfref_val() != 51) { return 18; }; if (tagged_str_payload() != 52) { return 19; }; if (tagged_regex_minrep() != 53) { return 20; }; if (tagged_realloc_selfref_loop() != 56) { return 21; }; if (tagged_append_pregrow_val() != 54) { return 22; }; if (tagged_seq_positions() != 57) { return 23; }; if (tagged_void_variant() != 58) { return 24; }; return 0; };