diff options
author | Marek Polacek <polacek@redhat.com> | 2015-01-29 21:02:21 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2015-01-29 21:02:21 +0000 |
commit | 7b33f0c8e6688594167f68e3a87031fea9d058bd (patch) | |
tree | 11ab17e0248f5e7538c9d5b630dba979f09c58b6 /gcc/c | |
parent | a7c3e87ed900cb2b6ff0f72292e8a18cb87187b6 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 28 |
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 |