Allow unary +/- for floating point constants
This commit is contained in:
@@ -1901,14 +1901,22 @@ static void UnaryOp (ExprDesc* Expr)
|
|||||||
/* Get the expression */
|
/* Get the expression */
|
||||||
hie10 (Expr);
|
hie10 (Expr);
|
||||||
|
|
||||||
/* We can only handle integer types */
|
/* Check for a constant numeric expression */
|
||||||
|
if (ED_IsConstAbs (Expr)) {
|
||||||
|
|
||||||
|
if (IsClassFloat (Expr->Type)) {
|
||||||
|
switch (Tok) {
|
||||||
|
case TOK_MINUS: Expr->V.FVal = FP_D_Sub(FP_D_Make(0.0),Expr->V.FVal); break;
|
||||||
|
case TOK_PLUS: break;
|
||||||
|
case TOK_COMP: Error ("Unary ~ operator not valid for floating point constant"); break;
|
||||||
|
default: Internal ("Unexpected token: %d", Tok);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (!IsClassInt (Expr->Type)) {
|
if (!IsClassInt (Expr->Type)) {
|
||||||
Error ("Argument must have integer type");
|
Error ("Constant argument must have integer or float type");
|
||||||
ED_MakeConstAbsInt (Expr, 1);
|
ED_MakeConstAbsInt (Expr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for a constant numeric expression */
|
|
||||||
if (ED_IsConstAbs (Expr)) {
|
|
||||||
/* Value is numeric */
|
/* Value is numeric */
|
||||||
switch (Tok) {
|
switch (Tok) {
|
||||||
case TOK_MINUS: Expr->IVal = -Expr->IVal; break;
|
case TOK_MINUS: Expr->IVal = -Expr->IVal; break;
|
||||||
@@ -1922,10 +1930,17 @@ static void UnaryOp (ExprDesc* Expr)
|
|||||||
|
|
||||||
/* Limit the calculated value to the range of its type */
|
/* Limit the calculated value to the range of its type */
|
||||||
LimitExprValue (Expr, 1);
|
LimitExprValue (Expr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
unsigned Flags;
|
unsigned Flags;
|
||||||
|
|
||||||
|
/* If not constant, we can only handle integer types */
|
||||||
|
if (!IsClassInt (Expr->Type)) {
|
||||||
|
Error ("Non-constant argument must have integer type");
|
||||||
|
ED_MakeConstAbsInt (Expr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Value is not constant */
|
/* Value is not constant */
|
||||||
LoadExpr (CF_NONE, Expr);
|
LoadExpr (CF_NONE, Expr);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user