Sorry, I reverted this since it broke the arm bots. You can reproduce the crash with
./bin/clang -cc1 -fsyntax-only -verify -fms-extensions ~/llvm/clang/test/Lexer/ms-extensions.c -triple arm-linux On 20 June 2014 20:52, David Majnemer <[email protected]> wrote: > Author: majnemer > Date: Fri Jun 20 19:51:59 2014 > New Revision: 211426 > > URL: http://llvm.org/viewvc/llvm-project?rev=211426&view=rev > Log: > Lex: Use the correct types for MS integer suffixes > > We didn't properly implement support for the sized integer suffixes. > Suffixes like i16 were essentially ignored instead of mapping them to > the appropriately sized integer type. > > This fixes PR20008. > > Differential Revision: http://reviews.llvm.org/D4132 > > Added: > cfe/trunk/test/SemaCXX/ms_integer_suffix.cpp > Modified: > cfe/trunk/include/clang/Lex/LiteralSupport.h > cfe/trunk/lib/AST/StmtPrinter.cpp > cfe/trunk/lib/Lex/LiteralSupport.cpp > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/unittests/AST/StmtPrinterTest.cpp > > Modified: cfe/trunk/include/clang/Lex/LiteralSupport.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/LiteralSupport.h?rev=211426&r1=211425&r2=211426&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/LiteralSupport.h (original) > +++ cfe/trunk/include/clang/Lex/LiteralSupport.h Fri Jun 20 19:51:59 2014 > @@ -63,7 +63,7 @@ public: > bool isLongLong; > bool isFloat; // 1.0f > bool isImaginary; // 1.0i > - bool isMicrosoftInteger; // Microsoft suffix extension i8, i16, i32, or > i64. > + uint8_t MicrosoftInteger; // Microsoft suffix extension i8, i16, i32, or > i64. > > bool isIntegerLiteral() const { > return !saw_period && !saw_exponent; > > Modified: cfe/trunk/lib/AST/StmtPrinter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=211426&r1=211425&r2=211426&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/StmtPrinter.cpp (original) > +++ cfe/trunk/lib/AST/StmtPrinter.cpp Fri Jun 20 19:51:59 2014 > @@ -947,8 +947,10 @@ void StmtPrinter::VisitIntegerLiteral(In > // 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::Short: > - case BuiltinType::UShort: > + 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::Int: break; // no suffix. > case BuiltinType::UInt: OS << 'U'; break; > case BuiltinType::Long: OS << 'L'; break; > > Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=211426&r1=211425&r2=211426&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original) > +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Fri Jun 20 19:51:59 2014 > @@ -522,7 +522,7 @@ NumericLiteralParser::NumericLiteralPars > isLongLong = false; > isFloat = false; > isImaginary = false; > - isMicrosoftInteger = false; > + MicrosoftInteger = 0; > hadError = false; > > if (*s == '0') { // parse radix > @@ -606,7 +606,8 @@ NumericLiteralParser::NumericLiteralPars > case 'i': > case 'I': > if (PP.getLangOpts().MicrosoftExt) { > - if (isLong || isLongLong) break; > + if (isLong || isLongLong || MicrosoftInteger) > + break; > > // Allow i8, i16, i32, i64, and i128. > if (s + 1 != ThisTokEnd) { > @@ -614,20 +615,20 @@ NumericLiteralParser::NumericLiteralPars > case '8': > if (isFPConstant) break; > s += 2; // i8 suffix > - isMicrosoftInteger = true; > + MicrosoftInteger = 8; > break; > case '1': > if (isFPConstant) break; > if (s + 2 == ThisTokEnd) break; > if (s[2] == '6') { > s += 3; // i16 suffix > - isMicrosoftInteger = true; > + MicrosoftInteger = 16; > } > else if (s[2] == '2') { > if (s + 3 == ThisTokEnd) break; > if (s[3] == '8') { > s += 4; // i128 suffix > - isMicrosoftInteger = true; > + MicrosoftInteger = 128; > } > } > break; > @@ -636,8 +637,7 @@ NumericLiteralParser::NumericLiteralPars > if (s + 2 == ThisTokEnd) break; > if (s[2] == '2') { > s += 3; // i32 suffix > - isLong = true; > - isMicrosoftInteger = true; > + MicrosoftInteger = 32; > } > break; > case '6': > @@ -645,14 +645,13 @@ NumericLiteralParser::NumericLiteralPars > if (s + 2 == ThisTokEnd) break; > if (s[2] == '4') { > s += 3; // i64 suffix > - isLongLong = true; > - isMicrosoftInteger = true; > + MicrosoftInteger = 64; > } > break; > default: > break; > } > - if (isMicrosoftInteger) > + if (MicrosoftInteger) > break; > } > } > @@ -682,7 +681,7 @@ NumericLiteralParser::NumericLiteralPars > isLongLong = false; > isFloat = false; > isImaginary = false; > - isMicrosoftInteger = false; > + MicrosoftInteger = 0; > > saw_ud_suffix = true; > return; > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=211426&r1=211425&r2=211426&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jun 20 19:51:59 2014 > @@ -3190,7 +3190,7 @@ ExprResult Sema::ActOnNumericConstant(co > // may be wider than [u]intmax_t. > // FIXME: Actually, they don't. We seem to have accidentally invented the > // i128 suffix. > - if (Literal.isMicrosoftInteger && MaxWidth < 128 && > + if (Literal.MicrosoftInteger && MaxWidth < 128 && > Context.getTargetInfo().hasInt128Type()) > MaxWidth = 128; > llvm::APInt ResultVal(MaxWidth, 0); > @@ -3211,7 +3211,18 @@ ExprResult Sema::ActOnNumericConstant(co > > // Check from smallest to largest, picking the smallest type we can. > unsigned Width = 0; > - if (!Literal.isLong && !Literal.isLongLong) { > + > + // 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) { > // Are int/unsigned possibilities? > unsigned IntSize = Context.getTargetInfo().getIntWidth(); > > @@ -3258,17 +3269,6 @@ ExprResult Sema::ActOnNumericConstant(co > 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. > > Added: cfe/trunk/test/SemaCXX/ms_integer_suffix.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ms_integer_suffix.cpp?rev=211426&view=auto > ============================================================================== > --- cfe/trunk/test/SemaCXX/ms_integer_suffix.cpp (added) > +++ cfe/trunk/test/SemaCXX/ms_integer_suffix.cpp Fri Jun 20 19:51:59 2014 > @@ -0,0 +1,8 @@ > +// 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__), ""); > > Modified: cfe/trunk/unittests/AST/StmtPrinterTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/StmtPrinterTest.cpp?rev=211426&r1=211425&r2=211426&view=diff > ============================================================================== > --- cfe/trunk/unittests/AST/StmtPrinterTest.cpp (original) > +++ cfe/trunk/unittests/AST/StmtPrinterTest.cpp Fri Jun 20 19:51:59 2014 > @@ -134,6 +134,8 @@ PrintedStmtCXX11Matches(StringRef Code, > 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"); > @@ -169,9 +171,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 > } > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
