From: Wolfgang (Blub) Bumiller Date: Fri, 23 Nov 2012 13:28:11 +0000 (+0100) Subject: operators &= and |= X-Git-Tag: 0.1.9~312 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=122e80cc4d3db31174ed91bfca217ed7b9a4f0c3;p=xonotic%2Fgmqcc.git operators &= and |= --- 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