1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/v/tests/defer_test.v
Daniel Däschle 0024ff848d
parser: check if the last or {} block expression is valid
These checks allows for:

a) `x := call() or { 'abc' }`
b) `x := call() or { panic('abc') }`
c) `x := call() or { exit(123) }`
d) `x := call() or { continue }`
e) `x := call() or { break }`
f) `x := call() or { return }`

... but produce errors for:

g) `x := call() or { println('an error') }` , etc.
2020-04-07 17:36:00 +03:00

63 lines
702 B
V

fn foo() string {
println('foo()')
return 'foo'
}
fn foo2() string {
println('start')
defer {
println('defer')
}
defer {
println('defer2')
}
println('end')
return foo()
}
fn test_defer() {
assert foo2() == 'foo'
}
fn set_num(i int, n mut Num) {
defer {
println('exiting')
n.val++
}
println('Hi')
if i < 5 {
return
}
else {
n.val++
}
}
fn set_num_opt(n mut Num) ?int {
defer {
n.val = 1
}
return 99
}
struct Num {
mut:
val int
}
fn test_defer_early_exit() {
mut sum := Num{
0}
for i in 0 .. 10 {
set_num(i, mut sum)
}
println('sum: $sum.val')
assert sum.val == 15
}
fn test_defer_option() {
mut ok := Num{0}
set_num_opt(mut ok)
assert ok.val == 1
}