This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH RFA: -Wc++-compat warning about array initialized with string


Using a string constant to initialize an array whose size is the length
of the string is permitted in C, but not in C++.  E.g.,
  char a[1] = "a";
is OK in C but not C++.  C++ requires that the array have space for the
zero byte.

This patch adds this warning to -Wc++-compat.  It also fixes the single
case found by a gcc bootstrap where the gcc code has this problem.  This
patch requires approval by a C frontend maintainer.

Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK for mainline?

Ian


gcc/ChangeLog:

2009-06-16  Ian Lance Taylor  <iant@google.com>

	* c-pch.c (get_ident): Don't set size of templ array.
	(pch_init): Don't set size of partial_pch array.

	* c-typeck.c (digest_init): If -Wc++-compat, warn about using a
	string constant to intialize an array whose size is the length of
	the string.

gcc/testsuite/ChangeLog:

2009-06-16  Ian Lance Taylor  <iant@google.com>

	* gcc.dg/Wcxx-compat-14.c: New testcase.


Index: c-typeck.c
===================================================================
--- c-typeck.c	(revision 148549)
+++ c-typeck.c	(working copy)
@@ -5546,16 +5546,26 @@ digest_init (location_t init_loc, tree t
 	  TREE_TYPE (inside_init) = type;
 	  if (TYPE_DOMAIN (type) != 0
 	      && TYPE_SIZE (type) != 0
-	      && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
+	      && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
+	    {
+	      unsigned HOST_WIDE_INT len = TREE_STRING_LENGTH (inside_init);
+
 	      /* Subtract the size of a single (possibly wide) character
 		 because it's ok to ignore the terminating null char
 		 that is counted in the length of the constant.  */
-	      && 0 > compare_tree_int (TYPE_SIZE_UNIT (type),
-				       TREE_STRING_LENGTH (inside_init)
-				       - (TYPE_PRECISION (typ1)
-					  / BITS_PER_UNIT)))
-	    pedwarn_init (init_loc, 0, 
-			  "initializer-string for array of chars is too long");
+	      if (0 > compare_tree_int (TYPE_SIZE_UNIT (type),
+					(len
+					 - (TYPE_PRECISION (typ1)
+					    / BITS_PER_UNIT))))
+		pedwarn_init (init_loc, 0,
+			      ("initializer-string for array of chars "
+			       "is too long"));
+	      else if (warn_cxx_compat
+		       && 0 > compare_tree_int (TYPE_SIZE_UNIT (type), len))
+		warning_at (init_loc, OPT_Wc___compat,
+			    ("initializer-string for array chars "
+			     "is too long for C++"));
+	    }
 
 	  return inside_init;
 	}
Index: c-pch.c
===================================================================
--- c-pch.c	(revision 148549)
+++ c-pch.c	(working copy)
@@ -1,5 +1,6 @@
 /* Precompiled header implementation for the C languages.
-   Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -92,7 +93,7 @@ static const char *
 get_ident (void)
 {
   static char result[IDENT_LENGTH];
-  static const char templ[IDENT_LENGTH] = "gpch.013";
+  static const char templ[] = "gpch.013";
   static const char c_language_chars[] = "Co+O";
 
   memcpy (result, templ, IDENT_LENGTH);
@@ -112,7 +113,7 @@ pch_init (void)
   FILE *f;
   struct c_pch_validity v;
   void *target_validity;
-  static const char partial_pch[IDENT_LENGTH] = "gpcWrite";
+  static const char partial_pch[] = "gpcWrite";
 
 #ifdef ASM_COMMENT_START
   if (flag_verbose_asm)
Index: testsuite/gcc.dg/Wcxx-compat-14.c
===================================================================
--- testsuite/gcc.dg/Wcxx-compat-14.c	(revision 0)
+++ testsuite/gcc.dg/Wcxx-compat-14.c	(revision 0)
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-Wc++-compat" } */
+
+char a1[] = "a";
+char a2[1] = "a";	/* { dg-warning "C\[+\]\[+\]" } */
+char a3[2] = "a";

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]