[PATCH] Add new warning Wmissing-designated-initializers [PR39589]

2024-08-26 Thread Peter Frost
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]

2024-09-07 Thread Peter Frost

Ping https://gcc.gnu.org/pipermail/gcc-patches/2024-August/661510.html



[PATCH v2] Add new warning Wmissing-designated-initializers [PR39589]

2024-09-07 Thread Peter Frost
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]

2024-10-06 Thread Peter Frost

Ping https://gcc.gnu.org/pipermail/gcc-patches/2024-September/662590.html


[PING #3][PATCH v2] Add new warning Wmissing-designated-initializers [PR39589]

2024-11-14 Thread Peter Frost

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]

2025-01-03 Thread Peter Frost
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]

2025-02-05 Thread Peter Frost

Ping https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672568.html



[PING][PATCH v3] Add new warning Wmissing-designated-initializers [PR39589]

2025-04-25 Thread Peter Frost

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]

2025-06-05 Thread Peter Frost
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]

2025-06-01 Thread Peter Frost

Ping https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672568.html