[cfe-commits] r129260 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaInit.cpp test/CXX/dcl.decl/dcl.init/dcl.init.string/p2.cpp test/SemaCXX/warn-global-constructors.cpp

Eli Friedman eli.friedman at gmail.com
Sun Apr 10 17:23:45 PDT 2011


Author: efriedma
Date: Sun Apr 10 19:23:45 2011
New Revision: 129260

URL: http://llvm.org/viewvc/llvm-project?rev=129260&view=rev
Log:
PR9669: implement correct checking for [dcl.init.string]p2.


Added:
    cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.string/p2.cpp
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaInit.cpp
    cfe/trunk/test/SemaCXX/warn-global-constructors.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=129260&r1=129259&r2=129260&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Apr 10 19:23:45 2011
@@ -2208,6 +2208,8 @@
   "excess elements in char array initializer">;
 def warn_excess_initializers_in_char_array_initializer : ExtWarn<
   "excess elements in char array initializer">;
+def err_initializer_string_for_char_array_too_long : Error<
+  "initializer-string for char array is too long">;
 def warn_initializer_string_for_char_array_too_long : ExtWarn<
   "initializer-string for char array is too long">;
 def warn_missing_field_initializers : Warning<

Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=129260&r1=129259&r2=129260&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Sun Apr 10 19:23:45 2011
@@ -92,13 +92,22 @@
 
   const ConstantArrayType *CAT = cast<ConstantArrayType>(AT);
 
-  // C99 6.7.8p14. We have an array of character type with known size.  However,
+  // We have an array of character type with known size.  However,
   // the size may be smaller or larger than the string we are initializing.
   // FIXME: Avoid truncation for 64-bit length strings.
-  if (StrLength-1 > CAT->getSize().getZExtValue())
-    S.Diag(Str->getSourceRange().getBegin(),
-           diag::warn_initializer_string_for_char_array_too_long)
-      << Str->getSourceRange();
+  if (S.getLangOptions().CPlusPlus) {
+    // [dcl.init.string]p2
+    if (StrLength > CAT->getSize().getZExtValue())
+      S.Diag(Str->getSourceRange().getBegin(),
+             diag::err_initializer_string_for_char_array_too_long)
+        << Str->getSourceRange();
+  } else {
+    // C99 6.7.8p14.
+    if (StrLength-1 > CAT->getSize().getZExtValue())
+      S.Diag(Str->getSourceRange().getBegin(),
+             diag::warn_initializer_string_for_char_array_too_long)
+        << Str->getSourceRange();
+  }
 
   // Set the type to the actual size that we are initializing.  If we have
   // something like:

Added: cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.string/p2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.string/p2.cpp?rev=129260&view=auto
==============================================================================
--- cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.string/p2.cpp (added)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.string/p2.cpp Sun Apr 10 19:23:45 2011
@@ -0,0 +1,2 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+char test1[1]="f"; // expected-error {{initializer-string for char array is too long}}

Modified: cfe/trunk/test/SemaCXX/warn-global-constructors.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-global-constructors.cpp?rev=129260&r1=129259&r2=129260&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-global-constructors.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-global-constructors.cpp Sun Apr 10 19:23:45 2011
@@ -53,8 +53,8 @@
 
 namespace test4 {
   char a[] = "hello";
-  char b[5] = "hello";
-  char c[][5] = { "hello" };
+  char b[6] = "hello";
+  char c[][6] = { "hello" };
 }
 
 namespace test5 {





More information about the cfe-commits mailing list