fixed bug #467655
[fw/sdcc] / src / SDCCicode.c
index 30bd5985e4fe14c329f779484eac17295f81ab0f..5755fc38557d06ba07b0db25117ee26e7cd08394 100644 (file)
@@ -131,11 +131,12 @@ iCodeTable codeTable[] =
      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
@@ -148,10 +149,9 @@ void checkConstantRange(sym_link *ltype, double v, char *msg, int pedantic) {
     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;
@@ -1619,17 +1619,20 @@ geniCodeCast (sym_link * type, operand * op, bool implicit)
       }        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++;
+           }
          }
        }
       }
@@ -2507,7 +2510,7 @@ geniCodeLogic (operand * left, operand * right, int op)
   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);
@@ -2600,7 +2603,7 @@ geniCodeAssign (operand * left, operand * right, int nosupdate)
   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 */