diff options
Diffstat (limited to 'tests/memory/test_move_semantics.zc')
| -rw-r--r-- | tests/memory/test_move_semantics.zc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/memory/test_move_semantics.zc b/tests/memory/test_move_semantics.zc new file mode 100644 index 0000000..0ccd822 --- /dev/null +++ b/tests/memory/test_move_semantics.zc @@ -0,0 +1,55 @@ + +struct Point { + x: int; +} + +struct Mover { + val: int; +} + +test "basic_move" { + let p1 = Mover { val: 10 }; + let p2 = p1; // p1 moved to p2 + + // Valid usage of p2 + assert(p2.val == 10, "p2 should be valid"); + + // Invalid usage of p1 (Uncomment to test compiler error) + // let p3 = p1; +} + +test "primitive_copy" { + let i = 10; + let j = i; // Copy + let k = i; // Copy again - should be valid + assert(k == 10, "Primitive copy failed"); +} + +test "reassignment" { + let m1 = Mover { val: 1 }; + let m2 = m1; // m1 moved + + m1 = Mover { val: 2 }; // Resurrect m1 + let m3 = m1; // Valid now + assert(m3.val == 2, "Resurrection failed"); +} + +fn consume(m: Mover) { + assert(m.val == 10, "Func arg failed"); +} + +test "func_arg" { + let m = Mover { val: 10 }; + consume(m); // m moved + + // 2. Use after move (Call - Negative Test) + // consume(m); // Should fail: Use of moved value 'm' +} + +/* +// 3. Use after return (Negative Test) +fn fail_return(m: Mover) -> Mover { + let m2 = m; + return m; // Should fail: Use of moved value 'm' +} +*/ |
