r211426 - Lex: Use the correct types for MS integer suffixes
Rafael EspĂndola
rafael.espindola at gmail.com
Sat Jun 21 05:48:59 PDT 2014
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 <david.majnemer at gmail.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list