From d3cf53ec4112bfa2e33e57f183dea2437ce9c487 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 15 Aug 2021 12:55:27 +0800 Subject: [PATCH] cgen: fix a bug with autofree in if expr (#11182) --- vlib/v/gen/c/infix_expr.v | 16 ++++++++++++++++ vlib/v/tests/valgrind/if_expr.v | 11 +++++++++++ 2 files changed, 27 insertions(+) create mode 100644 vlib/v/tests/valgrind/if_expr.v diff --git a/vlib/v/gen/c/infix_expr.v b/vlib/v/gen/c/infix_expr.v index 901e604bb6..adb3681b8c 100644 --- a/vlib/v/gen/c/infix_expr.v +++ b/vlib/v/gen/c/infix_expr.v @@ -505,6 +505,22 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) { // It handles auto dereferencing of variables, as well as automatic casting // (see Gen.expr_with_cast for more details) fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) { + if node.left is ast.Ident && node.right is ast.IfExpr { + // b := a && if true { a = false ...} else {...} + if g.need_tmp_var_in_if(node.right) { + tmp := g.new_tmp_var() + styp := g.typ(node.left_type) + cur_line := g.go_before_stmt(0) + g.empty_line = true + g.write('$styp $tmp = ') + g.expr(node.left) + g.writeln(';') + g.stmt_path_pos << g.out.len + g.write('$cur_line $tmp $node.op.str() ') + g.expr(node.right) + return + } + } if node.left_type.is_ptr() && node.left.is_auto_deref_var() { g.write('*') } diff --git a/vlib/v/tests/valgrind/if_expr.v b/vlib/v/tests/valgrind/if_expr.v new file mode 100644 index 0000000000..e741f86db9 --- /dev/null +++ b/vlib/v/tests/valgrind/if_expr.v @@ -0,0 +1,11 @@ +fn main() { + mut a := true + b := a && if true { + a = false + true + } else { + false + } + println(b) + assert b == true +}