From d86b523aa920e239028bbb91546eb7591051f4c8 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 26 Feb 2026 11:31:32 +0300 Subject: [PATCH] cgen: fix C error when passing expression directly as argument instead of variable (fixes #19152) --- vlib/v/gen/c/fn.v | 22 +++++++++++++++++-- vlib/v/gen/c/testdata/autofree_ifexpr_arg.out | 1 + vlib/v/gen/c/testdata/autofree_ifexpr_arg.vv | 9 ++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 vlib/v/gen/c/testdata/autofree_ifexpr_arg.out create mode 100644 vlib/v/gen/c/testdata/autofree_ifexpr_arg.vv diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index ec974fe13..b68f36405 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2325,6 +2325,24 @@ fn (mut g Gen) gen_trace_call(node ast.CallExpr, name string) { } } +fn (mut g Gen) autofree_tmp_arg_init_stmt(prepend string, expr ast.Expr) string { + saved_out := g.out + saved_stmt_path_pos := g.stmt_path_pos.clone() + saved_empty_line := g.empty_line + saved_indent := g.indent + g.out = strings.new_builder(256) + g.stmt_path_pos = [0] + g.empty_line = true + g.indent = 0 + defer { + g.out = saved_out + g.stmt_path_pos = saved_stmt_path_pos + g.empty_line = saved_empty_line + g.indent = saved_indent + } + return g.expr_string_surround(prepend, expr, ';').trim_space() +} + fn (mut g Gen) autofree_call_pregen(node ast.CallExpr) { // g.writeln('// autofree_call_pregen()') // Create a temporary var before fn call for each argument in order to free it (only if it's a complex expression, @@ -2397,10 +2415,10 @@ fn (mut g Gen) autofree_call_pregen(node ast.CallExpr) { g.is_autofree = false } - s = g.expr_string_surround(s, arg.expr, ';').trim_space() + tmp_arg_init := g.autofree_tmp_arg_init_stmt(s, arg.expr) g.is_autofree = old_is_autofree g.is_autofree_tmp = false - g.strs_to_free0 << s + g.strs_to_free0 << tmp_arg_init // This tmp arg var will be freed with the rest of the vars at the end of the scope. } } diff --git a/vlib/v/gen/c/testdata/autofree_ifexpr_arg.out b/vlib/v/gen/c/testdata/autofree_ifexpr_arg.out new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/vlib/v/gen/c/testdata/autofree_ifexpr_arg.out @@ -0,0 +1 @@ +1 diff --git a/vlib/v/gen/c/testdata/autofree_ifexpr_arg.vv b/vlib/v/gen/c/testdata/autofree_ifexpr_arg.vv new file mode 100644 index 000000000..f5fac0f94 --- /dev/null +++ b/vlib/v/gen/c/testdata/autofree_ifexpr_arg.vv @@ -0,0 +1,9 @@ +// vtest vflags: -autofree +import strings + +fn main() { + mut sb := strings.new_builder(16) + hour := 13 + sb.write_string(if hour > 12 { hour - 12 } else { hour }.str()) + println(sb.str()) +} -- 2.39.5