From: Chris Lattner Date: Sun, 26 Aug 2007 03:29:23 +0000 (+0000) Subject: 1.0 is double, 1.0F is a float. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e400c286b485e28d04a742ea87860ddfefa672e;p=clang 1.0 is double, 1.0F is a float. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41412 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Lex/LiteralSupport.cpp b/Lex/LiteralSupport.cpp index 82765522d7..04282563ea 100644 --- a/Lex/LiteralSupport.cpp +++ b/Lex/LiteralSupport.cpp @@ -202,10 +202,10 @@ NumericLiteralParser(const char *begin, const char *end, s = DigitsBegin = begin; saw_exponent = false; saw_period = false; - saw_float_suffix = false; isLong = false; isUnsigned = false; isLongLong = false; + isFloat = false; isImaginary = false; hadError = false; @@ -326,8 +326,8 @@ NumericLiteralParser(const char *begin, const char *end, case 'f': // FP Suffix for "float" case 'F': if (!isFPConstant) break; // Error for integer constant. - if (saw_float_suffix || isLong) break; // FF, LF invalid. - saw_float_suffix = true; + if (isFloat || isLong) break; // FF, LF invalid. + isFloat = true; continue; // Success. case 'u': case 'U': @@ -338,7 +338,7 @@ NumericLiteralParser(const char *begin, const char *end, case 'l': case 'L': if (isLong || isLongLong) break; // Cannot be repeated. - if (saw_float_suffix) break; // LF invalid. + if (isFloat) break; // LF invalid. // Check for long long. The L's need to be adjacent and the same case. if (s+1 != ThisTokEnd && s[1] == s[0]) { diff --git a/Lex/PPExpressions.cpp b/Lex/PPExpressions.cpp index f43243ea16..590c0eeeef 100644 --- a/Lex/PPExpressions.cpp +++ b/Lex/PPExpressions.cpp @@ -161,7 +161,7 @@ static bool EvaluateValue(llvm::APSInt &Result, Token &PeekTok, if (Literal.hadError) return true; // a diagnostic was already reported. - if (Literal.isFloatingLiteral()) { + if (Literal.isFloatingLiteral() || Literal.isImaginary) { PP.Diag(PeekTok, diag::err_pp_illegal_floating_literal); return true; } diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index 9539a916f1..1c539558f8 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -221,8 +221,8 @@ Action::ExprResult Sema::ParseNumericConstant(const Token &Tok) { return new IntegerLiteral(ResultVal, t, Tok.getLocation()); } else if (Literal.isFloatingLiteral()) { // FIXME: handle float values > 32 (including compute the real type...). - return new FloatingLiteral(Literal.GetFloatValue(), Context.FloatTy, - Tok.getLocation()); + QualType Ty = Literal.isFloat ? Context.FloatTy : Context.DoubleTy; + return new FloatingLiteral(Literal.GetFloatValue(), Ty, Tok.getLocation()); } return ExprResult(true); } diff --git a/include/clang/Lex/LiteralSupport.h b/include/clang/Lex/LiteralSupport.h index c667405235..9c4c4cd924 100644 --- a/include/clang/Lex/LiteralSupport.h +++ b/include/clang/Lex/LiteralSupport.h @@ -44,7 +44,6 @@ class NumericLiteralParser { unsigned radix; bool saw_exponent, saw_period; - bool saw_float_suffix; // 1.0f public: NumericLiteralParser(const char *begin, const char *end, @@ -53,6 +52,7 @@ public: bool isUnsigned; bool isLong; // This is *not* set for long long. bool isLongLong; + bool isFloat; // 1.0f bool isImaginary; // 1.0i bool isIntegerLiteral() const {