From f2e17d265fd4fc87287fbba911ce2018b48245fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=8B=9C=EC=9B=90?= Date: Sun, 16 Aug 2026 19:08:48 +0900 Subject: [PATCH] add M6-M9 specification tests (#3) --- fec/tests/m6/README.md | 11 +++++++++++ fec/tests/m6/badarg.fe | 10 ++++++++++ fec/tests/m6/baddefer.fe | 12 ++++++++++++ fec/tests/m6/badfld.fe | 6 ++++++ fec/tests/m6/badglob.fe | 9 +++++++++ fec/tests/m6/badgmut.fe | 9 +++++++++ fec/tests/m6/badinv.fe | 9 +++++++++ fec/tests/m6/badlocsl.fe | 7 +++++++ fec/tests/m6/badmove.fe | 10 ++++++++++ fec/tests/m6/badmut.fe | 10 ++++++++++ fec/tests/m6/badmut2.fe | 11 +++++++++++ fec/tests/m6/badptr.fe | 6 ++++++ fec/tests/m6/badret.fe | 7 +++++++ fec/tests/m6/badscop.fe | 12 ++++++++++++ fec/tests/m6/badself.fe | 10 ++++++++++ fec/tests/m6/badshwr.fe | 11 +++++++++++ fec/tests/m6/badslfld.fe | 6 ++++++ fec/tests/m6/badtwo.fe | 6 ++++++ fec/tests/m6/badup.fe | 10 ++++++++++ fec/tests/m6/okbranch.fe | 15 +++++++++++++++ fec/tests/m6/okdefer.fe | 13 +++++++++++++ fec/tests/m6/okglobcp.fe | 10 ++++++++++ fec/tests/m6/oklast.fe | 9 +++++++++ fec/tests/m6/okr8free.fe | 13 +++++++++++++ fec/tests/m6/okr8meth.fe | 17 +++++++++++++++++ fec/tests/m6/okr8stat.fe | 5 +++++ fec/tests/m6/okrebor.fe | 11 +++++++++++ fec/tests/m6/okshare.fe | 12 ++++++++++++ fec/tests/m6/okslreb.fe | 11 +++++++++++ fec/tests/m6/okstatic.fe | 11 +++++++++++ fec/tests/m6/oktemp.fe | 10 ++++++++++ fec/tests/m6/oktrim.fe | 5 +++++ fec/tests/m7/README.md | 8 ++++++++ fec/tests/m7/badcatch.fe | 17 +++++++++++++++++ fec/tests/m7/baddef.fe | 14 ++++++++++++++ fec/tests/m7/baddir.fe | 10 ++++++++++ fec/tests/m7/badetype.fe | 18 ++++++++++++++++++ fec/tests/m7/badoref.fe | 6 ++++++ fec/tests/m7/badorel.fe | 10 ++++++++++ fec/tests/m7/badproj.fe | 11 +++++++++++ fec/tests/m7/badqmark.fe | 7 +++++++ fec/tests/m7/badret.fe | 14 ++++++++++++++ fec/tests/m7/badsome.fe | 7 +++++++ fec/tests/m7/badtry.fe | 14 ++++++++++++++ fec/tests/m7/badzero.fe | 6 ++++++ fec/tests/m7/okcatch.fe | 16 ++++++++++++++++ fec/tests/m7/okcvoid.fe | 15 +++++++++++++++ fec/tests/m7/okdeflt.fe | 13 +++++++++++++ fec/tests/m7/okiflet.fe | 8 ++++++++ fec/tests/m7/okmatch.fe | 8 ++++++++ fec/tests/m7/okorelse.fe | 5 +++++ fec/tests/m7/okproj.fe | 9 +++++++++ fec/tests/m7/okrepl.fe | 11 +++++++++++ fec/tests/m7/oktrdef.fe | 14 ++++++++++++++ fec/tests/m7/oktry.fe | 14 ++++++++++++++ fec/tests/m8/README.md | 19 +++++++++++++++++++ fec/tests/m8/basic/main.fe | 6 ++++++ fec/tests/m8/basic/util.fe | 5 +++++ fec/tests/m8/cycle/a.fe | 4 ++++ fec/tests/m8/cycle/b.fe | 5 +++++ fec/tests/m8/errdet/alpha.fe | 5 +++++ fec/tests/m8/errdet/beta.fe | 5 +++++ fec/tests/m8/errdet/main.fe | 6 ++++++ fec/tests/m8/errnom/lib.fe | 9 +++++++++ fec/tests/m8/errnom/main.fe | 7 +++++++ fec/tests/m8/errsame/alpha.fe | 5 +++++ fec/tests/m8/errsame/beta.fe | 5 +++++ fec/tests/m8/errsame/main.fe | 6 ++++++ fec/tests/m8/missing/main.fe | 5 +++++ fec/tests/m8/privfld/data.fe | 5 +++++ fec/tests/m8/privfld/main.fe | 8 ++++++++ fec/tests/m8/privfn/main.fe | 7 +++++++ fec/tests/m8/privfn/util.fe | 5 +++++ fec/tests/m8/pubfld/data.fe | 5 +++++ fec/tests/m8/pubfld/main.fe | 7 +++++++ fec/tests/m8/unitbad/main.fe | 4 ++++ fec/tests/m9/README.md | 19 +++++++++++++++++++ fec/tests/m9/badarg.fe | 10 ++++++++++ fec/tests/m9/badarity.fe | 10 ++++++++++ fec/tests/m9/badbody.fe | 10 ++++++++++ fec/tests/m9/baddepth.fe | 10 ++++++++++ fec/tests/m9/badfew.fe | 10 ++++++++++ fec/tests/m9/badop.fe | 17 +++++++++++++++++ fec/tests/m9/badscope/lib.fe | 6 ++++++ fec/tests/m9/badscope/main.fe | 8 ++++++++ fec/tests/m9/badtype.fe | 6 ++++++ fec/tests/m9/defscope/lib.fe | 13 +++++++++++++ fec/tests/m9/defscope/main.fe | 6 ++++++ fec/tests/m9/okalias.fe | 11 +++++++++++ fec/tests/m9/okbox.fe | 18 ++++++++++++++++++ fec/tests/m9/okdedup.fe | 8 ++++++++ fec/tests/m9/okid.fe | 9 +++++++++ fec/tests/m9/okisint.fe | 13 +++++++++++++ fec/tests/m9/okmulti.fe | 11 +++++++++++ fec/tests/m9/oknested.fe | 15 +++++++++++++++ fec/tests/m9/okpair.fe | 15 +++++++++++++++ fec/tests/m9/oktypeeq.fe | 13 +++++++++++++ 97 files changed, 940 insertions(+) create mode 100644 fec/tests/m6/README.md create mode 100644 fec/tests/m6/badarg.fe create mode 100644 fec/tests/m6/baddefer.fe create mode 100644 fec/tests/m6/badfld.fe create mode 100644 fec/tests/m6/badglob.fe create mode 100644 fec/tests/m6/badgmut.fe create mode 100644 fec/tests/m6/badinv.fe create mode 100644 fec/tests/m6/badlocsl.fe create mode 100644 fec/tests/m6/badmove.fe create mode 100644 fec/tests/m6/badmut.fe create mode 100644 fec/tests/m6/badmut2.fe create mode 100644 fec/tests/m6/badptr.fe create mode 100644 fec/tests/m6/badret.fe create mode 100644 fec/tests/m6/badscop.fe create mode 100644 fec/tests/m6/badself.fe create mode 100644 fec/tests/m6/badshwr.fe create mode 100644 fec/tests/m6/badslfld.fe create mode 100644 fec/tests/m6/badtwo.fe create mode 100644 fec/tests/m6/badup.fe create mode 100644 fec/tests/m6/okbranch.fe create mode 100644 fec/tests/m6/okdefer.fe create mode 100644 fec/tests/m6/okglobcp.fe create mode 100644 fec/tests/m6/oklast.fe create mode 100644 fec/tests/m6/okr8free.fe create mode 100644 fec/tests/m6/okr8meth.fe create mode 100644 fec/tests/m6/okr8stat.fe create mode 100644 fec/tests/m6/okrebor.fe create mode 100644 fec/tests/m6/okshare.fe create mode 100644 fec/tests/m6/okslreb.fe create mode 100644 fec/tests/m6/okstatic.fe create mode 100644 fec/tests/m6/oktemp.fe create mode 100644 fec/tests/m6/oktrim.fe create mode 100644 fec/tests/m7/README.md create mode 100644 fec/tests/m7/badcatch.fe create mode 100644 fec/tests/m7/baddef.fe create mode 100644 fec/tests/m7/baddir.fe create mode 100644 fec/tests/m7/badetype.fe create mode 100644 fec/tests/m7/badoref.fe create mode 100644 fec/tests/m7/badorel.fe create mode 100644 fec/tests/m7/badproj.fe create mode 100644 fec/tests/m7/badqmark.fe create mode 100644 fec/tests/m7/badret.fe create mode 100644 fec/tests/m7/badsome.fe create mode 100644 fec/tests/m7/badtry.fe create mode 100644 fec/tests/m7/badzero.fe create mode 100644 fec/tests/m7/okcatch.fe create mode 100644 fec/tests/m7/okcvoid.fe create mode 100644 fec/tests/m7/okdeflt.fe create mode 100644 fec/tests/m7/okiflet.fe create mode 100644 fec/tests/m7/okmatch.fe create mode 100644 fec/tests/m7/okorelse.fe create mode 100644 fec/tests/m7/okproj.fe create mode 100644 fec/tests/m7/okrepl.fe create mode 100644 fec/tests/m7/oktrdef.fe create mode 100644 fec/tests/m7/oktry.fe create mode 100644 fec/tests/m8/README.md create mode 100644 fec/tests/m8/basic/main.fe create mode 100644 fec/tests/m8/basic/util.fe create mode 100644 fec/tests/m8/cycle/a.fe create mode 100644 fec/tests/m8/cycle/b.fe create mode 100644 fec/tests/m8/errdet/alpha.fe create mode 100644 fec/tests/m8/errdet/beta.fe create mode 100644 fec/tests/m8/errdet/main.fe create mode 100644 fec/tests/m8/errnom/lib.fe create mode 100644 fec/tests/m8/errnom/main.fe create mode 100644 fec/tests/m8/errsame/alpha.fe create mode 100644 fec/tests/m8/errsame/beta.fe create mode 100644 fec/tests/m8/errsame/main.fe create mode 100644 fec/tests/m8/missing/main.fe create mode 100644 fec/tests/m8/privfld/data.fe create mode 100644 fec/tests/m8/privfld/main.fe create mode 100644 fec/tests/m8/privfn/main.fe create mode 100644 fec/tests/m8/privfn/util.fe create mode 100644 fec/tests/m8/pubfld/data.fe create mode 100644 fec/tests/m8/pubfld/main.fe create mode 100644 fec/tests/m8/unitbad/main.fe create mode 100644 fec/tests/m9/README.md create mode 100644 fec/tests/m9/badarg.fe create mode 100644 fec/tests/m9/badarity.fe create mode 100644 fec/tests/m9/badbody.fe create mode 100644 fec/tests/m9/baddepth.fe create mode 100644 fec/tests/m9/badfew.fe create mode 100644 fec/tests/m9/badop.fe create mode 100644 fec/tests/m9/badscope/lib.fe create mode 100644 fec/tests/m9/badscope/main.fe create mode 100644 fec/tests/m9/badtype.fe create mode 100644 fec/tests/m9/defscope/lib.fe create mode 100644 fec/tests/m9/defscope/main.fe create mode 100644 fec/tests/m9/okalias.fe create mode 100644 fec/tests/m9/okbox.fe create mode 100644 fec/tests/m9/okdedup.fe create mode 100644 fec/tests/m9/okid.fe create mode 100644 fec/tests/m9/okisint.fe create mode 100644 fec/tests/m9/okmulti.fe create mode 100644 fec/tests/m9/oknested.fe create mode 100644 fec/tests/m9/okpair.fe create mode 100644 fec/tests/m9/oktypeeq.fe diff --git a/fec/tests/m6/README.md b/fec/tests/m6/README.md new file mode 100644 index 0000000..9e1e0ef --- /dev/null +++ b/fec/tests/m6/README.md @@ -0,0 +1,11 @@ +# M6 fixtures + +These fixtures pin the M6 ownership/borrow rules before implementation. + +- `ok*.fe` must compile with `--target=bits32 --emit-c`. +- `bad*.fe` must fail compilation; the first line follows the `// ERROR::` convention from SPEC ยง12. +- They are intentionally not wired into `TEST-DOS.BAT` while `master` is M5, so adding these fixtures does not make the current milestone red. +- When M6 starts, wire this directory into the DOS/QEMU gate without changing the expected result of any fixture. +- M6 also owns the general-global borrow restriction from R10 because AGENTS.md explicitly groups that change with the `own.c` state-machine work. + +Coverage: R4 storage restrictions, R5 scope, R6 shared/exclusive liveness and reborrows, R7 invalidation, R8 derived returns, defer lifetime extension, and global borrow restrictions. diff --git a/fec/tests/m6/badarg.fe b/fec/tests/m6/badarg.fe new file mode 100644 index 0000000..355fb9c --- /dev/null +++ b/fec/tests/m6/badarg.fe @@ -0,0 +1,10 @@ +// ERROR:8:self +unit badarg; + +struct Box { + value: i32, + + fn bad(self: &Self, other: &i32) -> &i32 { + return other; + } +} diff --git a/fec/tests/m6/baddefer.fe b/fec/tests/m6/baddefer.fe new file mode 100644 index 0000000..faf7839 --- /dev/null +++ b/fec/tests/m6/baddefer.fe @@ -0,0 +1,12 @@ +// ERROR:10:borrow +unit baddefer; + +fn read(r: &i32) -> i32 { return r.^; } + +fn bad() -> i32 { + var x: i32 = 0; + let r = &x; + defer { let y = read(r); } + x = 1; + return x; +} diff --git a/fec/tests/m6/badfld.fe b/fec/tests/m6/badfld.fe new file mode 100644 index 0000000..d4090ff --- /dev/null +++ b/fec/tests/m6/badfld.fe @@ -0,0 +1,6 @@ +// ERROR:5:reference +unit badfld; + +struct Bad { + value: &i32, +} diff --git a/fec/tests/m6/badglob.fe b/fec/tests/m6/badglob.fe new file mode 100644 index 0000000..41a107c --- /dev/null +++ b/fec/tests/m6/badglob.fe @@ -0,0 +1,9 @@ +// ERROR:7:global +unit badglob; + +var VALUE: i32 = 0; + +fn bad() -> i32 { + let r = &VALUE; + return r.^; +} diff --git a/fec/tests/m6/badgmut.fe b/fec/tests/m6/badgmut.fe new file mode 100644 index 0000000..38bd2f8 --- /dev/null +++ b/fec/tests/m6/badgmut.fe @@ -0,0 +1,9 @@ +// ERROR:7:global +unit badgmut; + +var VALUE: i32 = 0; + +fn bad() -> void { + let r = &mut VALUE; + r.^ = 1; +} diff --git a/fec/tests/m6/badinv.fe b/fec/tests/m6/badinv.fe new file mode 100644 index 0000000..88f483c --- /dev/null +++ b/fec/tests/m6/badinv.fe @@ -0,0 +1,9 @@ +// ERROR:6:borrow +unit badinv; + +fn bad(p: ^i32, q: ^i32) -> void { + let r = &p; + p = q; + let keep = r; + mem.destroy(p); +} diff --git a/fec/tests/m6/badlocsl.fe b/fec/tests/m6/badlocsl.fe new file mode 100644 index 0000000..bdc8eff --- /dev/null +++ b/fec/tests/m6/badlocsl.fe @@ -0,0 +1,7 @@ +// ERROR:6:reference +unit badlocsl; + +fn bad() -> []u8 { + let a: [2]u8 = [1 as u8, 2 as u8]; + return a[..]; +} diff --git a/fec/tests/m6/badmove.fe b/fec/tests/m6/badmove.fe new file mode 100644 index 0000000..e746062 --- /dev/null +++ b/fec/tests/m6/badmove.fe @@ -0,0 +1,10 @@ +// ERROR:8:borrow +unit badmove; + +fn take(p: ^i32) -> void { mem.destroy(p); } + +fn bad(p: ^i32) -> void { + let r = &p; + take(p); + let q = r; +} diff --git a/fec/tests/m6/badmut.fe b/fec/tests/m6/badmut.fe new file mode 100644 index 0000000..90aab1f --- /dev/null +++ b/fec/tests/m6/badmut.fe @@ -0,0 +1,10 @@ +// ERROR:7:borrow +unit badmut; + +fn bad() -> i32 { + var x: i32 = 0; + let r = &mut x; + x = 1; + r.^ = 2; + return x; +} diff --git a/fec/tests/m6/badmut2.fe b/fec/tests/m6/badmut2.fe new file mode 100644 index 0000000..790e251 --- /dev/null +++ b/fec/tests/m6/badmut2.fe @@ -0,0 +1,11 @@ +// ERROR:7:borrow +unit badmut2; + +fn bad() -> i32 { + var x: i32 = 0; + let a = &mut x; + let b = &mut x; + a.^ = 1; + b.^ = 2; + return x; +} diff --git a/fec/tests/m6/badptr.fe b/fec/tests/m6/badptr.fe new file mode 100644 index 0000000..36e9490 --- /dev/null +++ b/fec/tests/m6/badptr.fe @@ -0,0 +1,6 @@ +// ERROR:4:reference +unit badptr; + +fn bad(p: *&i32) -> void { + return; +} diff --git a/fec/tests/m6/badret.fe b/fec/tests/m6/badret.fe new file mode 100644 index 0000000..5a9a777 --- /dev/null +++ b/fec/tests/m6/badret.fe @@ -0,0 +1,7 @@ +// ERROR:6:reference +unit badret; + +fn bad() -> &i32 { + let x: i32 = 1; + return &x; +} diff --git a/fec/tests/m6/badscop.fe b/fec/tests/m6/badscop.fe new file mode 100644 index 0000000..3bbeded --- /dev/null +++ b/fec/tests/m6/badscop.fe @@ -0,0 +1,12 @@ +// ERROR:9:reference +unit badscop; + +fn bad(cond: bool) -> i32 { + let outer: i32 = 0; + var r: &i32 = &outer; + if cond { + let inner: i32 = 3; + r = &inner; + } + return r.^; +} diff --git a/fec/tests/m6/badself.fe b/fec/tests/m6/badself.fe new file mode 100644 index 0000000..fe80c84 --- /dev/null +++ b/fec/tests/m6/badself.fe @@ -0,0 +1,10 @@ +// ERROR:8:self +unit badself; + +struct Box { + value: i32, + + fn bad(self: Self) -> &i32 { + return &self.value; + } +} diff --git a/fec/tests/m6/badshwr.fe b/fec/tests/m6/badshwr.fe new file mode 100644 index 0000000..015d14f --- /dev/null +++ b/fec/tests/m6/badshwr.fe @@ -0,0 +1,11 @@ +// ERROR:9:borrow +unit badshwr; + +fn read(r: &i32) -> i32 { return r.^; } + +fn bad() -> i32 { + var x: i32 = 0; + let r = &x; + x = 1; + return read(r); +} diff --git a/fec/tests/m6/badslfld.fe b/fec/tests/m6/badslfld.fe new file mode 100644 index 0000000..63b6c5a --- /dev/null +++ b/fec/tests/m6/badslfld.fe @@ -0,0 +1,6 @@ +// ERROR:5:reference +unit badslfld; + +struct Bad { + bytes: []u8, +} diff --git a/fec/tests/m6/badtwo.fe b/fec/tests/m6/badtwo.fe new file mode 100644 index 0000000..dcdfa0e --- /dev/null +++ b/fec/tests/m6/badtwo.fe @@ -0,0 +1,6 @@ +// ERROR:5:reference +unit badtwo; + +fn choose(a: &i32, b: &i32) -> &i32 { + return a; +} diff --git a/fec/tests/m6/badup.fe b/fec/tests/m6/badup.fe new file mode 100644 index 0000000..34f2b7e --- /dev/null +++ b/fec/tests/m6/badup.fe @@ -0,0 +1,10 @@ +// ERROR:8:mut +unit badup; + +struct Box { + value: i32, + + fn bad(self: &Self) -> &mut i32 { + return &mut self.value; + } +} diff --git a/fec/tests/m6/okbranch.fe b/fec/tests/m6/okbranch.fe new file mode 100644 index 0000000..f6964b8 --- /dev/null +++ b/fec/tests/m6/okbranch.fe @@ -0,0 +1,15 @@ +unit okbranch; + +fn read(r: &i32) -> i32 { return r.^; } + +fn test(cond: bool) -> i32 { + var x: i32 = 3; + let r = &x; + if cond { + let a = read(r); + } else { + let b = read(r); + } + x += 1; + return x; +} diff --git a/fec/tests/m6/okdefer.fe b/fec/tests/m6/okdefer.fe new file mode 100644 index 0000000..1556b46 --- /dev/null +++ b/fec/tests/m6/okdefer.fe @@ -0,0 +1,13 @@ +unit okdefer; + +fn read(r: &i32) -> i32 { return r.^; } + +fn test() -> i32 { + var x: i32 = 3; + if true { + let r = &x; + defer { let y = read(r); } + } + x += 1; + return x; +} diff --git a/fec/tests/m6/okglobcp.fe b/fec/tests/m6/okglobcp.fe new file mode 100644 index 0000000..e0c3e95 --- /dev/null +++ b/fec/tests/m6/okglobcp.fe @@ -0,0 +1,10 @@ +unit okglobcp; + +var VALUE: i32 = 7; + +fn read(r: &i32) -> i32 { return r.^; } + +fn test() -> i32 { + let local = VALUE; + return read(&local); +} diff --git a/fec/tests/m6/oklast.fe b/fec/tests/m6/oklast.fe new file mode 100644 index 0000000..2e1e9f1 --- /dev/null +++ b/fec/tests/m6/oklast.fe @@ -0,0 +1,9 @@ +unit oklast; + +fn test() -> i32 { + var x: i32 = 0; + let r = &mut x; + r.^ = 1; + x += 1; + return x; +} diff --git a/fec/tests/m6/okr8free.fe b/fec/tests/m6/okr8free.fe new file mode 100644 index 0000000..0ae189e --- /dev/null +++ b/fec/tests/m6/okr8free.fe @@ -0,0 +1,13 @@ +unit okr8free; + +fn head(s: []u8) -> &u8 { + return &s[0]; +} + +fn test() -> u8 { + var a: [2]u8 = [1 as u8, 2 as u8]; + let r = head(a[..]); + let v = r.^; + a[0] = 7 as u8; + return v; +} diff --git a/fec/tests/m6/okr8meth.fe b/fec/tests/m6/okr8meth.fe new file mode 100644 index 0000000..8f49258 --- /dev/null +++ b/fec/tests/m6/okr8meth.fe @@ -0,0 +1,17 @@ +unit okr8meth; + +struct Box { + value: i32, + + pub fn get(self: &Self) -> &i32 { + return &self.value; + } +} + +fn test() -> i32 { + var b = Box{ value: 4 }; + let r = b.get(); + let v = r.^; + b.value = 5; + return v; +} diff --git a/fec/tests/m6/okr8stat.fe b/fec/tests/m6/okr8stat.fe new file mode 100644 index 0000000..5db67d4 --- /dev/null +++ b/fec/tests/m6/okr8stat.fe @@ -0,0 +1,5 @@ +unit okr8stat; + +fn name() -> str { + return "main"; +} diff --git a/fec/tests/m6/okrebor.fe b/fec/tests/m6/okrebor.fe new file mode 100644 index 0000000..b92ebf8 --- /dev/null +++ b/fec/tests/m6/okrebor.fe @@ -0,0 +1,11 @@ +unit okrebor; + +fn read(r: &i32) -> i32 { return r.^; } + +fn test() -> i32 { + var x: i32 = 1; + let r = &mut x; + let v = read(r); + r.^ = v + 1; + return r.^; +} diff --git a/fec/tests/m6/okshare.fe b/fec/tests/m6/okshare.fe new file mode 100644 index 0000000..1740394 --- /dev/null +++ b/fec/tests/m6/okshare.fe @@ -0,0 +1,12 @@ +unit okshare; + +fn add(a: &i32, b: &i32) -> i32 { + return a.^ + b.^; +} + +fn test() -> i32 { + let x: i32 = 4; + let a = &x; + let b = &x; + return add(a, b); +} diff --git a/fec/tests/m6/okslreb.fe b/fec/tests/m6/okslreb.fe new file mode 100644 index 0000000..7b8a6a7 --- /dev/null +++ b/fec/tests/m6/okslreb.fe @@ -0,0 +1,11 @@ +unit okslreb; + +fn first(s: []u8) -> u8 { return s[0]; } + +fn test() -> u8 { + var a: [2]u8 = [1 as u8, 2 as u8]; + var s = a[..]; + let v = first(s); + s[0] = 9 as u8; + return v; +} diff --git a/fec/tests/m6/okstatic.fe b/fec/tests/m6/okstatic.fe new file mode 100644 index 0000000..ae2487e --- /dev/null +++ b/fec/tests/m6/okstatic.fe @@ -0,0 +1,11 @@ +unit okstatic; + +static VALUE: i32 = 7; + +fn get() -> &i32 { + return &VALUE; +} + +fn test() -> i32 { + return get().^; +} diff --git a/fec/tests/m6/oktemp.fe b/fec/tests/m6/oktemp.fe new file mode 100644 index 0000000..d88b1f7 --- /dev/null +++ b/fec/tests/m6/oktemp.fe @@ -0,0 +1,10 @@ +unit oktemp; + +fn read(r: &i32) -> i32 { return r.^; } + +fn test() -> i32 { + var x: i32 = 1; + let v = read(&x); + x += 1; + return v + x; +} diff --git a/fec/tests/m6/oktrim.fe b/fec/tests/m6/oktrim.fe new file mode 100644 index 0000000..cf416ac --- /dev/null +++ b/fec/tests/m6/oktrim.fe @@ -0,0 +1,5 @@ +unit oktrim; + +fn trimmed(line: str) -> str { + return line.trim(); +} diff --git a/fec/tests/m7/README.md b/fec/tests/m7/README.md new file mode 100644 index 0000000..468c98b --- /dev/null +++ b/fec/tests/m7/README.md @@ -0,0 +1,8 @@ +# M7 fixtures + +M7 adds optionals and error unions on top of the M6 ownership model. + +`ok*.fe` must compile. `bad*.fe` must fail according to the first-line error marker. +The files are not wired into `TEST-DOS.BAT` until M7 work begins. + +Coverage: `?T`, `.?`, `Some`/`None` pattern-only destructuring, `mem.replace` extraction, `orelse`, nominal error unions, `try`, block/short `catch`, error code zero rejection, and R4/R7 interactions with optional references/owners. diff --git a/fec/tests/m7/badcatch.fe b/fec/tests/m7/badcatch.fe new file mode 100644 index 0000000..d6b2bdb --- /dev/null +++ b/fec/tests/m7/badcatch.fe @@ -0,0 +1,17 @@ +// ERROR:14:catch +unit badcatch; + +error E { + Bad = 1, +} + +fn leaf() -> E!i32 { + return E.Bad; +} + +fn bad() -> i32 { + let v = leaf() catch |e| { + let ignored: i32 = 1; + }; + return v; +} diff --git a/fec/tests/m7/baddef.fe b/fec/tests/m7/baddef.fe new file mode 100644 index 0000000..2ff2b0f --- /dev/null +++ b/fec/tests/m7/baddef.fe @@ -0,0 +1,14 @@ +// ERROR:13:type +unit baddef; + +error E { + Bad = 1, +} + +fn leaf() -> E!i32 { + return E.Bad; +} + +fn bad() -> i32 { + return leaf() catch false; +} diff --git a/fec/tests/m7/baddir.fe b/fec/tests/m7/baddir.fe new file mode 100644 index 0000000..46e0715 --- /dev/null +++ b/fec/tests/m7/baddir.fe @@ -0,0 +1,10 @@ +// ERROR:9:optional +unit baddir; + +struct Node { + value: i32, +} + +fn bad(p: ?^Node) -> i32 { + return p.^.value; +} diff --git a/fec/tests/m7/badetype.fe b/fec/tests/m7/badetype.fe new file mode 100644 index 0000000..af5bf39 --- /dev/null +++ b/fec/tests/m7/badetype.fe @@ -0,0 +1,18 @@ +// ERROR:17:error +unit badetype; + +error A { + Bad = 1, +} + +error B { + Bad = 1, +} + +fn leaf() -> A!i32 { + return A.Bad; +} + +fn bad() -> B!i32 { + return try leaf(); +} diff --git a/fec/tests/m7/badoref.fe b/fec/tests/m7/badoref.fe new file mode 100644 index 0000000..641206e --- /dev/null +++ b/fec/tests/m7/badoref.fe @@ -0,0 +1,6 @@ +// ERROR:5:reference +unit badoref; + +struct Bad { + value: ?&i32, +} diff --git a/fec/tests/m7/badorel.fe b/fec/tests/m7/badorel.fe new file mode 100644 index 0000000..3a79145 --- /dev/null +++ b/fec/tests/m7/badorel.fe @@ -0,0 +1,10 @@ +// ERROR:9:non-Copy +unit badorel; + +struct Node { + next: ?^Node, +} + +fn bad(p: ^Node, fallback: ^Node) -> ^Node { + return p.next orelse fallback; +} diff --git a/fec/tests/m7/badproj.fe b/fec/tests/m7/badproj.fe new file mode 100644 index 0000000..a7d987c --- /dev/null +++ b/fec/tests/m7/badproj.fe @@ -0,0 +1,11 @@ +// ERROR:9:mem.replace +unit badproj; + +struct Node { + next: ?^Node, +} + +fn bad(p: ^Node) -> void { + let q = p.next; + mem.destroy(p); +} diff --git a/fec/tests/m7/badqmark.fe b/fec/tests/m7/badqmark.fe new file mode 100644 index 0000000..36cdc7b --- /dev/null +++ b/fec/tests/m7/badqmark.fe @@ -0,0 +1,7 @@ +// ERROR:6:optional +unit badqmark; + +fn bad() -> i32 { + let x: i32 = 1; + return x.?; +} diff --git a/fec/tests/m7/badret.fe b/fec/tests/m7/badret.fe new file mode 100644 index 0000000..84842e2 --- /dev/null +++ b/fec/tests/m7/badret.fe @@ -0,0 +1,14 @@ +// ERROR:13:error +unit badret; + +error A { + Bad = 1, +} + +error B { + Bad = 1, +} + +fn bad() -> B!i32 { + return A.Bad; +} diff --git a/fec/tests/m7/badsome.fe b/fec/tests/m7/badsome.fe new file mode 100644 index 0000000..f35a461 --- /dev/null +++ b/fec/tests/m7/badsome.fe @@ -0,0 +1,7 @@ +// ERROR:5:Some +unit badsome; + +fn bad() -> i32 { + let x = Some(1); + return x; +} diff --git a/fec/tests/m7/badtry.fe b/fec/tests/m7/badtry.fe new file mode 100644 index 0000000..a41273e --- /dev/null +++ b/fec/tests/m7/badtry.fe @@ -0,0 +1,14 @@ +// ERROR:13:try +unit badtry; + +error E { + Bad = 1, +} + +fn leaf() -> E!i32 { + return E.Bad; +} + +fn bad() -> i32 { + return try leaf(); +} diff --git a/fec/tests/m7/badzero.fe b/fec/tests/m7/badzero.fe new file mode 100644 index 0000000..da86afb --- /dev/null +++ b/fec/tests/m7/badzero.fe @@ -0,0 +1,6 @@ +// ERROR:5:0 +unit badzero; + +error E { + Zero = 0, +} diff --git a/fec/tests/m7/okcatch.fe b/fec/tests/m7/okcatch.fe new file mode 100644 index 0000000..557fd12 --- /dev/null +++ b/fec/tests/m7/okcatch.fe @@ -0,0 +1,16 @@ +unit okcatch; + +error E { + Bad = 1, +} + +fn leaf() -> E!i32 { + return E.Bad; +} + +fn top() -> E!i32 { + let v = leaf() catch |e| { + return e; + }; + return v; +} diff --git a/fec/tests/m7/okcvoid.fe b/fec/tests/m7/okcvoid.fe new file mode 100644 index 0000000..4c1c2ab --- /dev/null +++ b/fec/tests/m7/okcvoid.fe @@ -0,0 +1,15 @@ +unit okcvoid; + +error E { + Bad = 1, +} + +fn leaf() -> E!void { + return E.Bad; +} + +fn top() -> void { + leaf() catch |e| { + return; + }; +} diff --git a/fec/tests/m7/okdeflt.fe b/fec/tests/m7/okdeflt.fe new file mode 100644 index 0000000..b62d66c --- /dev/null +++ b/fec/tests/m7/okdeflt.fe @@ -0,0 +1,13 @@ +unit okdeflt; + +error E { + Bad = 1, +} + +fn leaf() -> E!i32 { + return E.Bad; +} + +fn top() -> i32 { + return leaf() catch 11; +} diff --git a/fec/tests/m7/okiflet.fe b/fec/tests/m7/okiflet.fe new file mode 100644 index 0000000..3192c4b --- /dev/null +++ b/fec/tests/m7/okiflet.fe @@ -0,0 +1,8 @@ +unit okiflet; + +fn value(p: ?i32) -> i32 { + if let Some(v) = p { + return v; + } + return 0; +} diff --git a/fec/tests/m7/okmatch.fe b/fec/tests/m7/okmatch.fe new file mode 100644 index 0000000..6335cff --- /dev/null +++ b/fec/tests/m7/okmatch.fe @@ -0,0 +1,8 @@ +unit okmatch; + +fn value(p: ?i32) -> i32 { + match p { + Some(v) => { return v; } + None => { return 0; } + } +} diff --git a/fec/tests/m7/okorelse.fe b/fec/tests/m7/okorelse.fe new file mode 100644 index 0000000..9ff537e --- /dev/null +++ b/fec/tests/m7/okorelse.fe @@ -0,0 +1,5 @@ +unit okorelse; + +fn value(p: ?i32) -> i32 { + return p orelse 9; +} diff --git a/fec/tests/m7/okproj.fe b/fec/tests/m7/okproj.fe new file mode 100644 index 0000000..f54768a --- /dev/null +++ b/fec/tests/m7/okproj.fe @@ -0,0 +1,9 @@ +unit okproj; + +struct Node { + value: i32, +} + +fn touch(p: ?&mut Node) -> void { + p.?.value = 7; +} diff --git a/fec/tests/m7/okrepl.fe b/fec/tests/m7/okrepl.fe new file mode 100644 index 0000000..2710132 --- /dev/null +++ b/fec/tests/m7/okrepl.fe @@ -0,0 +1,11 @@ +unit okrepl; + +struct Node { + value: i32, +} + +fn take(p: ?^Node) -> void { + var q: ?^Node = p; + let n = mem.replace(&mut q, null).?; + mem.destroy(n); +} diff --git a/fec/tests/m7/oktrdef.fe b/fec/tests/m7/oktrdef.fe new file mode 100644 index 0000000..1b0831c --- /dev/null +++ b/fec/tests/m7/oktrdef.fe @@ -0,0 +1,14 @@ +unit oktrdef; + +error E { + Bad = 1, +} + +fn leaf() -> E!i32 { + return E.Bad; +} + +fn top() -> E!i32 { + defer { let x: i32 = 1; } + return try leaf(); +} diff --git a/fec/tests/m7/oktry.fe b/fec/tests/m7/oktry.fe new file mode 100644 index 0000000..f0066db --- /dev/null +++ b/fec/tests/m7/oktry.fe @@ -0,0 +1,14 @@ +unit oktry; + +error E { + Bad = 1, +} + +fn leaf(ok: bool) -> E!i32 { + if ok { return 7; } + return E.Bad; +} + +fn top() -> E!i32 { + return try leaf(true); +} diff --git a/fec/tests/m8/README.md b/fec/tests/m8/README.md new file mode 100644 index 0000000..73e69e4 --- /dev/null +++ b/fec/tests/m8/README.md @@ -0,0 +1,19 @@ +# M8 fixtures + +M8 is the first multi-unit milestone, so cases live in subdirectories. Each case is compiled separately with that directory on the import path. + +Pass cases: +- `basic`: public function across units. +- `pubfld`: public type and public field across units. +- `errsame`: two units use the same anonymous `error.Name`; the driver must assign one deterministic `core.Error` code. +- `errdet`: the same anonymous error-name set appears in a different source/import order; generated `fe_errors.h` must be byte-identical to `errsame` modulo the intentionally different unit graph. + +Fail cases: +- `privfn`: private declaration access. +- `privfld`: private field access. +- `missing`: unresolved import. +- `cycle`: cyclic imports. +- `unitbad`: filename/unit-name mismatch. +- `errnom`: nominal error cannot flow into `core.Error` via `try`. + +The current M5 `TEST-DOS.BAT` is intentionally unchanged. M8 should add procedural checks for `.fei` creation/hash invalidation and deterministic `fe_errors.h` using these fixtures. diff --git a/fec/tests/m8/basic/main.fe b/fec/tests/m8/basic/main.fe new file mode 100644 index 0000000..98eae1e --- /dev/null +++ b/fec/tests/m8/basic/main.fe @@ -0,0 +1,6 @@ +unit main; +import util; + +fn main() -> i32 { + return util.answer(); +} diff --git a/fec/tests/m8/basic/util.fe b/fec/tests/m8/basic/util.fe new file mode 100644 index 0000000..8fb20a6 --- /dev/null +++ b/fec/tests/m8/basic/util.fe @@ -0,0 +1,5 @@ +unit util; + +pub fn answer() -> i32 { + return 42; +} diff --git a/fec/tests/m8/cycle/a.fe b/fec/tests/m8/cycle/a.fe new file mode 100644 index 0000000..03dbe1c --- /dev/null +++ b/fec/tests/m8/cycle/a.fe @@ -0,0 +1,4 @@ +unit a; +import b; + +pub fn a_value() -> i32 { return b.b_value(); } diff --git a/fec/tests/m8/cycle/b.fe b/fec/tests/m8/cycle/b.fe new file mode 100644 index 0000000..4ca3232 --- /dev/null +++ b/fec/tests/m8/cycle/b.fe @@ -0,0 +1,5 @@ +// ERROR:3:cycle +unit b; +import a; + +pub fn b_value() -> i32 { return 1; } diff --git a/fec/tests/m8/errdet/alpha.fe b/fec/tests/m8/errdet/alpha.fe new file mode 100644 index 0000000..1d8ec1d --- /dev/null +++ b/fec/tests/m8/errdet/alpha.fe @@ -0,0 +1,5 @@ +unit alpha; + +pub fn fail() -> !void { + return error.Busy; +} diff --git a/fec/tests/m8/errdet/beta.fe b/fec/tests/m8/errdet/beta.fe new file mode 100644 index 0000000..31e6b00 --- /dev/null +++ b/fec/tests/m8/errdet/beta.fe @@ -0,0 +1,5 @@ +unit beta; + +pub fn fail() -> !void { + return error.Busy; +} diff --git a/fec/tests/m8/errdet/main.fe b/fec/tests/m8/errdet/main.fe new file mode 100644 index 0000000..5386bb4 --- /dev/null +++ b/fec/tests/m8/errdet/main.fe @@ -0,0 +1,6 @@ +unit main; +import beta; +import alpha; + +fn one() -> !void { return beta.fail(); } +fn two() -> !void { return alpha.fail(); } diff --git a/fec/tests/m8/errnom/lib.fe b/fec/tests/m8/errnom/lib.fe new file mode 100644 index 0000000..58d1e15 --- /dev/null +++ b/fec/tests/m8/errnom/lib.fe @@ -0,0 +1,9 @@ +unit lib; + +pub error LibError { + Bad = 1, +} + +pub fn value() -> LibError!i32 { + return LibError.Bad; +} diff --git a/fec/tests/m8/errnom/main.fe b/fec/tests/m8/errnom/main.fe new file mode 100644 index 0000000..ee27d19 --- /dev/null +++ b/fec/tests/m8/errnom/main.fe @@ -0,0 +1,7 @@ +// ERROR:6:error +unit main; +import lib; + +fn bad() -> !i32 { + return try lib.value(); +} diff --git a/fec/tests/m8/errsame/alpha.fe b/fec/tests/m8/errsame/alpha.fe new file mode 100644 index 0000000..1d8ec1d --- /dev/null +++ b/fec/tests/m8/errsame/alpha.fe @@ -0,0 +1,5 @@ +unit alpha; + +pub fn fail() -> !void { + return error.Busy; +} diff --git a/fec/tests/m8/errsame/beta.fe b/fec/tests/m8/errsame/beta.fe new file mode 100644 index 0000000..31e6b00 --- /dev/null +++ b/fec/tests/m8/errsame/beta.fe @@ -0,0 +1,5 @@ +unit beta; + +pub fn fail() -> !void { + return error.Busy; +} diff --git a/fec/tests/m8/errsame/main.fe b/fec/tests/m8/errsame/main.fe new file mode 100644 index 0000000..0e46b1b --- /dev/null +++ b/fec/tests/m8/errsame/main.fe @@ -0,0 +1,6 @@ +unit main; +import alpha; +import beta; + +fn one() -> !void { return alpha.fail(); } +fn two() -> !void { return beta.fail(); } diff --git a/fec/tests/m8/missing/main.fe b/fec/tests/m8/missing/main.fe new file mode 100644 index 0000000..c95ad78 --- /dev/null +++ b/fec/tests/m8/missing/main.fe @@ -0,0 +1,5 @@ +// ERROR:3:import +unit main; +import absent; + +fn main() -> void {} diff --git a/fec/tests/m8/privfld/data.fe b/fec/tests/m8/privfld/data.fe new file mode 100644 index 0000000..cc36f31 --- /dev/null +++ b/fec/tests/m8/privfld/data.fe @@ -0,0 +1,5 @@ +unit data; + +pub struct Record { + value: i32, +} diff --git a/fec/tests/m8/privfld/main.fe b/fec/tests/m8/privfld/main.fe new file mode 100644 index 0000000..b870879 --- /dev/null +++ b/fec/tests/m8/privfld/main.fe @@ -0,0 +1,8 @@ +// ERROR:6:private +unit main; +import data; + +fn main() -> i32 { + let r = data.Record{ value: 7 }; + return r.value; +} diff --git a/fec/tests/m8/privfn/main.fe b/fec/tests/m8/privfn/main.fe new file mode 100644 index 0000000..d89c472 --- /dev/null +++ b/fec/tests/m8/privfn/main.fe @@ -0,0 +1,7 @@ +// ERROR:6:private +unit main; +import util; + +fn main() -> i32 { + return util.hidden(); +} diff --git a/fec/tests/m8/privfn/util.fe b/fec/tests/m8/privfn/util.fe new file mode 100644 index 0000000..ce93270 --- /dev/null +++ b/fec/tests/m8/privfn/util.fe @@ -0,0 +1,5 @@ +unit util; + +fn hidden() -> i32 { + return 1; +} diff --git a/fec/tests/m8/pubfld/data.fe b/fec/tests/m8/pubfld/data.fe new file mode 100644 index 0000000..7b04233 --- /dev/null +++ b/fec/tests/m8/pubfld/data.fe @@ -0,0 +1,5 @@ +unit data; + +pub struct Record { + pub value: i32, +} diff --git a/fec/tests/m8/pubfld/main.fe b/fec/tests/m8/pubfld/main.fe new file mode 100644 index 0000000..2af2ed1 --- /dev/null +++ b/fec/tests/m8/pubfld/main.fe @@ -0,0 +1,7 @@ +unit main; +import data; + +fn main() -> i32 { + let r = data.Record{ value: 7 }; + return r.value; +} diff --git a/fec/tests/m8/unitbad/main.fe b/fec/tests/m8/unitbad/main.fe new file mode 100644 index 0000000..3a2350f --- /dev/null +++ b/fec/tests/m8/unitbad/main.fe @@ -0,0 +1,4 @@ +// ERROR:2:unit +unit other; + +fn main() -> void {} diff --git a/fec/tests/m9/README.md b/fec/tests/m9/README.md new file mode 100644 index 0000000..ba80d35 --- /dev/null +++ b/fec/tests/m9/README.md @@ -0,0 +1,19 @@ +# M9 fixtures + +M9 adds comptime type parameters and monomorphization. + +`ok*.fe` must compile; `bad*.fe` must fail according to the first-line marker. +`defscope/` is a multi-unit definition-scope test and requires M8 imports. + +Coverage: +- generic functions and structs, +- multiple and duplicate instantiations, +- type aliases as comptime type values, +- `T == U` and `@is_int(T)` in comptime, +- instantiation-time operation errors, +- arity/type-argument errors, +- runtime `type` values forbidden, +- definition-unit name lookup, +- recursive instantiation depth limit. + +M9's DOS gate should additionally inspect generated `fe_generics.c`: `okdedup.fe` must emit one body for the repeated `(id, i32)` instantiation. diff --git a/fec/tests/m9/badarg.fe b/fec/tests/m9/badarg.fe new file mode 100644 index 0000000..18e207e --- /dev/null +++ b/fec/tests/m9/badarg.fe @@ -0,0 +1,10 @@ +// ERROR:9:comptime +unit badarg; + +fn id(comptime T: type, v: T) -> T { + return v; +} + +fn bad() -> i32 { + return id(7, 8); +} diff --git a/fec/tests/m9/badarity.fe b/fec/tests/m9/badarity.fe new file mode 100644 index 0000000..6692d28 --- /dev/null +++ b/fec/tests/m9/badarity.fe @@ -0,0 +1,10 @@ +// ERROR:9:argument +unit badarity; + +struct Box(T) { + value: T, +} + +fn bad() -> void { + var x: Box(i32, u8); +} diff --git a/fec/tests/m9/badbody.fe b/fec/tests/m9/badbody.fe new file mode 100644 index 0000000..c909bd0 --- /dev/null +++ b/fec/tests/m9/badbody.fe @@ -0,0 +1,10 @@ +// ERROR:9:instantiation +unit badbody; + +fn add(comptime T: type, a: T, b: T) -> T { + return a + b; +} + +fn bad() -> bool { + return add(bool, true, false); +} diff --git a/fec/tests/m9/baddepth.fe b/fec/tests/m9/baddepth.fe new file mode 100644 index 0000000..a6d981b --- /dev/null +++ b/fec/tests/m9/baddepth.fe @@ -0,0 +1,10 @@ +// ERROR:9:depth +unit baddepth; + +struct Box(T) { + value: T, +} + +fn bad() -> void { + var x: Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(Box(i32))))))))))))))))))))))))))))))))); +} diff --git a/fec/tests/m9/badfew.fe b/fec/tests/m9/badfew.fe new file mode 100644 index 0000000..6b43ae3 --- /dev/null +++ b/fec/tests/m9/badfew.fe @@ -0,0 +1,10 @@ +// ERROR:9:generic +unit badfew; + +struct Box(T) { + value: T, +} + +fn bad() -> void { + var x: Box; +} diff --git a/fec/tests/m9/badop.fe b/fec/tests/m9/badop.fe new file mode 100644 index 0000000..872989d --- /dev/null +++ b/fec/tests/m9/badop.fe @@ -0,0 +1,17 @@ +// ERROR:16:instantiation +unit badop; + +struct Token { + value: i32, +} + +fn max(comptime T: type, a: T, b: T) -> T { + if a > b { return a; } + return b; +} + +fn bad() -> Token { + let a = Token{ value: 1 }; + let b = Token{ value: 2 }; + return max(Token, a, b); +} diff --git a/fec/tests/m9/badscope/lib.fe b/fec/tests/m9/badscope/lib.fe new file mode 100644 index 0000000..bba2221 --- /dev/null +++ b/fec/tests/m9/badscope/lib.fe @@ -0,0 +1,6 @@ +// ERROR:5:helper +unit lib; + +pub fn call(comptime T: type, v: T) -> T { + return helper(v); +} diff --git a/fec/tests/m9/badscope/main.fe b/fec/tests/m9/badscope/main.fe new file mode 100644 index 0000000..e7dd676 --- /dev/null +++ b/fec/tests/m9/badscope/main.fe @@ -0,0 +1,8 @@ +unit main; +import lib; + +fn helper(v: i32) -> i32 { return v + 10; } + +fn main() -> i32 { + return lib.call(i32, 1); +} diff --git a/fec/tests/m9/badtype.fe b/fec/tests/m9/badtype.fe new file mode 100644 index 0000000..b0b8325 --- /dev/null +++ b/fec/tests/m9/badtype.fe @@ -0,0 +1,6 @@ +// ERROR:5:type +unit badtype; + +fn bad() -> void { + let t = i32; +} diff --git a/fec/tests/m9/defscope/lib.fe b/fec/tests/m9/defscope/lib.fe new file mode 100644 index 0000000..4dcb06b --- /dev/null +++ b/fec/tests/m9/defscope/lib.fe @@ -0,0 +1,13 @@ +unit lib; + +fn bump_i32(v: i32) -> i32 { + return v + 1; +} + +pub fn bump(comptime T: type, v: T) -> T { + comptime if T == i32 { + return bump_i32(v); + } else { + return v; + } +} diff --git a/fec/tests/m9/defscope/main.fe b/fec/tests/m9/defscope/main.fe new file mode 100644 index 0000000..9c63d25 --- /dev/null +++ b/fec/tests/m9/defscope/main.fe @@ -0,0 +1,6 @@ +unit main; +import lib; + +fn main() -> i32 { + return lib.bump(i32, 4); +} diff --git a/fec/tests/m9/okalias.fe b/fec/tests/m9/okalias.fe new file mode 100644 index 0000000..a331e8d --- /dev/null +++ b/fec/tests/m9/okalias.fe @@ -0,0 +1,11 @@ +unit okalias; + +const Word = i32; + +fn id(comptime T: type, v: T) -> T { + return v; +} + +fn test() -> Word { + return id(Word, 12); +} diff --git a/fec/tests/m9/okbox.fe b/fec/tests/m9/okbox.fe new file mode 100644 index 0000000..5a50c49 --- /dev/null +++ b/fec/tests/m9/okbox.fe @@ -0,0 +1,18 @@ +unit okbox; + +struct Box(T) { + value: T, + + pub fn new(v: T) -> Self { + return Self{ value: v }; + } + + pub fn get(self: &Self) -> &T { + return &self.value; + } +} + +fn test() -> i32 { + var b: Box(i32) = Box(i32).new(7); + return b.get().^; +} diff --git a/fec/tests/m9/okdedup.fe b/fec/tests/m9/okdedup.fe new file mode 100644 index 0000000..f243e91 --- /dev/null +++ b/fec/tests/m9/okdedup.fe @@ -0,0 +1,8 @@ +unit okdedup; + +fn id(comptime T: type, v: T) -> T { + return v; +} + +fn a() -> i32 { return id(i32, 1); } +fn b() -> i32 { return id(i32, 2); } diff --git a/fec/tests/m9/okid.fe b/fec/tests/m9/okid.fe new file mode 100644 index 0000000..972f6e2 --- /dev/null +++ b/fec/tests/m9/okid.fe @@ -0,0 +1,9 @@ +unit okid; + +fn id(comptime T: type, v: T) -> T { + return v; +} + +fn test() -> i32 { + return id(i32, 7); +} diff --git a/fec/tests/m9/okisint.fe b/fec/tests/m9/okisint.fe new file mode 100644 index 0000000..fba420c --- /dev/null +++ b/fec/tests/m9/okisint.fe @@ -0,0 +1,13 @@ +unit okisint; + +fn is_integer(comptime T: type) -> bool { + comptime if @is_int(T) { + return true; + } else { + return false; + } +} + +fn test() -> bool { + return is_integer(u16); +} diff --git a/fec/tests/m9/okmulti.fe b/fec/tests/m9/okmulti.fe new file mode 100644 index 0000000..cc20def --- /dev/null +++ b/fec/tests/m9/okmulti.fe @@ -0,0 +1,11 @@ +unit okmulti; + +fn id(comptime T: type, v: T) -> T { + return v; +} + +fn test() -> i32 { + let a: i32 = id(i32, 7); + let b: u8 = id(u8, 9 as u8); + return a + (b as i32); +} diff --git a/fec/tests/m9/oknested.fe b/fec/tests/m9/oknested.fe new file mode 100644 index 0000000..912786e --- /dev/null +++ b/fec/tests/m9/oknested.fe @@ -0,0 +1,15 @@ +unit oknested; + +struct Box(T) { + value: T, + + pub fn new(v: T) -> Self { + return Self{ value: v }; + } +} + +fn test() -> i32 { + let inner: Box(i32) = Box(i32).new(3); + let outer: Box(Box(i32)) = Box(Box(i32)).new(inner); + return outer.value.value; +} diff --git a/fec/tests/m9/okpair.fe b/fec/tests/m9/okpair.fe new file mode 100644 index 0000000..40af14e --- /dev/null +++ b/fec/tests/m9/okpair.fe @@ -0,0 +1,15 @@ +unit okpair; + +struct Pair(A, B) { + first: A, + second: B, + + pub fn new(a: A, b: B) -> Self { + return Self{ first: a, second: b }; + } +} + +fn test() -> i32 { + let p: Pair(i32, u8) = Pair(i32, u8).new(4, 5 as u8); + return p.first + (p.second as i32); +} diff --git a/fec/tests/m9/oktypeeq.fe b/fec/tests/m9/oktypeeq.fe new file mode 100644 index 0000000..49f7b9c --- /dev/null +++ b/fec/tests/m9/oktypeeq.fe @@ -0,0 +1,13 @@ +unit oktypeeq; + +fn kind(comptime T: type) -> i32 { + comptime if T == i32 { + return 1; + } else { + return 0; + } +} + +fn test() -> i32 { + return kind(i32); +}