[cfe-commits] r152198 - in /cfe/trunk: include/clang/Basic/DiagnosticLexKinds.td lib/Lex/Lexer.cpp test/SemaCXX/cxx0x-compat.cpp

Richard Smith richard at metafoo.co.uk
Tue Mar 6 19:24:46 PST 2012


On Tue, Mar 6, 2012 at 7:22 PM, Jordan Rose <jrose at belkadan.com> wrote:

> Can this have a fixit, since almost always the right fix is a space?
>

Not only can it, it already does :-)

I've added a test for the fixit in r152199.


> Jordy
>
>
> On Mar 6, 2012, at 19:13, Richard Smith wrote:
>
> > Author: rsmith
> > Date: Tue Mar  6 21:13:00 2012
> > New Revision: 152198
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=152198&view=rev
> > Log:
> > Add -Wc++11-compat warning for string and character literals followed by
> > identifiers, in cases where those identifiers would be treated as
> > user-defined literal suffixes in C++11.
> >
> > Modified:
> >    cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
> >    cfe/trunk/lib/Lex/Lexer.cpp
> >    cfe/trunk/test/SemaCXX/cxx0x-compat.cpp
> >
> > Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=152198&r1=152197&r2=152198&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
> > +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Tue Mar  6
> 21:13:00 2012
> > @@ -131,6 +131,9 @@
> > def warn_cxx98_compat_unicode_literal : Warning<
> >   "unicode literals are incompatible with C++98">,
> >   InGroup<CXX98Compat>, DefaultIgnore;
> > +def warn_cxx11_compat_user_defined_literal : Warning<
> > +  "identifier after literal will be treated as a user-defined literal
> suffix "
> > +  "in C++11">, InGroup<CXX11Compat>, DefaultIgnore;
> > def err_unsupported_string_concat : Error<
> >   "unsupported non-standard concatenation of string literals">;
> > def err_string_concat_mixed_suffix : Error<
> >
> > Modified: cfe/trunk/lib/Lex/Lexer.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=152198&r1=152197&r2=152198&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Lex/Lexer.cpp (original)
> > +++ cfe/trunk/lib/Lex/Lexer.cpp Tue Mar  6 21:13:00 2012
> > @@ -1574,14 +1574,21 @@
> > }
> >
> > /// LexUDSuffix - Lex the ud-suffix production for user-defined literal
> suffixes
> > -/// in C++11.
> > +/// in C++11, or warn on a ud-suffix in C++98.
> > const char *Lexer::LexUDSuffix(Token &Result, const char *CurPtr) {
> > -  assert(getFeatures().CPlusPlus0x && "ud-suffix only exists in C++11");
> > +  assert(getFeatures().CPlusPlus);
> >
> >   // Maximally munch an identifier. FIXME: UCNs.
> >   unsigned Size;
> >   char C = getCharAndSize(CurPtr, Size);
> >   if (isIdentifierHead(C)) {
> > +    if (!getFeatures().CPlusPlus0x) {
> > +      if (!isLexingRawMode())
> > +        Diag(CurPtr, diag::warn_cxx11_compat_user_defined_literal)
> > +          << FixItHint::CreateInsertion(getSourceLocation(CurPtr), " ");
> > +      return CurPtr;
> > +    }
> > +
> >     Result.setFlag(Token::HasUDSuffix);
> >     do {
> >       CurPtr = ConsumeChar(CurPtr, Size, Result);
> > @@ -1631,7 +1638,7 @@
> >   }
> >
> >   // If we are in C++11, lex the optional ud-suffix.
> > -  if (getFeatures().CPlusPlus0x)
> > +  if (getFeatures().CPlusPlus)
> >     CurPtr = LexUDSuffix(Result, CurPtr);
> >
> >   // If a nul character existed in the string, warn about it.
> > @@ -1714,7 +1721,7 @@
> >   }
> >
> >   // If we are in C++11, lex the optional ud-suffix.
> > -  if (getFeatures().CPlusPlus0x)
> > +  if (getFeatures().CPlusPlus)
> >     CurPtr = LexUDSuffix(Result, CurPtr);
> >
> >   // Update the location of token as well as BufferPtr.
> > @@ -1801,7 +1808,7 @@
> >   }
> >
> >   // If we are in C++11, lex the optional ud-suffix.
> > -  if (getFeatures().CPlusPlus0x)
> > +  if (getFeatures().CPlusPlus)
> >     CurPtr = LexUDSuffix(Result, CurPtr);
> >
> >   // If a nul character existed in the character, warn about it.
> >
> > Modified: cfe/trunk/test/SemaCXX/cxx0x-compat.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-compat.cpp?rev=152198&r1=152197&r2=152198&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/SemaCXX/cxx0x-compat.cpp (original)
> > +++ cfe/trunk/test/SemaCXX/cxx0x-compat.cpp Tue Mar  6 21:13:00 2012
> > @@ -27,3 +27,13 @@
> > }
> > s = { n }, // expected-warning {{non-constant-expression cannot be
> narrowed from type 'int' to 'char' in initializer list in C++11}}
> expected-note {{explicit cast}}
> > t = { 1234 }; // expected-warning {{constant expression evaluates to
> 1234 which cannot be narrowed to type 'char' in C++11}} expected-warning
> {{changes value}} expected-note {{explicit cast}}
> > +
> > +#define PRIuS "uS"
> > +int printf(const char *, ...);
> > +typedef __typeof(sizeof(int)) size_t;
> > +void h(size_t foo, size_t bar) {
> > +  printf("foo is %"PRIuS", bar is %"PRIuS, foo, bar); //
> expected-warning 2{{identifier after literal will be treated as a
> user-defined literal suffix in C++11}}
> > +}
> > +
> > +#define x + 1
> > +char c = 'x'x; // expected-warning {{will be treated as a user-defined
> literal suffix}}
> >
> >
> > _______________________________________________
> > 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/20120306/34b6e2de/attachment.html>


More information about the cfe-commits mailing list