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 +}