aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2015-01-29 21:02:21 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2015-01-29 21:02:21 +0000
commit7b33f0c8e6688594167f68e3a87031fea9d058bd (patch)
tree11ab17e0248f5e7538c9d5b630dba979f09c58b6 /gcc/c
parenta7c3e87ed900cb2b6ff0f72292e8a18cb87187b6 (diff)
downloadgcc-7b33f0c8e6688594167f68e3a87031fea9d058bd.zip
gcc-7b33f0c8e6688594167f68e3a87031fea9d058bd.tar.gz
gcc-7b33f0c8e6688594167f68e3a87031fea9d058bd.tar.bz2
re PR c/64709 (Bogus -Wmissing-field-initializers warning)
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
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-typeck.c28
2 files changed, 25 insertions, 10 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 408fc16..7c2ce38 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index aa74968..65c6f7f 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -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