From 599ddf9a7693a315a03fc77cf612eec53dee5f67 Mon Sep 17 00:00:00 2001 From: Lauro Ramos Venancio Date: Mon, 28 Jan 2008 18:23:23 +0000 Subject: [PATCH] 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 --- lib/Support/FileUtilities.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/Support/FileUtilities.cpp b/lib/Support/FileUtilities.cpp index eff6fc911b2..30463e86792 100644 --- a/lib/Support/FileUtilities.cpp +++ b/lib/Support/FileUtilities.cpp @@ -20,11 +20,15 @@ #include 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; }