From 122e80cc4d3db31174ed91bfca217ed7b9a4f0c3 Mon Sep 17 00:00:00 2001 From: "Wolfgang (Blub) Bumiller" Date: Fri, 23 Nov 2012 14:28:11 +0100 Subject: [PATCH] operators &= and |= --- parser.c | 17 +++++++++++++++++ tests/operators.qc | 5 +++++ tests/operators.tmpl | 2 ++ 3 files changed, 24 insertions(+) diff --git a/parser.c b/parser.c index c8d1c11..67d7202 100644 --- a/parser.c +++ b/parser.c @@ -1015,6 +1015,23 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) return false; }; break; + case opid2('&','='): + case opid2('|','='): + if (NotSameType(TYPE_FLOAT)) { + ast_type_to_string(exprs[0], ty1, sizeof(ty1)); + ast_type_to_string(exprs[1], ty2, sizeof(ty2)); + parseerror(parser, "invalid types used in expression: %s and %s", + ty1, ty2); + return false; + } + if (ast_istype(exprs[0], ast_entfield)) + assignop = type_storep_instr[exprs[0]->expression.vtype]; + else + assignop = type_store_instr[exprs[0]->expression.vtype]; + out = (ast_expression*)ast_binstore_new(ctx, assignop, + (op->id == opid2('&','=') ? INSTR_BITAND : INSTR_BITOR), + exprs[0], exprs[1]); + break; } #undef NotSameType diff --git a/tests/operators.qc b/tests/operators.qc index e440ec5..e1464e3 100644 --- a/tests/operators.qc +++ b/tests/operators.qc @@ -51,4 +51,9 @@ void main() { v = '3 4 5'; print(vtos(v *= 2), " = '6 8 10'\n"); print(vtos(v /= 2), " = '3 4 5'\n"); + + // bit compounds + a = 1; + print(ftos(a |= 2), " = 3\n"); + print(ftos(a &= 6), " = 2\n"); } diff --git a/tests/operators.tmpl b/tests/operators.tmpl index 06426ac..fcf9afd 100644 --- a/tests/operators.tmpl +++ b/tests/operators.tmpl @@ -16,3 +16,5 @@ M: 6 = 6 M: 3 = 3 M: '6 8 10' = '6 8 10' M: '3 4 5' = '3 4 5' +M: 3 = 3 +M: 2 = 2 -- 2.39.2