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

Reply via email to