}
#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])) {
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;