diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 4aec3a14d4..ed917c85a3 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2970,7 +2970,9 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int // continue // } // if v.pos.pos > end_pos { - if obj.pos.pos > end_pos || (obj.pos.pos < start_pos && obj.pos.line_nr == line_nr) { + if obj.pos.pos > end_pos + || (obj.pos.pos < start_pos && obj.pos.line_nr == line_nr) + || (end_pos < scope.end_pos && obj.expr is ast.IfExpr) { // Do not free vars that were declared after this scope continue } diff --git a/vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v b/vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v new file mode 100644 index 0000000000..4cccbe588c --- /dev/null +++ b/vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v @@ -0,0 +1,19 @@ +fn main() { + out := if temp := f('') { + temp + } else if temp := f('something') { + temp + } else { + return + } + + assert out[0] == 104 + assert out[1] == 105 +} + +fn f(s string) ?[]u8 { + if s == '' { + return none + } + return [u8(104), 105] +}