pedantic>1: "char c=200" is not allowed (evaluates to -56)
*/
-void checkConstantRange(sym_link *ltype, double v, char *msg, int pedantic) {
+void checkConstantRange(sym_link *ltype, value *val, char *msg, int pedantic) {
LONG_LONG max = (LONG_LONG) 1 << bitsForType(ltype);
char message[132]="";
int warnings=0;
int negative=0;
+ long v=SPEC_CVAL(val->type).v_long;
#if 0
// this could be a good idea
return;
}
- if (v<0) {
+ if (!SPEC_USIGN(val->type) && v<0) {
negative=1;
- // if not pedantic: -1 equals to 0xf..f
- if (SPEC_USIGN(ltype) && (!pedantic ? v!=-1 : 1)) {
+ if (SPEC_USIGN(ltype) && (pedantic>1)) {
warnings++;
}
v=-v;
} else {
// shouldn't do that with float, array or structure unless to void
if (!IS_VOID(getSpec(type)) &&
- !(IS_CODEPTR(type) && IS_FUNC(optype))) {
+ !(IS_CODEPTR(type) && IS_FUNC(type->next) && IS_FUNC(optype))) {
werror(E_INCOMPAT_TYPES);
errors++;
}
}
} else { // from a pointer to a pointer
if (!TARGET_IS_Z80 && !TARGET_IS_GBZ80) {
- if (implicit) { // if not to generic, they have to match
- if ((!IS_GENPTR(type) && (DCL_TYPE(optype) != DCL_TYPE(type)))) {
- werror(E_INCOMPAT_PTYPES);
- errors++;
+ // if not a pointer to a function
+ if (!(IS_CODEPTR(type) && IS_FUNC(type->next) && IS_FUNC(optype))) {
+ if (implicit) { // if not to generic, they have to match
+ if ((!IS_GENPTR(type) && (DCL_TYPE(optype) != DCL_TYPE(type)))) {
+ werror(E_INCOMPAT_PTYPES);
+ errors++;
+ }
}
}
}
if (IS_INTEGRAL (ltype) && IS_VALOP (right) && IS_LITERAL (rtype))
{
checkConstantRange(ltype,
- operandLitValue(right), "compare operation", 1);
+ OP_VALUE(right), "compare operation", 1);
}
ctype = usualBinaryConversions (&left, &right);
if (IS_INTEGRAL (ltype) && right->type == VALUE && IS_LITERAL (rtype))
{
checkConstantRange(ltype,
- operandLitValue(right), "= operation", 0);
+ OP_VALUE(right), "= operation", 0);
}
/* if the left & right type don't exactly match */