From f533fd477a50467a0d96293d116f4059aa806b65 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sat, 21 Jun 2014 12:39:25 +0000 Subject: 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 --- include/clang/Lex/LiteralSupport.h | 2 +- lib/AST/StmtPrinter.cpp | 6 ++---- lib/Lex/LiteralSupport.cpp | 21 +++++++++++---------- lib/Sema/SemaExpr.cpp | 26 +++++++++++++------------- test/SemaCXX/ms_integer_suffix.cpp | 8 -------- unittests/AST/StmtPrinterTest.cpp | 6 ++---- 6 files changed, 29 insertions(+), 40 deletions(-) delete mode 100644 test/SemaCXX/ms_integer_suffix.cpp 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 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 } -- cgit v1.2.3