diff options
| author | gingerBill <bill@gingerbill.org> | 2019-05-06 11:32:35 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-05-06 11:32:35 +0100 |
| commit | ab0afa548b40ea3c0be6ebcbe1571cd6c3569021 (patch) | |
| tree | c430175c4b571b2c61ce4677b6379c225445e792 /src/ir.cpp | |
| parent | ea1690b7a128e435b86e332d0742150cb9db02b0 (diff) | |
Fix ||= and &&=
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
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); |