diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index ae881a4086..928834a574 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -4745,7 +4745,8 @@ fn (mut g Gen) return_statement(node ast.Return) { g.writeln('return $opt_tmp;') return } - free := g.is_autofree && !g.is_builtin_mod // node.exprs[0] is ast.CallExpr + // free := g.is_autofree && !g.is_builtin_mod // node.exprs[0] is ast.CallExpr + free := !g.is_builtin_mod // node.exprs[0] is ast.CallExpr mut tmp := '' if free { // `return foo(a, b, c)` @@ -4777,7 +4778,9 @@ fn (mut g Gen) return_statement(node ast.Return) { // autofree before `return` // set free_parent_scopes to true, since all variables defined in parent // scopes need to be freed before the return - g.autofree_scope_vars(node.pos.pos - 1, node.pos.line_nr, true) + if g.pref.autofree { + g.autofree_scope_vars(node.pos.pos - 1, node.pos.line_nr, true) + } if tmp != '' { g.write('return $tmp') } diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index e6e284f61a..34a3ac7c51 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -421,7 +421,8 @@ fn (mut g Gen) call_expr(node ast.CallExpr) { } else { '' } - if gen_or && g.pref.autofree && g.inside_return { + // if gen_or && g.pref.autofree && g.inside_return { + if gen_or && g.inside_return { // TODO optional return af hack (tmp_count gets increased in .return_statement()) g.tmp_count-- } diff --git a/vlib/v/tests/option_test.v b/vlib/v/tests/option_test.v index ca72286ff8..fdc721f4f1 100644 --- a/vlib/v/tests/option_test.v +++ b/vlib/v/tests/option_test.v @@ -364,7 +364,6 @@ struct MultiOptionalFieldTest { b ?int } -/* fn foo() ?int { return 0 } @@ -380,4 +379,3 @@ fn test_return_or() { x := foo2() or { return } assert x == 0 } -*/