}
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
}
/// 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,