re PR c/64709 (Bogus -Wmissing-field-initializers warning)
authorMarek Polacek <polacek@redhat.com>
Thu, 29 Jan 2015 21:02:21 +0000 (21:02 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 29 Jan 2015 21:02:21 +0000 (21:02 +0000)
PR c/64709
* c-typeck.c (pop_init_level): If constructor_elements has
exactly one element with integer_zerop value, set constructor_zeroinit
to 1.  Remove braces around warning_init call.

* gcc.dg/pr64709.c: New test.

From-SVN: r220263

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr64709.c [new file with mode: 0644]

index 408fc163ab7dc50314894ab3c31c2ff7c85e002a..7c2ce3865e849e554f039811e7e6733f777a3244 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-29  Marek Polacek  <polacek@redhat.com>
+
+       PR c/64709
+       * c-typeck.c (pop_init_level): If constructor_elements has
+       exactly one element with integer_zerop value, set constructor_zeroinit
+       to 1.  Remove braces around warning_init call.
+
 2015-01-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/64766
index aa74968d28b2d91be365561d17dccd9a92dee6a1..65c6f7f42726885ea040dda6a136f6f8e03afe9e 100644 (file)
@@ -7557,20 +7557,28 @@ pop_init_level (location_t loc, int implicit,
        }
     }
 
-  /* Initialization with { } counts as zeroinit.  */
-  if (vec_safe_length (constructor_elements) == 0)
-    constructor_zeroinit = 1;
-  /* If the constructor has more than one element, it can't be { 0 }.  */
-  else if (vec_safe_length (constructor_elements) != 1)
-    constructor_zeroinit = 0;
+  switch (vec_safe_length (constructor_elements))
+    {
+    case 0:
+      /* Initialization with { } counts as zeroinit.  */
+      constructor_zeroinit = 1;
+      break;
+    case 1:
+      /* This might be zeroinit as well.  */
+      if (integer_zerop ((*constructor_elements)[0].value))
+       constructor_zeroinit = 1;
+      break;
+    default:
+      /* If the constructor has more than one element, it can't be { 0 }.  */
+      constructor_zeroinit = 0;
+      break;
+    }
 
   /* Warn when some structs are initialized with direct aggregation.  */
   if (!implicit && found_missing_braces && warn_missing_braces
       && !constructor_zeroinit)
-    {
-      warning_init (loc, OPT_Wmissing_braces,
-                   "missing braces around initializer");
-    }
+    warning_init (loc, OPT_Wmissing_braces,
+                 "missing braces around initializer");
 
   /* Warn when some struct elements are implicitly initialized to zero.  */
   if (warn_missing_field_initializers
index d3b38839083bda254c436ec3227cdabc216e0c22..f46ea72cfac719af8aaa977d968a98f0a3be78c2 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-29  Marek Polacek  <polacek@redhat.com>
+
+       PR c/64709
+       * gcc.dg/pr64709.c: New test.
+
 2015-01-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/64717
diff --git a/gcc/testsuite/gcc.dg/pr64709.c b/gcc/testsuite/gcc.dg/pr64709.c
new file mode 100644 (file)
index 0000000..337e3db
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR c/64709 */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-field-initializers" } */
+
+struct S { int a, b; };
+void
+foo (void)
+{
+  struct S s[] = { { 1, 2 }, { 0 } }; /* { dg-bogus "missing initializer for field" } */
+}