Can this have a fixit, since almost always the right fix is a space? Jordy
(resending with list-compatible e-mail) 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 > [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
