* src/SDCCval.c (constVal): fixed bug 1305065
[fw/sdcc] / src / SDCCval.c
index f760c6a7e33f4076b1a18fcb02673440a7677238..6a0095016df7888cb417d2f73b62ae103b09f24d 100644 (file)
@@ -514,6 +514,7 @@ value *constVal (char *s)
     sval = strtoul (s, NULL, 0);
     dval=sval;
     if (errno) {
+      dval = 4294967295.0;
       werror (W_INVALID_INT_CONST, s, dval);
     }
   } else {
@@ -521,62 +522,62 @@ value *constVal (char *s)
   }
 
   /* Setup the flags first */
-  /* set the b_long flag if 'lL' is found */
-  if (strchr (s, 'l') || strchr (s, 'L')) {
-    SPEC_NOUN (val->type) = V_INT;
-    SPEC_LONG (val->type) = 1;
-  }
-
   /* set the unsigned flag if 'uU' is found */
   if (strchr (s, 'u') || strchr (s, 'U')) {
     SPEC_USIGN (val->type) = 1;
   }
 
-  if (dval<0) { // "-28u" will still be signed and negative
-    if (dval<-128) { // check if we have to promote to int
-      SPEC_NOUN (val->type) = V_INT;
-    }
-    if (dval<-32768) { // check if we have to promote to long int
-      SPEC_LONG (val->type) = 1;
-    }
-  } else { // >=0
-    if (dval>0xff ||   /* check if we have to promote to int */
-        SPEC_USIGN (val->type)) { /* if it's unsigned, we can't use unsigned
-                                    char. After an integral promotion it will
-                                    be a signed int; this certainly isn't what
-                                    the programer wants */
-      SPEC_NOUN (val->type) = V_INT;
-    }
-    else { /* store char's always as unsigned; this helps other optimizations */
-      SPEC_USIGN (val->type) = 1;
-    }
-    if (dval>0xffff && SPEC_USIGN (val->type)) { // check if we have to promote to long
-      SPEC_LONG (val->type) = 1;
-    }
-    else if (dval>0x7fff && !SPEC_USIGN (val->type)) { // check if we have to promote to long int
-      if ((hex || octal) && /* hex or octal constants may be stored in unsigned type */
-          dval<=0xffff) {
+  /* set the b_long flag if 'lL' is found */
+  if (strchr (s, 'l') || strchr (s, 'L')) {
+    SPEC_NOUN (val->type) = V_INT;
+    SPEC_LONG (val->type) = 1;
+  } else {
+    if (dval<0) { // "-28u" will still be signed and negative
+      if (dval<-128) { // check if we have to promote to int
+        SPEC_NOUN (val->type) = V_INT;
+      }
+      if (dval<-32768) { // check if we have to promote to long int
+        SPEC_LONG (val->type) = 1;
+      }
+    } else { // >=0
+      if (dval>0xff || /* check if we have to promote to int */
+          SPEC_USIGN (val->type)) { /* if it's unsigned, we can't use unsigned
+                                    char. After an integral promotion it will
+                                    be a signed int; this certainly isn't what
+                                    the programer wants */
+        SPEC_NOUN (val->type) = V_INT;
+      }
+      else { /* store char's always as unsigned; this helps other optimizations */
         SPEC_USIGN (val->type) = 1;
-      } else {
+      }
+      if (dval>0xffff && SPEC_USIGN (val->type)) { // check if we have to promote to long
         SPEC_LONG (val->type) = 1;
-        if (dval>0x7fffffff) {
+      }
+      else if (dval>0x7fff && !SPEC_USIGN (val->type)) { // check if we have to promote to long int
+        if ((hex || octal) && /* hex or octal constants may be stored in unsigned type */
+            dval<=0xffff) {
           SPEC_USIGN (val->type) = 1;
-       }
+        } else {
+          SPEC_LONG (val->type) = 1;
+          if (dval>0x7fffffff) {
+            SPEC_USIGN (val->type) = 1;
+         }
+        }
       }
     }
   }
 
   /* check for out of range */
   if (dval<-2147483648.0) {
-    dval = LONG_MIN;
+    dval = -2147483648.0;
     werror (W_INVALID_INT_CONST, s, dval);
   }
   if (dval>2147483647.0 && !SPEC_USIGN (val->type)) {
-    dval = LONG_MAX;
+    dval = 2147483647.0;
     werror (W_INVALID_INT_CONST, s, dval);
   }
   if (dval>4294967295.0) {
-    dval = ULONG_MAX;
+    dval = 4294967295.0;
     werror (W_INVALID_INT_CONST, s, dval);
   }