Skip to content

Commit 04654ed

Browse files
authored
parser: check error for defer propagate (fix #13534) (#13536)
1 parent 75ebac0 commit 04654ed

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

vlib/net/unix/use_net_and_net_unix_together_test.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ fn test_that_net_and_net_unix_can_be_imported_together_without_conflicts() ? {
1111
mut l := unix.listen_stream(test_port) or { panic(err) }
1212
go echo_server(mut l)
1313
defer {
14-
l.close() ?
14+
l.close() or {}
1515
}
1616
//
1717
mut c := unix.connect_stream(test_port) ?
1818
defer {
19-
c.close() ?
19+
c.close() or {}
2020
}
2121
//
2222
data := 'Hello from vlib/net!'

vlib/v/parser/parser.v

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2694,6 +2694,10 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr {
26942694
// `foo()?`
26952695
if p.tok.kind == .question {
26962696
p.next()
2697+
if p.inside_defer {
2698+
p.error_with_pos('error propagation not allowed inside `defer` blocks',
2699+
p.prev_tok.pos())
2700+
}
26972701
or_kind = .propagate
26982702
}
26992703
//
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
vlib/v/parser/tests/defer_propagate2.vv:16:13: error: error propagation not allowed inside `defer` blocks
2+
14 | dump(s.x)
3+
15 | defer {
4+
16 | s.close() ?
5+
| ^
6+
17 | }
7+
18 | return s.x
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
struct Abc {
2+
mut:
3+
x int = 123
4+
}
5+
6+
fn (mut s Abc) close() ? {
7+
println('> CLOSE 1 s.x: $s.x')
8+
s.x = -1
9+
println('> CLOSE 2 s.x: $s.x')
10+
}
11+
12+
fn opt2() ?int {
13+
mut s := Abc{}
14+
dump(s.x)
15+
defer {
16+
s.close() ?
17+
}
18+
return s.x
19+
}
20+
21+
fn main() {
22+
println(opt2() ?)
23+
}

0 commit comments

Comments
 (0)