diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 7e995e3462..b531040139 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -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 } diff --git a/vlib/v/tests/defer/defer_use_returned_value_test.v b/vlib/v/tests/defer/defer_use_returned_value_test.v index a8ea9df4e8..ff191c73da 100644 --- a/vlib/v/tests/defer/defer_use_returned_value_test.v +++ b/vlib/v/tests/defer/defer_use_returned_value_test.v @@ -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 +}