Patchwork PR c/36750: Suppress missing field initializer warning for '= {0}'

login
register
mail settings
Submitter Alexander Monakov
Date April 21, 2011, 5:20 p.m.
Message ID <alpine.LNX.2.00.1104212104330.17990@monoid.intra.ispras.ru>
Download mbox | patch
Permalink /patch/92432/
State New
Headers show

Comments

Alexander Monakov - April 21, 2011, 5:20 p.m.
Hello,

This patch suppresses the "missing field initializer" warning when a structure
is initialized with ` = { 0 }' in C.  Even though the PR author asks
specifically to suppress (at least) only when a trailing comma is included,
results from Google code search suggest that spelling without a comma is more
common, so the patch does not distinguish these variants.  Behavior of C++
front-end is unchanged.

Bootstrapped and regtested on x86_64-linux, OK for trunk?

2011-04-21  Alexander Monakov  <amonakov@ispras.ru>

	PR c/36750
	* c-typeck.c (pop_init_level): Do not warn about initializing
	with ` = {0}'.

testsuite:
	* gcc.dg/missing-field-init-2.c: Update testcase.
Joseph S. Myers - April 21, 2011, 8:28 p.m.
On Thu, 21 Apr 2011, Alexander Monakov wrote:

> Hello,
> 
> This patch suppresses the "missing field initializer" warning when a structure
> is initialized with ` = { 0 }' in C.  Even though the PR author asks
> specifically to suppress (at least) only when a trailing comma is included,
> results from Google code search suggest that spelling without a comma is more
> common, so the patch does not distinguish these variants.  Behavior of C++
> front-end is unchanged.
> 
> Bootstrapped and regtested on x86_64-linux, OK for trunk?

OK.

Patch

diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 15b7755..d8609d2 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -6934,15 +6934,23 @@  pop_init_level (int implicit, struct obstack * braced_init_obstack)
       && TREE_CODE (constructor_type) == RECORD_TYPE
       && constructor_unfilled_fields)
     {
+	bool constructor_zeroinit =
+	 (VEC_length (constructor_elt, constructor_elements) == 1
+	  && integer_zerop
+	      (VEC_index (constructor_elt, constructor_elements, 0)->value));
+
 	/* Do not warn for flexible array members or zero-length arrays.  */
 	while (constructor_unfilled_fields
 	       && (!DECL_SIZE (constructor_unfilled_fields)
 		   || integer_zerop (DECL_SIZE (constructor_unfilled_fields))))
 	  constructor_unfilled_fields = DECL_CHAIN (constructor_unfilled_fields);
 
-	/* Do not warn if this level of the initializer uses member
-	   designators; it is likely to be deliberate.  */
-	if (constructor_unfilled_fields && !constructor_designated)
+	if (constructor_unfilled_fields
+	    /* Do not warn if this level of the initializer uses member
+	       designators; it is likely to be deliberate.  */
+	    && !constructor_designated
+	    /* Do not warn about initializing with ` = {0}'.  */
+	    && !constructor_zeroinit)
 	  {
 	    push_member_name (constructor_unfilled_fields);
 	    warning_init (OPT_Wmissing_field_initializers,
diff --git a/gcc/testsuite/gcc.dg/missing-field-init-2.c b/gcc/testsuite/gcc.dg/missing-field-init-2.c
index 581eb30..c5a3f49 100644
--- a/gcc/testsuite/gcc.dg/missing-field-init-2.c
+++ b/gcc/testsuite/gcc.dg/missing-field-init-2.c
@@ -9,3 +9,6 @@  struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-warning "(missing initializer)|(near
 struct s s5[] = { 1, 2, 3, 4, 5, 6 };
 /* Designated initializers produce no warning.  */
 struct s s6 = { .a = 1 }; /* { dg-bogus "missing initializer" } */
+/* Allow zero-initializing with "= { 0 }".  */
+struct s s7 = { 0 }; /* { dg-bogus "missing initializer" } */
+struct s s8 = { 1 }; /* { dg-warning "(missing initializer)|(near initialization)" } */