r211426 - Lex: Use the correct types for MS integer suffixes

David Majnemer david.majnemer at gmail.com
Sat Jun 21 11:55:55 PDT 2014


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 <
rafael.espindola at gmail.com> 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 <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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140621/8536b868/attachment.html>


More information about the cfe-commits mailing list