re PR c/36750 (-Wmissing-field-initializers relaxation request)
authorAlexander Monakov <amonakov@ispras.ru>
Fri, 22 Apr 2011 11:53:01 +0000 (15:53 +0400)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Fri, 22 Apr 2011 11:53:01 +0000 (15:53 +0400)
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.

From-SVN: r172857

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/missing-field-init-2.c

index ec3b8d1ba8badb9dc8be9cd2c8749d889b9d992a..2401fd2fee503d35e5bd27463bee8921bd03908f 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-22  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR c/36750
+       * c-typeck.c (pop_init_level): Do not warn about initializing
+       with ` = {0}'.
+
 2011-04-22  Alan Modra  <amodra@gmail.com>
 
        * config/rs6000/rs6000.c (rs6000_function_arg): Remove CALL_LIBCALL
index 15b77550dc3ab55bcdb60e83ba2f1775684b2a34..d8609d24e3f81e2f594d095b7ce5f7a189dce516 100644 (file)
@@ -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,
index da59b77a5dbd561fdc9417867db60d54fbd83e17..95618277add100df3c476e56f164cc2a0b6ff6cd 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-22  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR c/36750
+       * gcc.dg/missing-field-init-2.c: Update testcase.
+
 2011-04-22  Alan Modra  <amodra@gmail.com>
 
        * gcc.target/powerpc/ppc-pow.c: Allow for tail calls.
index 581eb30d89b306e0bab6b3ca98af2739bf6a20bd..c5a3f490387c8e6d199dbbc91a719aa8021da1bc 100644 (file)
@@ -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)" } */