diff --git a/vlib/v/gen/c/infix.v b/vlib/v/gen/c/infix.v index 29bddb2b03..9793d55c0e 100644 --- a/vlib/v/gen/c/infix.v +++ b/vlib/v/gen/c/infix.v @@ -830,6 +830,26 @@ fn (mut g Gen) infix_expr_and_or_op(node ast.InfixExpr) { return } g.inside_ternary = prev_inside_ternary + } else if node.right is ast.MatchExpr { + // `b := a && match true { true { a = false ...} else {...}}` + prev_inside_ternary := g.inside_ternary + g.inside_ternary = 0 + if g.need_tmp_var_in_match(node.right) { + tmp := g.new_tmp_var() + cur_line := g.go_before_stmt(0).trim_space() + g.empty_line = true + g.write('bool ${tmp} = (') + g.expr(node.left) + g.writeln(');') + g.set_current_pos_as_last_stmt_pos() + g.write('${cur_line} ${tmp} ${node.op.str()} ') + g.infix_left_var_name = if node.op == .and { tmp } else { '!${tmp}' } + g.expr(node.right) + g.infix_left_var_name = '' + g.inside_ternary = prev_inside_ternary + return + } + g.inside_ternary = prev_inside_ternary } else if g.need_tmp_var_in_array_call(node.right) { // `if a == 0 || arr.any(it.is_letter()) {...}` tmp := g.new_tmp_var() diff --git a/vlib/v/tests/match_expr_in_infix_expr_test.v b/vlib/v/tests/match_expr_in_infix_expr_test.v new file mode 100644 index 0000000000..c9425f69cf --- /dev/null +++ b/vlib/v/tests/match_expr_in_infix_expr_test.v @@ -0,0 +1,16 @@ +fn test_match_expr_in_infix_expr() { + mut a := true + b := a && match true { + true { + a = false + true + } + false { + false + } + } + println(a) + assert a == false + println(b) + assert b == true +}