From ab0afa548b40ea3c0be6ebcbe1571cd6c3569021 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 6 May 2019 11:32:35 +0100 Subject: Fix ||= and &&= --- src/ir.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/ir.cpp') diff --git a/src/ir.cpp b/src/ir.cpp index 08960efab..4eee6f54f 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -7687,6 +7687,7 @@ void ir_build_assign_op(irProcedure *proc, irAddr const &lhs, irValue *value, To } else { change = ir_emit_conv(proc, value, type); } + irValue *new_value = ir_emit_arith(proc, op, old_value, change, type); ir_addr_store(proc, lhs, new_value); } @@ -8394,14 +8395,20 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) { // +=, -=, etc i32 op = cast(i32)as->op.kind; op += Token_Add - Token_AddEq; // Convert += to + - irAddr lhs = ir_build_addr(proc, as->lhs[0]); - irValue *value = ir_build_expr(proc, as->rhs[0]); - ir_build_assign_op(proc, lhs, value, cast(TokenKind)op); - break; + if (op == Token_CmpAnd || op == Token_CmpOr) { + Type *type = as->lhs[0]->tav.type; + irValue *new_value = ir_emit_logical_binary_expr(proc, cast(TokenKind)op, as->lhs[0], as->rhs[0], type); + + irAddr lhs = ir_build_addr(proc, as->lhs[0]); + ir_addr_store(proc, lhs, new_value); + } else { + irAddr lhs = ir_build_addr(proc, as->lhs[0]); + irValue *value = ir_build_expr(proc, as->rhs[0]); + ir_build_assign_op(proc, lhs, value, cast(TokenKind)op); + } + return; } } - - gb_temp_arena_memory_end(tmp); case_end; case_ast_node(es, ExprStmt, node); -- cgit v1.2.3