The r-prefixed waves absorb the runtime, reject, and byte-compare rows of the migrated native carriers; each fixture is one directory with one case.ww and a //ww:error, //ww:compile, //ww:run, or //ww:run-exit directive covering both frontends.
113 lines
4.7 KiB
Plaintext
113 lines
4.7 KiB
Plaintext
//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;
|
|
};
|