]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Correct lexing of exponents.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 21 Dec 2010 18:51:45 +0000 (18:51 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 21 Dec 2010 18:51:45 +0000 (18:51 +0000)
From-SVN: r168129

gcc/go/gofrontend/lex.cc
gcc/go/gofrontend/lex.h

index ad1a1fe4fc748da016ff36412810ef62beeddfcc..67d4b1b4670d1fc9f948437f91786ac04e4b7b70 100644 (file)
@@ -931,6 +931,25 @@ Lex::is_hex_digit(char c)
          || (c >= 'a' && c <= 'f'));
 }
 
+// Return whether an exponent could start at P.
+
+bool
+Lex::could_be_exponent(const char* p, const char* pend)
+{
+  if (*p != 'e' && *p != 'E')
+    return false;
+  ++p;
+  if (p >= pend)
+    return false;
+  if (*p == '+' || *p == '-')
+    {
+      ++p;
+      if (p >= pend)
+       return false;
+    }
+  return *p >= '0' && *p <= '9';
+}
+
 // Pick up a number.
 
 Token
@@ -980,7 +999,7 @@ Lex::gather_number()
            }
        }
 
-      if (*p != '.' && *p != 'e' && *p != 'E' && *p != 'i')
+      if (*p != '.' && *p != 'i' && !Lex::could_be_exponent(p, pend))
        {
          std::string s(pnum, p - pnum);
          mpz_t val;
@@ -1004,7 +1023,7 @@ Lex::gather_number()
       ++p;
     }
 
-  if (*p != '.' && *p != 'E' && *p != 'e' && *p != 'i')
+  if (*p != '.' && *p != 'i' && !Lex::could_be_exponent(p, pend))
     {
       std::string s(pnum, p - pnum);
       mpz_t val;
@@ -1039,7 +1058,7 @@ Lex::gather_number()
          ++p;
        }
 
-      if (dot && (*p == 'E' || *p == 'e'))
+      if (dot && Lex::could_be_exponent(p, pend))
        {
          ++p;
          if (*p == '+' || *p == '-')
index c8def2bf7d5f70b37838802333b0075bfc241e17..4202ed3748cd733fbd37615f46d7ae5abd04d54f 100644 (file)
@@ -379,6 +379,9 @@ class Lex
   Token
   gather_identifier();
 
+  static bool
+  could_be_exponent(const char*, const char*);
+
   Token
   gather_number();