@@ -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)
;
@@ -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 (
+ input_location, OPT_Wmissing_designated_initializers,
+ "missing designated initializer for field %qD of %qT",
+ constructor_unfilled_fields, constructor_type))
+ inform (DECL_SOURCE_LOCATION (constructor_unfilled_fields),
"%qD declared here", constructor_unfilled_fields);
- }
- }
+ }
+ }
+ }
/* Pad out the end of the structure. */
if (p->replacement_value.value)
@@ -1822,8 +1822,14 @@ process_init_constructor_record (tree type, tree init, int nested, int flags,
if ((complain & tf_warning)
&& !cp_unevaluated_operand
&& !EMPTY_CONSTRUCTOR_P (init))
- warning (OPT_Wmissing_field_initializers,
- "missing initializer for member %qD", field);
+ {
+ if (CONSTRUCTOR_IS_DESIGNATED_INIT (init))
+ warning (OPT_Wmissing_designated_initializers,
+ "missing designated initializer for member %qD", field);
+ else
+ warning (OPT_Wmissing_field_initializers,
+ "missing initializer for member %qD", field);
+ }
}
else
{
@@ -1853,8 +1859,14 @@ process_init_constructor_record (tree type, tree init, int nested, int flags,
&& !cp_unevaluated_operand
&& !EMPTY_CONSTRUCTOR_P (init)
&& !is_really_empty_class (fldtype, /*ignore_vptr*/false))
- warning (OPT_Wmissing_field_initializers,
- "missing initializer for member %qD", field);
+ {
+ if (CONSTRUCTOR_IS_DESIGNATED_INIT (init))
+ warning (OPT_Wmissing_designated_initializers,
+ "missing designated initializer for member %qD", field);
+ else
+ warning (OPT_Wmissing_field_initializers,
+ "missing initializer for member %qD", field);
+ }
if (!zero_init_p (fldtype) || skipped < 0)
{
@@ -1,6 +1,6 @@
// PR c++/110745
// { dg-do compile { target c++17 } }
-// { dg-options "-Wmissing-field-initializers" }
+// { dg-options "-Wmissing-designated-initializers" }
struct B { int i; };
struct D : B {
@@ -11,6 +11,6 @@ struct D : B {
int
main ()
{
- D d = {.x=1, .y=2}; // { dg-warning "missing initializer for member .D::B." }
+ D d = {.x=1, .y=2}; // { dg-warning "missing designated initializer for member .D::B." }
(void)d;
}
new file mode 100644
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-Wextra -Wmissing-designated-initializers" } */
+
+struct s { int a, b, c; };
+struct s s1 = { .a = 1, .b = 2, .c = 3 };
+struct s s2 = { .a = 1, .b = 2 }; /* { dg-warning "missing designated initializer" } */
+struct s s3 = { .a = 1 }; /* { dg-warning "missing designated initializer" } */
+
+struct s s6[] = { { .a = 1, .b = 2, .c = 3 }, { .a = 4 } }; /* { dg-warning "missing designated initializer" } */
+struct s s7[] = { { .a = 1 }, { .a = 2, .b = 3, .c = 4 } }; /* { dg-warning "missing designated initializer" } */
+struct s s8[] = { { 1, 2, 3 }, { .a = 4 } }; /* { dg-warning "missing designated initializer" } */
new file mode 100644
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-Wextra -Wno-missing-designated-initializers" } */
+
+struct s { int a, b, c; };
+struct s s1 = { .a = 1, .b = 2, .c = 3 };
+struct s s2 = { .a = 1, .b = 2 }; /* { dg-bogus "missing designated initializer" } */
+struct s s3 = { .a = 1 }; /* { dg-bogus "missing designated initializer" } */
+
+struct s s6[] = { { .a = 1, .b = 2, .c = 3 }, { .a = 4 } }; /* { dg-bogus "missing designated initializer" } */
+struct s s7[] = { { .a = 1 }, { .a = 2, .b = 3, .c = 4 } }; /* { dg-bogus "missing designated initializer" } */
+struct s s8[] = { { 1, 2, 3 }, { .a = 4 } }; /* { dg-bogus "missing designated initializer" } */
@@ -29,7 +29,7 @@ struct multilevel
struct t T0 = { 1 }; /* { dg-warning "missing init" } */
-struct t T1 = { .a = 1 }; /* { dg-bogus "(missing|near) init" } */
+struct t T1 = { .a = 1 }; /* { dg-warning "missing designated initializer" } */
union u U0 = { 1 }; /* { dg-warning "initialization of union" } */
union u U1 = { .i = 1 }; /* { dg-bogus "initialization of union" } */
@@ -37,7 +37,7 @@ union u U1 = { .i = 1 }; /* { dg-bogus "initialization of union" } */
struct multilevel M =
{
12,
- { .b = 3 }, /* { dg-bogus "missing init" } */
+ { .b = 3 }, /* { dg-warning "missing designated initializer" } */
{ 4 }, /* { dg-warning "initialization of union" } */
{ .n = 9 }, /* { dg-bogus "initialization of union" } */
/* "string here" */
new file mode 100644
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wextra -Wmissing-designated-initializers" } */
+
+struct s { int a, b, c; };
+struct s s1 = { .a = 1, .b = 2, .c = 3 };
+struct s s2 = { .a = 1, .b = 2 }; /* { dg-warning "missing designated initializer" } */
+struct s s3 = { .a = 1 }; /* { dg-warning "missing designated initializer" } */
+struct s s4 = { .a = 1, 2 }; /* { dg-warning "missing designated initializer" } */
+struct s s5 = { .a = 1, 2, 3 }; /* { dg-bogus "missing designated initializer" } */
+
+struct s s6[] = { { .a = 1, .b = 2, .c = 3 }, { .a = 4 } }; /* { dg-warning "missing designated initializer" } */
+struct s s7[] = { { .a = 1 }, { .a = 2, .b = 3, .c = 4 } }; /* { dg-warning "missing designated initializer" } */
+struct s s8[] = { { 1, 2, 3 }, { .a = 4 } }; /* { dg-warning "missing designated initializer" } */
new file mode 100644
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wextra -Wno-missing-designated-initializers" } */
+
+struct s { int a, b, c; };
+struct s s1 = { .a = 1, .b = 2, .c = 3 };
+struct s s2 = { .a = 1, .b = 2 }; /* { dg-bogus "missing designated initializer" } */
+struct s s3 = { .a = 1 }; /* { dg-bogus "missing designated initializer" } */
+struct s s4 = { .a = 1, 2 }; /* { dg-bogus "missing designated initializer" } */
+struct s s5 = { .a = 1, 2, 3 }; /* { dg-bogus "missing designated initializer" } */
+
+struct s s6[] = { { .a = 1, .b = 2, .c = 3 }, { .a = 4 } }; /* { dg-bogus "missing designated initializer" } */
+struct s s7[] = { { .a = 1 }, { .a = 2, .b = 3, .c = 4 } }; /* { dg-bogus "missing designated initializer" } */
+struct s s8[] = { { 1, 2, 3 }, { .a = 4 } }; /* { dg-bogus "missing designated initializer" } */
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-Wextra -Wno-missing-field-initializers -std=c99" } */
+/* { dg-options "-Wextra -Wno-missing-field-initializers -Wno-missing-designated-initializers -std=c99" } */
struct s { int a, b, c; };
struct s s1 = { 1, 2, 3 };
@@ -1,6 +1,6 @@
/* PR c/60784 */
/* { dg-do compile } */
-/* { dg-options "-Wextra -std=c99" } */
+/* { dg-options "-Wextra -Wno-missing-designated-initializers -std=c99" } */
struct A { int i, j; };
struct B { struct A a; } b1 = { .a.i = 1, .a.j = 1 };