Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions tests/move/test_move_01.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// EXPECT: FAIL

struct M { val: int }

fn consume(m: M) {
println "{m.val}"
}

fn main() {
let m = M { val: 10 }
consume(m)
consume(m) // Use-after-move
}

10 changes: 10 additions & 0 deletions tests/move/test_move_02.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// EXPECT: FAIL

struct M { val: int }

fn main() {
let m = M { val: 1 }
let a = m
let b = m // Use-after-move
println "{a.val} {b.val}"
}
16 changes: 16 additions & 0 deletions tests/move/test_move_03.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "{m.val}"
}

fn main() {
let m = M { val: 10 }
if 1 == 1 {
consume(m)
} else {
consume(m)
}
}
16 changes: 16 additions & 0 deletions tests/move/test_move_04.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "{m.val}"
}

fn main() {
let m = M { val: 10 }
if false {
consume(m)
}
consume(m)
}

16 changes: 16 additions & 0 deletions tests/move/test_move_05.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "{m.val}"
}

fn main() {
let m = M { val: 10 }
while false {
consume(m)
}
consume(m)
}

16 changes: 16 additions & 0 deletions tests/move/test_move_06.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// EXPECT: PASS

struct M { val: int }

fn takes_and_true(m: M) -> bool {
return true
}

fn main() {
let m = M { val: 10 }
if false && takes_and_true(m) {
println "never"
}
takes_and_true(m)
}

16 changes: 16 additions & 0 deletions tests/move/test_move_07.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "{m.val}"
}

fn main() {
let m = M { val: 10 }
match 1 {
0 => { consume(m) }
_ => { consume(m) }
}
}

15 changes: 15 additions & 0 deletions tests/move/test_move_08.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// EXPECT: PASS

struct M { val: int }

impl Copy for M {}

fn consume(m: M) {
println "{m.val}"
}

fn main() {
let m = M { val: 10 }
consume(m)
consume(m)
}
13 changes: 13 additions & 0 deletions tests/move/test_move_09.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// EXPECT: PASS

struct M { val: int }

fn borrow(m: M*) {
println "borrowed"
}

fn main() {
let m = M { val: 10 }
borrow(&m)
borrow(&m)
}
15 changes: 15 additions & 0 deletions tests/move/test_move_10.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// EXPECT: FAIL

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn main() {
let m = M { val: 10 }
consume(m)
let x = m.val
println "{x}"
}

18 changes: 18 additions & 0 deletions tests/move/test_move_11.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// EXPECT: FAIL

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn borrow(m: M*) {
println "borrow"
}

fn main() {
let m = M { val: 10 }
consume(m)
borrow(&m)
}

14 changes: 14 additions & 0 deletions tests/move/test_move_12.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// EXPECT: FAIL

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn main() {
let m = M { val: 10 }
consume(m)
println "{m.val}"
}

19 changes: 19 additions & 0 deletions tests/move/test_move_13.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// EXPECT: FAIL

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn main(argc: int, argv: char**) {
let m = M { val: 10 }
consume(m)

if argc == 1 {
m = M { val: 20 }
}

consume(m)
}

17 changes: 17 additions & 0 deletions tests/move/test_move_14.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn main(argc: int, argv: char**) {
let m = M { val: 10 }

if argc == 1 {
consume(m)
} else {
consume(m)
}
}
17 changes: 17 additions & 0 deletions tests/move/test_move_15.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn main() {
let m = M { val: 10 }

match 1 {
0 => { consume(m) }
_ => { consume(m) }
}
}

17 changes: 17 additions & 0 deletions tests/move/test_move_16.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// EXPECT: PASS

struct M { val: int }

fn consume_and_true(m: M) -> bool {
println "consume"
return true
}

fn main() {
let m = M { val: 10 }
if false && consume_and_true(m) {
println "never"
}
consume_and_true(m)
}

18 changes: 18 additions & 0 deletions tests/move/test_move_17.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn main() {
let m = M { val: 10 }

while false {
consume(m)
}

consume(m)
}

18 changes: 18 additions & 0 deletions tests/move/test_move_18.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// EXPECT: PASS

struct M { val: int }

fn consume(m: M) {
println "consume"
}

fn main() {
let m = M { val: 10 }

if false {
consume(m)
}

consume(m)
}

17 changes: 17 additions & 0 deletions tests/move/test_move_19.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// EXPECT: FAIL

struct M { val: int }

fn consume(m: M) {
println "consume"
}

test "move in test block" {
let m = M { val: 10 }
consume(m)
let x = m.val
assert(x == 10, "must fail")
}

fn main() {}

15 changes: 15 additions & 0 deletions tests/move/test_move_20.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// EXPECT: FAIL

struct M { val: int }

fn bad() -> M {
let m = M { val: 10 }
let n = m
return m
}

fn main() {
let x = bad()
println "{x.val}"
}

22 changes: 22 additions & 0 deletions tests/move/test_move_21.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// EXPECT: PASS

// Complex control-flow: exactly one consume per path, should be valid.
struct M { val: int }

fn consume(m: M) {
println "consume {m.val}"
}

fn main(argc: int, argv: char**) {
let m = M { val: 10 }

if argc == 1 {
if argc == 2 {
consume(m)
} else {
consume(m)
}
} else {
consume(m)
}
}
22 changes: 22 additions & 0 deletions tests/move/test_move_22.zc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// EXPECT: PASS

// if + match nesting, still one move on every concrete path.
struct M { val: int }

fn consume(m: M) {
println "consume {m.val}"
}

fn main(argc: int, argv: char**) {
let m = M { val: 20 }

if argc > 0 {
match argc {
1 => { consume(m) }
_ => { consume(m) }
}
} else {
consume(m)
}
}

Loading
Loading