From 427d5af5b601985093b6b4b33ba1e30fc24d86dc Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 26 Nov 2007 23:12:30 +0000 Subject: [PATCH] Added optional pass-by-reference argument "isExact" to NumericLiteralParser::GetFloatValue(). Upon method return, this flag has the value true if the returned APFloat can exactly represent the number in the parsed text, and false otherwise. Modified the implementation of GetFloatValue() to parse literals using APFloat's convertFromString method (which allows us to set the value of isExact). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44339 91177308-0d34-0410-b5e6-96231b3b80d8 --- Lex/LiteralSupport.cpp | 22 ++++++++++++++++------ include/clang/Lex/LiteralSupport.h | 7 +++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Lex/LiteralSupport.cpp b/Lex/LiteralSupport.cpp index 21ead21bfe..ebc66271db 100644 --- a/Lex/LiteralSupport.cpp +++ b/Lex/LiteralSupport.cpp @@ -410,17 +410,27 @@ bool NumericLiteralParser::GetIntegerValue(llvm::APInt &Val) { } llvm::APFloat NumericLiteralParser:: -GetFloatValue(const llvm::fltSemantics &Format) { +GetFloatValue(const llvm::fltSemantics &Format, bool* isExact) { + using llvm::APFloat; + char floatChars[256]; strncpy(floatChars, ThisTokBegin, ThisTokEnd-ThisTokBegin); floatChars[ThisTokEnd-ThisTokBegin] = '\0'; -#if 0 - // This doesn't work yet. - return llvm::APFloat(Format, floatChars); + +#if 1 + APFloat V (Format, APFloat::fcZero, false); + + APFloat::opStatus status; + status = V.convertFromString(floatChars,APFloat::rmTowardZero); + + if (isExact) + *isExact = status == APFloat::opOK; + + return V; #else // FIXME: this is horrible! - llvm::APFloat V(strtod(floatChars, 0)); - V.convert(Format, llvm::APFloat::rmTowardZero); + APFloat V(strtod(floatChars, 0)); + V.convert(Format, APFloat::rmTowardZero); return V; #endif } diff --git a/include/clang/Lex/LiteralSupport.h b/include/clang/Lex/LiteralSupport.h index e8650fc8fa..2555660076 100644 --- a/include/clang/Lex/LiteralSupport.h +++ b/include/clang/Lex/LiteralSupport.h @@ -77,8 +77,11 @@ public: /// GetFloatValue - Convert this numeric literal to a floating value, using /// the specified APFloat fltSemantics (specifying float, double, etc). - /// - llvm::APFloat GetFloatValue(const llvm::fltSemantics &Format); + /// The optional bool isExact (passed-by-reference) has its value + /// set to true if the returned APFloat can represent the number in the + /// literal exactly, and false otherwise. + llvm::APFloat GetFloatValue(const llvm::fltSemantics &Format, + bool* isExact = NULL); private: void Diag(SourceLocation Loc, unsigned DiagID, -- 2.50.1