Fix fpcmp infinite loop when comparing "29-266" with "29-268".
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Mon, 28 Jan 2008 18:23:23 +0000 (18:23 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Mon, 28 Jan 2008 18:23:23 +0000 (18:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46455 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/FileUtilities.cpp

index eff6fc911b2c2c6cca23a5416ad3e3e2e576a8c0..30463e867929176668bb3f72f572fd520072d1bc 100644 (file)
 #include <cctype>
 using namespace llvm;
 
-static bool isNumberChar(char C) {
+static bool isSignedChar(char C) {
+  if (C == '+' || C == '-')
+    return true;
+  else
+    return false;
+}
+
+static bool isExpoentChar(char C) {
   switch (C) {
-  case '0': case '1': case '2': case '3': case '4':
-  case '5': case '6': case '7': case '8': case '9':
-  case '.': case '+': case '-':
   case 'D':  // Strange exponential notation.
   case 'd':  // Strange exponential notation.
   case 'e':
@@ -33,13 +37,25 @@ static bool isNumberChar(char C) {
   }
 }
 
+static bool isNumberChar(char C) {
+  switch (C) {
+  case '0': case '1': case '2': case '3': case '4':
+  case '5': case '6': case '7': case '8': case '9':
+  case '.': return true;
+  default: return isSignedChar(C) || isExpoentChar(C);
+  }
+}
+
 static char *BackupNumber(char *Pos, char *FirstChar) {
   // If we didn't stop in the middle of a number, don't backup.
   if (!isNumberChar(*Pos)) return Pos;
 
   // Otherwise, return to the start of the number.
-  while (Pos > FirstChar && isNumberChar(Pos[-1]))
+  while (Pos > FirstChar && isNumberChar(Pos[-1])) {
     --Pos;
+    if (Pos > FirstChar && isSignedChar(Pos[0]) && !isExpoentChar(Pos[-1]))
+      break;
+  }
   return Pos;
 }