diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 4b1c5b42db06c7..d2f172dfc14ab9 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -487,7 +487,17 @@ fn (mut c Checker) anon_fn(mut node ast.AnonFn) ast.Type { var.pos) } if parent_var.expr is ast.IfGuardExpr { - var.typ = parent_var.expr.expr_type.clear_flags(.option, .result) + sym := c.table.sym(parent_var.expr.expr_type) + if sym.info is ast.MultiReturn { + for i, v in parent_var.expr.vars { + if v.name == var.name { + var.typ = sym.info.types[i] + break + } + } + } else { + var.typ = parent_var.expr.expr_type.clear_flags(.option, .result) + } } else { var.typ = parent_var.typ } diff --git a/vlib/v/tests/closure_in_if_guard_test.v b/vlib/v/tests/closure_in_if_guard_1_test.v similarity index 100% rename from vlib/v/tests/closure_in_if_guard_test.v rename to vlib/v/tests/closure_in_if_guard_1_test.v diff --git a/vlib/v/tests/closure_in_if_guard_2_test.v b/vlib/v/tests/closure_in_if_guard_2_test.v new file mode 100644 index 00000000000000..e2bcf184bf601c --- /dev/null +++ b/vlib/v/tests/closure_in_if_guard_2_test.v @@ -0,0 +1,16 @@ +fn get_info() ?(int, bool) { + return 45, true +} + +fn test_closure_in_if_guard() { + mut ret := '' + if v1, v2 := get_info() { + func := fn [v1, v2] () string { + println(v1) + println(v2) + return '${v1}, ${v2}' + } + ret = func() + } + assert ret == '45, true' +}