1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-24 11:31:31 +00:00

Fixed logical-NOT in constant context.

This commit is contained in:
acqn 2020-08-20 07:52:17 +08:00 committed by Oliver Schmidt
parent 44b719d957
commit bc5570b708

View File

@ -1908,14 +1908,19 @@ void hie10 (ExprDesc* Expr)
case TOK_BOOL_NOT: case TOK_BOOL_NOT:
NextToken (); NextToken ();
if (evalexpr (CF_NONE, hie10, Expr) == 0) { BoolExpr (hie10, Expr);
if (ED_IsConstAbs (Expr)) {
/* Constant expression */ /* Constant expression */
Expr->IVal = !Expr->IVal; Expr->IVal = !Expr->IVal;
} else { } else {
/* Not constant, load into the primary */
LoadExpr (CF_NONE, Expr);
g_bneg (TypeOf (Expr->Type)); g_bneg (TypeOf (Expr->Type));
ED_FinalizeRValLoad (Expr); ED_FinalizeRValLoad (Expr);
ED_TestDone (Expr); /* bneg will set cc */ ED_TestDone (Expr); /* bneg will set cc */
} }
/* The result type is always boolean */
Expr->Type = type_bool;
break; break;
case TOK_STAR: case TOK_STAR:
@ -3981,29 +3986,6 @@ void hie0 (ExprDesc *Expr)
int evalexpr (unsigned Flags, void (*Func) (ExprDesc*), ExprDesc* Expr)
/* Will evaluate an expression via the given function. If the result is a
** constant, 0 is returned and the value is put in the Expr struct. If the
** result is not constant, LoadExpr is called to bring the value into the
** primary register and 1 is returned.
*/
{
/* Evaluate */
ExprWithCheck (Func, Expr);
/* Check for a constant expression */
if (ED_IsConstAbs (Expr)) {
/* Constant expression */
return 0;
} else {
/* Not constant, load into the primary */
LoadExpr (Flags, Expr);
return 1;
}
}
void Expression0 (ExprDesc* Expr) void Expression0 (ExprDesc* Expr)
/* Evaluate an expression via hie0 and put the result into the primary register */ /* Evaluate an expression via hie0 and put the result into the primary register */
{ {