&& !TYPE_MAX_VALUE (TYPE_DOMAIN (constructor_type)))
{
/* Silently discard empty initializations. The parser will
- already have pedwarned for empty brackets. */
+ already have pedwarned for empty brackets for C17 and earlier. */
if (integer_zerop (constructor_unfilled_index))
constructor_type = NULL_TREE;
- else
+ if (constructor_type || flag_isoc23)
{
- gcc_assert (!TYPE_SIZE (constructor_type));
+ gcc_assert (!constructor_type || !TYPE_SIZE (constructor_type));
- if (constructor_depth > 2)
+ if (constructor_depth <= 2)
+ pedwarn_init (loc, OPT_Wpedantic,
+ "initialization of a flexible array member");
+ else if (constructor_type)
error_init (loc, "initialization of flexible array member "
"in a nested context");
else
pedwarn_init (loc, OPT_Wpedantic,
- "initialization of a flexible array member");
+ "initialization of flexible array member "
+ "in a nested context");
/* We have already issued an error message for the existence
of a flexible array member not at the end of the structure.
Discard the initializer so that we do not die later. */
- if (DECL_CHAIN (constructor_fields) != NULL_TREE
+ if (constructor_type
+ && DECL_CHAIN (constructor_fields) != NULL_TREE
&& (!p->type || TREE_CODE (p->type) != UNION_TYPE))
constructor_type = NULL_TREE;
}
--- /dev/null
+/* PR c/119350 */
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+
+struct S { int a; int b[]; };
+struct T { struct S c; }; /* { dg-error "invalid use of structure with flexible array member" } */
+struct S d = { 1, {} }; /* { dg-error "initialization of a flexible array member" } */
+struct S e = { 1, { 2 } }; /* { dg-error "initialization of a flexible array member" } */
+struct S f = { .a = 1, .b = {} }; /* { dg-error "initialization of a flexible array member" } */
+struct S g = { .a = 1, .b = { 2 } }; /* { dg-error "initialization of a flexible array member" } */
+struct T h = { { 1, {} } }; /* { dg-error "initialization of flexible array member in a nested context" } */
+struct T i = { { 1, { 2 } } }; /* { dg-error "initialization of flexible array member in a nested context" } */
+struct T j = { .c = { .a = 1, .b = {} } }; /* { dg-error "initialization of flexible array member in a nested context" } */
+struct T k = { .c = { .a = 1, .b = { 2 } } }; /* { dg-error "initialization of flexible array member in a nested context" } */
--- /dev/null
+/* PR c/119350 */
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -Wpedantic" } */
+
+struct S { int a; int b[]; };
+struct T { struct S c; }; /* { dg-warning "invalid use of structure with flexible array member" } */
+struct S d = { 1, {} }; /* { dg-warning "initialization of a flexible array member" } */
+struct S e = { 1, { 2 } }; /* { dg-warning "initialization of a flexible array member" } */
+struct S f = { .a = 1, .b = {} }; /* { dg-warning "initialization of a flexible array member" } */
+struct S g = { .a = 1, .b = { 2 } }; /* { dg-warning "initialization of a flexible array member" } */
+struct T h = { { 1, {} } }; /* { dg-warning "initialization of flexible array member in a nested context" } */
+struct T i = { { 1, { 2 } } }; /* { dg-error "initialization of flexible array member in a nested context" } */
+struct T j = { .c = { .a = 1, .b = {} } }; /* { dg-warning "initialization of flexible array member in a nested context" } */
+struct T k = { .c = { .a = 1, .b = { 2 } } }; /* { dg-error "initialization of flexible array member in a nested context" } */
--- /dev/null
+/* PR c/119350 */
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -Wc11-c23-compat" } */
+
+struct S { int a; int b[]; };
+struct T { struct S c; };
+struct S d = { 1, {} }; /* { dg-warning "ISO C forbids empty initializer braces before C23" } */
+struct S e = { 1, { 2 } };
+struct S f = { .a = 1, .b = {} }; /* { dg-warning "ISO C forbids empty initializer braces before C23" } */
+struct S g = { .a = 1, .b = { 2 } };
+struct T h = { { 1, {} } }; /* { dg-warning "ISO C forbids empty initializer braces before C23" } */
+struct T i = { { 1, { 2 } } }; /* { dg-error "initialization of flexible array member in a nested context" } */
+struct T j = { .c = { .a = 1, .b = {} } }; /* { dg-warning "ISO C forbids empty initializer braces before C23" } */
+struct T k = { .c = { .a = 1, .b = { 2 } } }; /* { dg-error "initialization of flexible array member in a nested context" } */