checker: fix $res() used in defer {} blocks with more statements, add a test (#22998)

This commit is contained in:
Delyan Angelov 2024-11-28 13:58:19 +02:00 committed by GitHub
parent 153b7f00df
commit acad4c2810
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 1 deletions

View File

@ -2177,6 +2177,7 @@ fn (mut c Checker) stmt(mut node ast.Stmt) {
c.inside_const = false
}
ast.DeferStmt {
c.inside_defer = true
if node.idx_in_fn < 0 && c.table.cur_fn != unsafe { nil } {
node.idx_in_fn = c.table.cur_fn.defer_stmts.len
c.table.cur_fn.defer_stmts << unsafe { &node }
@ -2203,7 +2204,6 @@ fn (mut c Checker) stmt(mut node ast.Stmt) {
node.defer_vars[i] = id
}
}
c.inside_defer = true
c.stmts(mut node.stmts)
c.inside_defer = false
}

View File

@ -38,3 +38,19 @@ fn test_with_multi_return() {
assert test.a == a
assert test.b == b
}
fn f() int {
defer {
a := $res()
assert true
println('result is: ${a}')
}
if true {
return 123
}
return 42
}
fn test_res_in_defer_blocks_with_many_statements_works() {
assert f() == 123
}