r176817 - Add -Wc99-compat warning for C11 unicode string and character literals.

Richard Smith richard-llvm at metafoo.co.uk
Mon Mar 11 11:01:42 PDT 2013


Author: rsmith
Date: Mon Mar 11 13:01:42 2013
New Revision: 176817

URL: http://llvm.org/viewvc/llvm-project?rev=176817&view=rev
Log:
Add -Wc99-compat warning for C11 unicode string and character literals.

Added:
    cfe/trunk/test/Lexer/unicode-strings.c
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
    cfe/trunk/lib/Lex/Lexer.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=176817&r1=176816&r2=176817&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Mon Mar 11 13:01:42 2013
@@ -182,6 +182,9 @@ def ext_string_too_long : Extension<"str
   "support">, InGroup<OverlengthStrings>;
 def err_character_too_large : Error<
   "character too large for enclosing character literal type">;
+def warn_c99_compat_unicode_literal : Warning<
+  "unicode literals are incompatible with C99">,
+  InGroup<C99Compat>, DefaultIgnore;
 def warn_cxx98_compat_unicode_literal : Warning<
   "unicode literals are incompatible with C++98">,
   InGroup<CXX98Compat>, DefaultIgnore;

Modified: cfe/trunk/lib/Lex/Lexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=176817&r1=176816&r2=176817&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/Lexer.cpp (original)
+++ cfe/trunk/lib/Lex/Lexer.cpp Mon Mar 11 13:01:42 2013
@@ -1629,9 +1629,10 @@ void Lexer::LexStringLiteral(Token &Resu
   if (!isLexingRawMode() &&
       (Kind == tok::utf8_string_literal ||
        Kind == tok::utf16_string_literal ||
-       Kind == tok::utf32_string_literal) &&
-      getLangOpts().CPlusPlus)
-    Diag(BufferPtr, diag::warn_cxx98_compat_unicode_literal);
+       Kind == tok::utf32_string_literal))
+    Diag(BufferPtr, getLangOpts().CPlusPlus
+           ? diag::warn_cxx98_compat_unicode_literal
+           : diag::warn_c99_compat_unicode_literal);
 
   char C = getAndAdvanceChar(CurPtr, Result);
   while (C != '"') {
@@ -1795,9 +1796,10 @@ void Lexer::LexCharConstant(Token &Resul
   const char *NulCharacter = 0; // Does this character contain the \0 character?
 
   if (!isLexingRawMode() &&
-      (Kind == tok::utf16_char_constant || Kind == tok::utf32_char_constant) &&
-      getLangOpts().CPlusPlus)
-    Diag(BufferPtr, diag::warn_cxx98_compat_unicode_literal);
+      (Kind == tok::utf16_char_constant || Kind == tok::utf32_char_constant))
+    Diag(BufferPtr, getLangOpts().CPlusPlus
+           ? diag::warn_cxx98_compat_unicode_literal
+           : diag::warn_c99_compat_unicode_literal);
 
   char C = getAndAdvanceChar(CurPtr, Result);
   if (C == '\'') {

Added: cfe/trunk/test/Lexer/unicode-strings.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/unicode-strings.c?rev=176817&view=auto
==============================================================================
--- cfe/trunk/test/Lexer/unicode-strings.c (added)
+++ cfe/trunk/test/Lexer/unicode-strings.c Mon Mar 11 13:01:42 2013
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -x c -std=c11 -Werror %s
+// RUN: %clang_cc1 -x c++ -std=c++11 -Werror %s
+// RUN: %clang_cc1 -x c -std=c11 -Wc99-compat -verify %s
+// RUN: %clang_cc1 -x c++ -std=c++11 -Wc++98-compat -verify %s
+
+#ifndef __cplusplus
+typedef __CHAR16_TYPE__ char16_t;
+typedef __CHAR32_TYPE__ char32_t;
+#else
+// expected-warning at 17 {{'char16_t' type specifier is incompatible with C++98}}
+// expected-warning at 18 {{'char32_t' type specifier is incompatible with C++98}}
+// expected-warning at 20 {{'char16_t' type specifier is incompatible with C++98}}
+// expected-warning at 21 {{'char32_t' type specifier is incompatible with C++98}}
+#endif
+
+const char *a = u8"abcd"; // expected-warning {{unicode literals are incompatible with}}
+const char16_t *b = u"abcd"; // expected-warning {{unicode literals are incompatible with}}
+const char32_t *c = U"abcd"; // expected-warning {{unicode literals are incompatible with}}
+
+char16_t d = u'a'; // expected-warning {{unicode literals are incompatible with}}
+char32_t e = U'a'; // expected-warning {{unicode literals are incompatible with}}





More information about the cfe-commits mailing list