[PATCH] Add new warning Wmissing-designated-initializers [PR39589]
Currently the behaviour of Wmissing-field-initializers is inconsistent between C and C++. The C warning assumes that missing designated initializers are deliberate, and does not warn. The C++ warning does warn for missing designated initializers. This patch changes the behaviour of Wmissing-field-initializers to universally not warn about missing designated initializers, and adds a new warning for specifically for missing designated initializers. NOTE TO MAINTAINERS: This is my first gcc contribution, so I don't have git write access. Successfully tested on x86_64-pc-linux-gnu. PR c/39589 gcc/c-family/ChangeLog: * c.opt: gcc/c/ChangeLog: * c-typeck.cc (pop_init_level): gcc/cp/ChangeLog: * typeck2.cc (process_init_constructor_record): gcc/testsuite/ChangeLog: * g++.dg/diagnostic/base.C: * gcc.dg/20011021-1.c: * gcc.dg/missing-field-init-1.c: * gcc.dg/pr60784.c: * g++.dg/warn/missing-designated-initializers-1.C: New test. * g++.dg/warn/missing-designated-initializers-2.C: New test. * gcc.dg/missing-designated-initializers-1.c: New test. * gcc.dg/missing-designated-initializers-2.c: New test. --- gcc/c-family/c.opt| 4 +++ gcc/c/c-typeck.cc | 36 +++ gcc/cp/typeck2.cc | 20 --- gcc/testsuite/g++.dg/diagnostic/base.C| 4 +-- .../warn/missing-designated-initializers-1.C | 11 ++ .../warn/missing-designated-initializers-2.C | 11 ++ gcc/testsuite/gcc.dg/20011021-1.c | 4 +-- .../missing-designated-initializers-1.c | 13 +++ .../missing-designated-initializers-2.c | 13 +++ gcc/testsuite/gcc.dg/missing-field-init-1.c | 2 +- gcc/testsuite/gcc.dg/pr60784.c| 2 +- 11 files changed, 96 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/missing-designated-initializers-1.C create mode 100644 gcc/testsuite/g++.dg/warn/missing-designated-initializers-2.C create mode 100644 gcc/testsuite/gcc.dg/missing-designated-initializers-1.c create mode 100644 gcc/testsuite/gcc.dg/missing-designated-initializers-2.c diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 491aa02e1a3..81e52f1417e 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -977,6 +977,10 @@ Wmissing-field-initializers C ObjC C++ ObjC++ Var(warn_missing_field_initializers) Warning EnabledBy(Wextra) Warn about missing fields in struct initializers. +Wmissing-designated-initializers +C ObjC C++ ObjC++ Var(warn_missing_designated_initializers) Warning EnabledBy(Wextra) +Warn about missing designated initialisers in struct initializers. + Wmissing-format-attribute C ObjC C++ ObjC++ Warning Alias(Wsuggest-attribute=format) ; diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 094e41fa202..72b544e8f67 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -9795,7 +9795,7 @@ pop_init_level (location_t loc, int implicit, } /* Warn when some struct elements are implicitly initialized to zero. */ - if (warn_missing_field_initializers + if ((warn_missing_field_initializers || warn_missing_designated_initializers) && constructor_type && TREE_CODE (constructor_type) == RECORD_TYPE && constructor_unfilled_fields) @@ -9806,21 +9806,29 @@ pop_init_level (location_t loc, int implicit, || integer_zerop (DECL_SIZE (constructor_unfilled_fields constructor_unfilled_fields = DECL_CHAIN (constructor_unfilled_fields); - 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 } or with { }. */ - && !constructor_zeroinit) - { - if (warning_at (input_location, OPT_Wmissing_field_initializers, + if (constructor_unfilled_fields + /* Do not warn about initializing with { 0 } or with { }. */ + && !constructor_zeroinit) + { + if (!constructor_designated) + { + if (warning_at (input_location, OPT_Wmissing_field_initializers, "missing initializer for field %qD of %qT", - constructor_unfilled_fields, - constructor_type)) - inform (DECL_SOURCE_LOCATION (constructor_unfilled_fields), + constructor_unfilled_fields, constructor_type)) + inform (DECL_SOURCE_LOCATION (constructor_unfilled_fields), + "%qD declared here", constructor_unfilled_fields); + } + else if (warn_missing_designated_initializers) + { + if (warning_at ( +
Re: [PATCH] Add new warning Wmissing-designated-initializers [PR39589]
Ping https://gcc.gnu.org/pipermail/gcc-patches/2024-August/661510.html
[PATCH v2] Add new warning Wmissing-designated-initializers [PR39589]
v2 Patch: * adds proper changelog text * fixes typo in c.opt Currently the behaviour of Wmissing-field-initializers is inconsistent between C and C++. The C warning assumes that missing designated initializers are deliberate, and does not warn. The C++ warning does warn for missing designated initializers. This patch changes the behaviour of Wmissing-field-initializers to universally not warn about missing designated initializers, and adds a new warning for specifically for missing designated initializers. NOTE TO MAINTAINERS: This is my first gcc contribution, so I don't have git write access. Successfully tested on x86_64-pc-linux-gnu. PR c/39589 gcc/c-family/ChangeLog: * c.opt: Added new option Wmissing-designated-initializers, enabled by Wextra gcc/c/ChangeLog: * c-typeck.cc (pop_init_level): Generate warning for missing designated initializers rather than always ignore gcc/cp/ChangeLog: * typeck2.cc (process_init_constructor_record): Add check if missing initializer is designated, warn as appropriate gcc/testsuite/ChangeLog: * g++.dg/diagnostic/base.C: Change flags * gcc.dg/20011021-1.c: Fix test, missing designated initializers can generate a warning now * gcc.dg/missing-field-init-1.c: Change flags * gcc.dg/pr60784.c: Change flags * g++.dg/warn/missing-designated-initializers-1.C: New test. * g++.dg/warn/missing-designated-initializers-2.C: New test. * gcc.dg/missing-designated-initializers-1.c: New test. * gcc.dg/missing-designated-initializers-2.c: New test. --- gcc/c-family/c.opt| 4 +++ gcc/c/c-typeck.cc | 36 +++ gcc/cp/typeck2.cc | 20 --- gcc/testsuite/g++.dg/diagnostic/base.C| 4 +-- .../warn/missing-designated-initializers-1.C | 11 ++ .../warn/missing-designated-initializers-2.C | 11 ++ gcc/testsuite/gcc.dg/20011021-1.c | 4 +-- .../missing-designated-initializers-1.c | 13 +++ .../missing-designated-initializers-2.c | 13 +++ gcc/testsuite/gcc.dg/missing-field-init-1.c | 2 +- gcc/testsuite/gcc.dg/pr60784.c| 2 +- 11 files changed, 96 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/missing-designated-initializers-1.C create mode 100644 gcc/testsuite/g++.dg/warn/missing-designated-initializers-2.C create mode 100644 gcc/testsuite/gcc.dg/missing-designated-initializers-1.c create mode 100644 gcc/testsuite/gcc.dg/missing-designated-initializers-2.c diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 491aa02e1a3..81e52f1417e 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -977,6 +977,10 @@ Wmissing-field-initializers C ObjC C++ ObjC++ Var(warn_missing_field_initializers) Warning EnabledBy(Wextra) Warn about missing fields in struct initializers. +Wmissing-designated-initializers +C ObjC C++ ObjC++ Var(warn_missing_designated_initializers) Warning EnabledBy(Wextra) +Warn about missing designated initializers in struct initializers. + Wmissing-format-attribute C ObjC C++ ObjC++ Warning Alias(Wsuggest-attribute=format) ; diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 094e41fa202..72b544e8f67 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -9795,7 +9795,7 @@ pop_init_level (location_t loc, int implicit, } /* Warn when some struct elements are implicitly initialized to zero. */ - if (warn_missing_field_initializers + if ((warn_missing_field_initializers || warn_missing_designated_initializers) && constructor_type && TREE_CODE (constructor_type) == RECORD_TYPE && constructor_unfilled_fields) @@ -9806,21 +9806,29 @@ pop_init_level (location_t loc, int implicit, || integer_zerop (DECL_SIZE (constructor_unfilled_fields constructor_unfilled_fields = DECL_CHAIN (constructor_unfilled_fields); - 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 } or with { }. */ - && !constructor_zeroinit) - { - if (warning_at (input_location, OPT_Wmissing_field_initializers, + if (constructor_unfilled_fields + /* Do not warn about initializing with { 0 } or with { }. */ + && !constructor_zeroinit) + { + if (!constructor_designated) + { + if (warning_at (input_location, OPT_Wmissing_field_initializers, "missing initializer for field %qD of %qT", - constructor_unfilled_fields, - constructor_type)) - inform (DECL_SO
Re: [PATCH v2] Add new warning Wmissing-designated-initializers [PR39589]
Ping https://gcc.gnu.org/pipermail/gcc-patches/2024-September/662590.html
[PING #3][PATCH v2] Add new warning Wmissing-designated-initializers [PR39589]
Hi all, Pinginghttps://gcc.gnu.org/pipermail/gcc-patches/2024-September/662590.html for a review if anyone has a moment. Many thanks, Peter
[PATCH v3] Add new warning Wmissing-designated-initializers [PR39589]
v3 Patch: * adds documentation * fixes formatting * minor code cleanup Currently the behaviour of Wmissing-field-initializers is inconsistent between C and C++. The C warning assumes that missing designated initializers are deliberate, and does not warn. The C++ warning does warn for missing designated initializers. This patch changes the behaviour of Wmissing-field-initializers to universally not warn about missing designated initializers, and adds a new warning for specifically for missing designated initializers. NOTE TO MAINTAINERS: This is my first gcc contribution, so I don't have git write access. Successfully tested on x86_64-pc-linux-gnu. PR c/39589 gcc/c-family/ChangeLog: * c.opt (Wmissing-designated-initializers): New option. * c.opt.urls: (Wmissing-designated-initializers): New option. gcc/c/ChangeLog: * c-typeck.cc (pop_init_level): Generate warning for missing designated initializers rather than always ignore. gcc/ChangeLog: * common.opt.urls: (Wmissing-designated-initializers): New option. * doc/invoke.texi: (Wmissing-designated-initializers): New option. gcc/cp/ChangeLog: * typeck2.cc (process_init_constructor_record): Add check if missing initializer is designated, warn as appropriate. gcc/testsuite/ChangeLog: * g++.dg/diagnostic/base.C: Change flags. * gcc.dg/20011021-1.c: Fix test, missing designated initializers can generate a warning now. * gcc.dg/missing-field-init-1.c: Change flags. * gcc.dg/pr60784.c: Change flags. * g++.dg/warn/missing-designated-initializers-1.C: New test. * g++.dg/warn/missing-designated-initializers-2.C: New test. * gcc.dg/missing-designated-initializers-1.c: New test. * gcc.dg/missing-designated-initializers-2.c: New test. --- gcc/c-family/c.opt| 4 + gcc/c-family/c.opt.urls | 3 + gcc/c/c-typeck.cc | 52 - gcc/common.opt.urls | 2 +- gcc/cp/typeck2.cc | 100 +- gcc/doc/invoke.texi | 40 ++- gcc/testsuite/g++.dg/diagnostic/base.C| 4 +- .../warn/missing-designated-initializers-1.C | 12 +++ .../warn/missing-designated-initializers-2.C | 12 +++ gcc/testsuite/gcc.dg/20011021-1.c | 17 ++- .../missing-designated-initializers-1.c | 14 +++ .../missing-designated-initializers-2.c | 14 +++ gcc/testsuite/gcc.dg/missing-field-init-1.c | 2 +- gcc/testsuite/gcc.dg/pr60784.c| 2 +- 14 files changed, 184 insertions(+), 94 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/missing-designated-initializers-1.C create mode 100644 gcc/testsuite/g++.dg/warn/missing-designated-initializers-2.C create mode 100644 gcc/testsuite/gcc.dg/missing-designated-initializers-1.c create mode 100644 gcc/testsuite/gcc.dg/missing-designated-initializers-2.c diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 15698dc65bb..746adc8aaad 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1030,6 +1030,10 @@ Wmissing-field-initializers C ObjC C++ ObjC++ Var(warn_missing_field_initializers) Warning EnabledBy(Wextra) Warn about missing fields in struct initializers. +Wmissing-designated-initializers +C ObjC C++ ObjC++ Var(warn_missing_designated_initializers) Warning EnabledBy(Wextra) +Warn about missing designated initializers in struct initializers. + Wmissing-format-attribute C ObjC C++ ObjC++ Warning Alias(Wsuggest-attribute=format) ; diff --git a/gcc/c-family/c.opt.urls b/gcc/c-family/c.opt.urls index fd7ffd38d53..88772cd113f 100644 --- a/gcc/c-family/c.opt.urls +++ b/gcc/c-family/c.opt.urls @@ -553,6 +553,9 @@ UrlSuffix(gcc/Warning-Options.html#index-Wmissing-declarations) Wmissing-field-initializers UrlSuffix(gcc/Warning-Options.html#index-Wmissing-field-initializers) +Wmissing-designated-initializers +UrlSuffix(gcc/Warning-Options.html#index-Wmissing-designated-initializers) + Wmissing-format-attribute UrlSuffix(gcc/Warning-Options.html#index-Wmissing-format-attribute) diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index dbb688cabaa..37cc95f4a37 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -10150,31 +10150,33 @@ pop_init_level (location_t loc, int implicit, } /* Warn when some struct elements are implicitly initialized to zero. */ - if (warn_missing_field_initializers - && constructor_type - && TREE_CODE (constructor_type) == RECORD_TYPE - && constructor_unfilled_fields) -{ - /* 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 = DEC
[PING][PATCH v3] Add new warning Wmissing-designated-initializers [PR39589]
Ping https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672568.html
[PING][PATCH v3] Add new warning Wmissing-designated-initializers [PR39589]
Ping https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672568.html Missed the version 15 freeze with the last ping, I believe the project is open for general development again now?
Re: [PING * 3][PATCH v3] Add new warning Wmissing-designated-initializers [PR39589]
Thanks for the review, much appreciated. Agreed on all those points, I'll remove it from -Wextra and just leave it as a standalone warning, and I'll add those tests you suggested. On 02/06/2025 19:08, Joseph Myers wrote: On Sun, 1 Jun 2025, Peter Frost wrote: Ping https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672568.html This needs various coding style fixes. Lines should be broken before binary operators such as && or || rather than after, and there should be a space before '(' in function and macro calls. I don't think this belongs in -Wextra. For example, it's incompatible with the use of designated initializers for any structure in standard headers that has named padding fields - or indeed any structure in standard headers that has some fields that are implementation extensions that are irrelevant to the particular application. I would expect the new tests to include cases of nested structures where the initializations are done in the form ".a.b.c = 1" and similar. Likewise, in the array tests, consider { [0].a = 1, [1].b = 2, [0].b = 3, [0].c = 4 } and similar (this is a case where all of .a, .b, .c are initialized in [0], so there should be no warning for missing initializers in [0] if those are the only struct members, but .a and .c are missing initializers in [1]).
[PING * 3][PATCH v3] Add new warning Wmissing-designated-initializers [PR39589]
Ping https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672568.html