mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 21:53:12 +08:00
1.0 is double, 1.0F is a float.
llvm-svn: 41412
This commit is contained in:
@@ -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]) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user