(parse_number): Improve error message for bogus numbers.
authorRichard Kenner <kenner@gcc.gnu.org>
Thu, 28 Dec 1995 12:17:30 +0000 (07:17 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Thu, 28 Dec 1995 12:17:30 +0000 (07:17 -0500)
(yylex): Consider `0xe-1' to be a (bogus) number if not traditional.

From-SVN: r10891

gcc/cexp.y

index d83de8033643c44b54e8728f80e7121fadb766ed..bdc61c8d1d949a5af94a5f5dbb893e0fb419340d 100644 (file)
@@ -396,13 +396,6 @@ parse_number (olen)
   register int digit, largest_digit = 0;
   int spec_long = 0;
 
-  for (c = 0; c < len; c++)
-    if (p[c] == '.') {
-      /* It's a float since it contains a point.  */
-      yyerror ("floating point numbers not allowed in #if expressions");
-      return ERROR;
-    }
-
   yylval.integer.unsignedp = 0;
 
   if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
@@ -439,8 +432,16 @@ parse_number (olen)
              yyerror ("two `u's in integer constant");
            yylval.integer.unsignedp = 1;
          }
-       else
-         break;
+       else {
+         if (c == '.' || c == 'e' || c == 'E')
+           yyerror ("Floating point numbers not allowed in #if expressions");
+         else {
+           char *buf = (char *) alloca (p - lexptr + 40);
+           sprintf (buf, "missing white space after number `%.*s'",
+                    (int) (p - lexptr - 1), lexptr);
+           yyerror (buf);
+         }
+       }
 
        if (--len == 0)
          break;
@@ -456,11 +457,6 @@ parse_number (olen)
     n = nd;
   }
 
-  if (len != 0) {
-    yyerror ("Invalid number in #if expression");
-    return ERROR;
-  }
-
   if (base <= largest_digit)
     warning ("integer constant contains digits beyond the radix");
 
@@ -733,10 +729,14 @@ yylex ()
 
   if (c >= '0' && c <= '9' && !keyword_parsing) {
     /* It's a number */
-    for (namelen = 0;
-        c = tokstart[namelen], is_idchar[c] || c == '.'; 
-        namelen++)
-      ;
+    for (namelen = 1; ; namelen++) {
+      int d = tokstart[namelen];
+      if (! ((is_idchar[d] || d == '.')
+            || ((d == '-' || d == '+') && (c == 'e' || c == 'E')
+                && ! traditional)))
+       break;
+      c = d;
+    }
     return parse_number (namelen);
   }