summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-06-21 12:39:25 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-06-21 12:39:25 +0000
commitf533fd477a50467a0d96293d116f4059aa806b65 (patch)
treef8671d6df2189af0e1830c382f5cb7f0d7504ef4
parentd31bc8bc756b3734c79e3748627938ce25b8f30c (diff)
downloadclang-f533fd477a50467a0d96293d116f4059aa806b65.tar.gz
clang-f533fd477a50467a0d96293d116f4059aa806b65.tar.bz2
clang-f533fd477a50467a0d96293d116f4059aa806b65.tar.xz
Revert "Lex: Use the correct types for MS integer suffixes"
This reverts commit r211426. This broke the arm bots. The crash can be reproduced on X86 by running. ./bin/clang -cc1 -fsyntax-only -verify -fms-extensions ~/llvm/clang/test/Lexer/ms-extensions.c -triple arm-linux git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211434 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Lex/LiteralSupport.h2
-rw-r--r--lib/AST/StmtPrinter.cpp6
-rw-r--r--lib/Lex/LiteralSupport.cpp21
-rw-r--r--lib/Sema/SemaExpr.cpp26
-rw-r--r--test/SemaCXX/ms_integer_suffix.cpp8
-rw-r--r--unittests/AST/StmtPrinterTest.cpp6
6 files changed, 29 insertions, 40 deletions
diff --git a/include/clang/Lex/LiteralSupport.h b/include/clang/Lex/LiteralSupport.h
index acfd174b63..2eb7751f3c 100644
--- a/include/clang/Lex/LiteralSupport.h
+++ b/include/clang/Lex/LiteralSupport.h
@@ -63,7 +63,7 @@ public:
bool isLongLong;
bool isFloat; // 1.0f
bool isImaginary; // 1.0i
- uint8_t MicrosoftInteger; // Microsoft suffix extension i8, i16, i32, or i64.
+ bool isMicrosoftInteger; // Microsoft suffix extension i8, i16, i32, or i64.
bool isIntegerLiteral() const {
return !saw_period && !saw_exponent;
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index 5c92521c7a..0f4fd55246 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -947,10 +947,8 @@ void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
// FIXME: The Short and UShort cases are to handle cases where a short
// integeral literal is formed during template instantiation. They should
// be removed when template instantiation no longer needs integer literals.
- case BuiltinType::SChar: OS << "i8"; break;
- case BuiltinType::UChar: OS << "Ui8"; break;
- case BuiltinType::Short: OS << "i16"; break;
- case BuiltinType::UShort: OS << "Ui16"; break;
+ case BuiltinType::Short:
+ case BuiltinType::UShort:
case BuiltinType::Int: break; // no suffix.
case BuiltinType::UInt: OS << 'U'; break;
case BuiltinType::Long: OS << 'L'; break;
diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp
index c55054be30..0103450cca 100644
--- a/lib/Lex/LiteralSupport.cpp
+++ b/lib/Lex/LiteralSupport.cpp
@@ -522,7 +522,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
isLongLong = false;
isFloat = false;
isImaginary = false;
- MicrosoftInteger = 0;
+ isMicrosoftInteger = false;
hadError = false;
if (*s == '0') { // parse radix
@@ -606,8 +606,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
case 'i':
case 'I':
if (PP.getLangOpts().MicrosoftExt) {
- if (isLong || isLongLong || MicrosoftInteger)
- break;
+ if (isLong || isLongLong) break;
// Allow i8, i16, i32, i64, and i128.
if (s + 1 != ThisTokEnd) {
@@ -615,20 +614,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
case '8':
if (isFPConstant) break;
s += 2; // i8 suffix
- MicrosoftInteger = 8;
+ isMicrosoftInteger = true;
break;
case '1':
if (isFPConstant) break;
if (s + 2 == ThisTokEnd) break;
if (s[2] == '6') {
s += 3; // i16 suffix
- MicrosoftInteger = 16;
+ isMicrosoftInteger = true;
}
else if (s[2] == '2') {
if (s + 3 == ThisTokEnd) break;
if (s[3] == '8') {
s += 4; // i128 suffix
- MicrosoftInteger = 128;
+ isMicrosoftInteger = true;
}
}
break;
@@ -637,7 +636,8 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
if (s + 2 == ThisTokEnd) break;
if (s[2] == '2') {
s += 3; // i32 suffix
- MicrosoftInteger = 32;
+ isLong = true;
+ isMicrosoftInteger = true;
}
break;
case '6':
@@ -645,13 +645,14 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
if (s + 2 == ThisTokEnd) break;
if (s[2] == '4') {
s += 3; // i64 suffix
- MicrosoftInteger = 64;
+ isLongLong = true;
+ isMicrosoftInteger = true;
}
break;
default:
break;
}
- if (MicrosoftInteger)
+ if (isMicrosoftInteger)
break;
}
}
@@ -681,7 +682,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
isLongLong = false;
isFloat = false;
isImaginary = false;
- MicrosoftInteger = 0;
+ isMicrosoftInteger = false;
saw_ud_suffix = true;
return;
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 69cc8dc2fd..2654c390cc 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -3190,7 +3190,7 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {
// may be wider than [u]intmax_t.
// FIXME: Actually, they don't. We seem to have accidentally invented the
// i128 suffix.
- if (Literal.MicrosoftInteger && MaxWidth < 128 &&
+ if (Literal.isMicrosoftInteger && MaxWidth < 128 &&
Context.getTargetInfo().hasInt128Type())
MaxWidth = 128;
llvm::APInt ResultVal(MaxWidth, 0);
@@ -3211,18 +3211,7 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {
// Check from smallest to largest, picking the smallest type we can.
unsigned Width = 0;
-
- // Microsoft specific integer suffixes are explicitly sized.
- if (Literal.MicrosoftInteger) {
- Width = Literal.MicrosoftInteger;
- if (Width < 128)
- Ty = Context.getIntTypeForBitwidth(Width,
- /*Signed=*/!Literal.isUnsigned);
- else
- Ty = Literal.isUnsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
- }
-
- if (Ty.isNull() && !Literal.isLong && !Literal.isLongLong) {
+ if (!Literal.isLong && !Literal.isLongLong) {
// Are int/unsigned possibilities?
unsigned IntSize = Context.getTargetInfo().getIntWidth();
@@ -3269,6 +3258,17 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {
Width = LongLongSize;
}
}
+
+ // If it doesn't fit in unsigned long long, and we're using Microsoft
+ // extensions, then its a 128-bit integer literal.
+ if (Ty.isNull() && Literal.isMicrosoftInteger &&
+ Context.getTargetInfo().hasInt128Type()) {
+ if (Literal.isUnsigned)
+ Ty = Context.UnsignedInt128Ty;
+ else
+ Ty = Context.Int128Ty;
+ Width = 128;
+ }
// If we still couldn't decide a type, we probably have something that
// does not fit in a signed long long, but has no U suffix.
diff --git a/test/SemaCXX/ms_integer_suffix.cpp b/test/SemaCXX/ms_integer_suffix.cpp
deleted file mode 100644
index 20cd5a6f2c..0000000000
--- a/test/SemaCXX/ms_integer_suffix.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fms-compatibility -verify %s
-// expected-no-diagnostics
-
-static_assert(sizeof(0i8 ) == sizeof(__INT8_TYPE__ ), "");
-static_assert(sizeof(0i16 ) == sizeof(__INT16_TYPE__), "");
-static_assert(sizeof(0i32 ) == sizeof(__INT32_TYPE__), "");
-static_assert(sizeof(0i64 ) == sizeof(__INT64_TYPE__), "");
-static_assert(sizeof(0i128) > sizeof(__INT64_TYPE__), "");
diff --git a/unittests/AST/StmtPrinterTest.cpp b/unittests/AST/StmtPrinterTest.cpp
index 541fb3df1d..c75cbdefbf 100644
--- a/unittests/AST/StmtPrinterTest.cpp
+++ b/unittests/AST/StmtPrinterTest.cpp
@@ -134,8 +134,6 @@ PrintedStmtCXX11Matches(StringRef Code, const StatementMatcher &NodeMatch,
StringRef ContainingFunction,
StringRef ExpectedPrinted) {
std::vector<std::string> Args;
- Args.push_back("-target");
- Args.push_back("i686-pc-win32");
Args.push_back("-std=c++98");
Args.push_back("-fms-extensions");
Args.push_back("-Wno-unused-value");
@@ -171,9 +169,9 @@ TEST(StmtPrinter, TestMSIntegerLiteral) {
" 1i64, -1i64, 1ui64;"
"}",
"A",
- "1i8 , -1i8 , 1Ui8 , "
- "1i16 , -1i16 , 1Ui16 , "
"1 , -1 , 1U , "
+ "1 , -1 , 1U , "
+ "1L , -1L , 1UL , "
"1LL , -1LL , 1ULL"));
// Should be: with semicolon
}