From 70ce27baada6cf22edc3f1971b57d088e5824557 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Thu, 28 Dec 1995 07:17:30 -0500 Subject: [PATCH] (parse_number): Improve error message for bogus numbers. (yylex): Consider `0xe-1' to be a (bogus) number if not traditional. From-SVN: r10891 --- gcc/cexp.y | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/gcc/cexp.y b/gcc/cexp.y index d83de803364..bdc61c8d1d9 100644 --- a/gcc/cexp.y +++ b/gcc/cexp.y @@ -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); } -- 2.30.2