diff options
author | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-01-28 18:23:23 +0000 |
---|---|---|
committer | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-01-28 18:23:23 +0000 |
commit | 599ddf9a7693a315a03fc77cf612eec53dee5f67 (patch) | |
tree | a2aa7277df63e6f280810fc0baa7be24e98f1525 /lib/Support/FileUtilities.cpp | |
parent | 349c72a35d0c586d081d01d97577fcf69bb75cca (diff) | |
download | external_llvm-599ddf9a7693a315a03fc77cf612eec53dee5f67.zip external_llvm-599ddf9a7693a315a03fc77cf612eec53dee5f67.tar.gz external_llvm-599ddf9a7693a315a03fc77cf612eec53dee5f67.tar.bz2 |
Fix fpcmp infinite loop when comparing "29-266" with "29-268".
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46455 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/FileUtilities.cpp')
-rw-r--r-- | lib/Support/FileUtilities.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/Support/FileUtilities.cpp b/lib/Support/FileUtilities.cpp index eff6fc9..30463e8 100644 --- a/lib/Support/FileUtilities.cpp +++ b/lib/Support/FileUtilities.cpp @@ -20,11 +20,15 @@ #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; } |