From: Wolfgang Bumiller Date: Thu, 20 Dec 2012 18:00:23 +0000 (+0100) Subject: Making logical 'and' and 'or' use NOT_ in -fcorrect-logic for both operands normally... X-Git-Tag: 0.2~54 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=b85441d6af9d7b1415cabb893c7638429c75746e;p=xonotic%2Fgmqcc.git Making logical 'and' and 'or' use NOT_ in -fcorrect-logic for both operands normally, but only for the first with -fperl-logic --- diff --git a/parser.c b/parser.c index 8d8e5a4..e8110bb 100644 --- a/parser.c +++ b/parser.c @@ -838,8 +838,10 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy) } #endif if (CanConstFold(exprs[0], exprs[1])) + { out = (ast_expression*)parser_const_float(parser, (generated_op == INSTR_OR ? (ConstF(0) || ConstF(1)) : (ConstF(0) && ConstF(1)))); + } else { if (OPTS_FLAG(PERL_LOGIC) && !ast_compare_type(exprs[0], exprs[1])) { @@ -848,6 +850,25 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy) parseerror(parser, "invalid types for logical operation with -fperl-logic: %s and %s", ty1, ty2); return false; } + if (OPTS_FLAG(CORRECT_LOGIC)) { + /* non-floats need to be NOTed */ + for (i = 0; i < 2; ++i) { + if (exprs[i]->expression.vtype != TYPE_FLOAT) { + if (type_not_instr[exprs[i]->expression.vtype] == AINSTR_END) { + ast_type_to_string(exprs[0], ty1, sizeof(ty1)); + ast_type_to_string(exprs[1], ty2, sizeof(ty2)); + parseerror(parser, "invalid types for logical operation with -fcorrect-logic: %s and %s", ty1, ty2); + return false; + } + out = (ast_expression*)ast_unary_new(ctx, type_not_instr[exprs[i]->expression.vtype], exprs[i]); + if (!out) + break; + exprs[i] = out; out = NULL; + } + if (OPTS_FLAG(PERL_LOGIC)) + break; + } + } out = (ast_expression*)ast_binary_new(ctx, generated_op, exprs[0], exprs[1]); } break;