Thanks for the revert, it was an older version of the code I intended for submission which didn't properly work on 32-bit targets.
It should be rectified with r211441. On Sat, Jun 21, 2014 at 5:48 AM, Rafael EspĂndola < [email protected]> wrote: > 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
