On Tue, Mar 6, 2012 at 7:22 PM, Jordan Rose <[email protected]> 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 > > [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
