wip: advance M5 ownership cleanup
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
unit m5_bad_destroy;
|
||||
|
||||
fn bad(x: i32) -> void {
|
||||
mem.destroy(x);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
unit m5_bad_move;
|
||||
|
||||
fn take(p: ^i32) -> void { mem.destroy(p); }
|
||||
|
||||
fn twice(p: ^i32) -> void {
|
||||
take(p);
|
||||
take(p);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
unit m5_defer;
|
||||
|
||||
pub fn cleanup(p: ^i32) -> void {
|
||||
defer { mem.destroy(p); }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
unit m5_owned;
|
||||
|
||||
fn main() -> void {
|
||||
var p: ^i32 = try mem.create(i32);
|
||||
p = try mem.create(i32);
|
||||
p.^ = 7;
|
||||
let value: i32 = p.^;
|
||||
defer { mem.destroy(p); }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
extern long fe_m5_runtime_run(long mode);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
if (fe_m5_runtime_run(0) != 0) return 1;
|
||||
if (fe_m5_runtime_run(1) != 9) return 2;
|
||||
if (fe_m5_runtime_run(2) != 0) return 3;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
unit m5_runtime;
|
||||
|
||||
pub fn run(mode: i32) -> i32 {
|
||||
var p: ^i32 = try mem.create(i32);
|
||||
defer { mem.destroy(p); }
|
||||
p.^ = 7;
|
||||
if mode == 1 {
|
||||
p = try mem.create(i32);
|
||||
p.^ = 9;
|
||||
return p.^;
|
||||
}
|
||||
while true {
|
||||
break;
|
||||
}
|
||||
if mode == 2 {
|
||||
return 0;
|
||||
}
|
||||
return p.^ - 7;
|
||||
}
|
||||
@@ -91,3 +91,14 @@ for f in bad-many bad-open bad-cls; do
|
||||
fi
|
||||
done
|
||||
echo "M4 tests: formatting builtins passed"
|
||||
|
||||
for f in defer owned; do
|
||||
"$root"/fec --target=bits32 --emit-c "$root"/tests/m5/$f.fe -o "$m4tmp/m5-$f.c"
|
||||
done
|
||||
for f in bad-move bad-destroy; do
|
||||
if "$root"/fec --target=bits32 --emit-c "$root"/tests/m5/$f.fe -o "$m4tmp/m5-$f.c" >/dev/null 2>/dev/null; then
|
||||
echo "FAIL (accepted M5 ownership error): $f.fe"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
echo "M5 tests: owned move/defer checks passed"
|
||||
|
||||
Reference in New Issue
Block a user