- SPEC_SCLS (val->type) = S_LITERAL; /* will remain literal */
- SPEC_USIGN (val->type) =
- SPEC_USIGN (lval->etype) &&
- SPEC_USIGN (rval->etype) &&
- (floatFromVal(lval)+floatFromVal(rval))>=0;
-
- SPEC_LONG (val->type) = 1;
-
+ SPEC_SCLS (val->type) = S_LITERAL; /* will remain literal */
+ SPEC_LONG (val->type) = (SPEC_LONG (lval->etype) | SPEC_LONG (rval->etype));
+ /* both signed char and unsigned char are promoted to signed int */
+ if (IS_CHAR (lval->etype))
+ {
+ SPEC_USIGN (lval->etype) = 0;
+ SPEC_NOUN (lval->etype) = V_INT;
+ }
+ if (IS_CHAR (rval->etype))
+ {
+ SPEC_USIGN (rval->etype) = 0;
+ SPEC_NOUN (rval->etype) = V_INT;
+ }
+ SPEC_USIGN (val->type) = (SPEC_USIGN (lval->etype) | SPEC_USIGN (rval->etype));