From 58febe460730c6eabf7e9c4689c372f0bc4a3588 Mon Sep 17 00:00:00 2001 From: Daniel Oberhoff Date: Sat, 9 Apr 2022 16:37:39 +0200 Subject: [PATCH] cgen: fix autofree of heap variables (#13823) --- vlib/v/gen/c/cgen.v | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 6b2006d474..edcee66730 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2645,12 +2645,13 @@ fn (mut g Gen) autofree_variable(v ast.Var) { g.autofree_var_call('string_free', v) return } - if sym.has_method('free') { - g.autofree_var_call(free_fn, v) - } else if g.pref.experimental && v.typ.is_ptr() && sym.name.after('.')[0].is_capital() { + if g.pref.experimental && v.typ.is_ptr() && sym.name.after('.')[0].is_capital() { // Free user reference types g.autofree_var_call('free', v) } + if sym.has_method('free') { + g.autofree_var_call(free_fn, v) + } } fn (mut g Gen) autofree_var_call(free_fn_name string, v ast.Var) { @@ -2698,7 +2699,11 @@ fn (mut g Gen) autofree_var_call(free_fn_name string, v ast.Var) { if v.typ == ast.error_type && !v.is_autofree_tmp { return } - af.writeln('\t${free_fn_name}(&${c_name(v.name)}); // autofreed var $g.cur_mod.name $g.is_builtin_mod') + if v.is_auto_heap { + af.writeln('\t${free_fn_name}(${c_name(v.name)}); // autofreed heap var $g.cur_mod.name $g.is_builtin_mod') + } else { + af.writeln('\t${free_fn_name}(&${c_name(v.name)}); // autofreed var $g.cur_mod.name $g.is_builtin_mod') + } } g.autofree_scope_stmts << af.str() }