/* 1 if this constructor should have padding bits zeroed (C23 {}. */
static bool constructor_zero_padding_bits;
+/* 1 if this constructor is a braced scalar initializer (further nested levels
+ of braces are an error). */
+static bool constructor_braced_scalar;
+
/* Structure for managing pending initializer elements, organized as an
AVL tree. */
char incremental;
char designated;
bool zero_padding_bits;
+ bool braced_scalar;
int designator_depth;
};
p->incremental = constructor_incremental;
p->designated = constructor_designated;
p->zero_padding_bits = constructor_zero_padding_bits;
+ p->braced_scalar = constructor_braced_scalar;
p->designator_depth = designator_depth;
p->next = 0;
constructor_stack = p;
constructor_designated = 0;
constructor_zero_padding_bits = false;
constructor_zeroinit = 1;
+ constructor_braced_scalar = false;
designator_depth = 0;
designator_erroneous = 0;
/* Handle the case of int x = {5}; */
constructor_fields = constructor_type;
constructor_unfilled_fields = constructor_type;
+ constructor_braced_scalar = true;
}
}
\f
p->incremental = constructor_incremental;
p->designated = constructor_designated;
p->zero_padding_bits = constructor_zero_padding_bits;
+ p->braced_scalar = constructor_braced_scalar;
p->designator_depth = designator_depth;
p->next = constructor_stack;
p->range_stack = 0;
/* If the upper initializer has padding bits zeroed, that includes
all nested initializers as well. */
constructor_zero_padding_bits = p->zero_padding_bits;
+ constructor_braced_scalar = false;
constructor_pending_elts = 0;
if (!implicit)
{
else
{
if (constructor_type != error_mark_node)
- warning_init (input_location, 0, "braces around scalar initializer");
+ {
+ if (p->braced_scalar)
+ permerror_init (input_location, 0,
+ "braces around scalar initializer");
+ else
+ warning_init (input_location, 0,
+ "braces around scalar initializer");
+ constructor_braced_scalar = true;
+ }
constructor_fields = constructor_type;
constructor_unfilled_fields = constructor_type;
}
constructor_incremental = p->incremental;
constructor_designated = p->designated;
constructor_zero_padding_bits = p->zero_padding_bits;
+ constructor_braced_scalar = p->braced_scalar;
designator_depth = p->designator_depth;
constructor_pending_elts = p->pending_elts;
constructor_depth = p->depth;
--- /dev/null
+/* Test invalid initializers that are consistent with the syntax: undefined
+ behavior ("shall" in Semantics not Constraints) before C2y, constraint
+ violation in C2y. Scalar cases; see bug 88642. */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -pedantic-errors" } */
+
+struct s { int a; };
+union u { int a; };
+
+int i1 = { 1, 2 }; /* { dg-error "excess elements in scalar initializer" } */
+int i2 = { { 1 } }; /* { dg-error "braces around scalar initializer" } */
+int i3 = { { 1, } }; /* { dg-error "braces around scalar initializer" } */
+int i4 = { { 1 }, }; /* { dg-error "braces around scalar initializer" } */
+int i5 = { 1, { } }; /* { dg-error "excess elements in scalar initializer" } */
+/* { dg-error "braces around scalar initializer" "braces" { target *-*-* } .-1 } */
+int i6 = { { } }; /* { dg-error "braces around scalar initializer" } */
+int i7 = { { }, }; /* { dg-error "braces around scalar initializer" } */
+int i8 = { { { 1 } } }; /* { dg-error "braces around scalar initializer" } */
+struct s s1 =
+ {
+ { /* { dg-warning "braces around scalar initializer" } */
+ { 1 } /* { dg-error "braces around scalar initializer" } */
+ }
+ };
+union u u1 =
+ {
+ { /* { dg-warning "braces around scalar initializer" } */
+ { 1 } /* { dg-error "braces around scalar initializer" } */
+ }
+ };
+int a1[1] =
+ {
+ { /* { dg-warning "braces around scalar initializer" } */
+ { 1 } /* { dg-error "braces around scalar initializer" } */
+ }
+ };
+int *p1 = &(int) { { 1 } }; /* { dg-error "braces around scalar initializer" } */
+int *p2 = &(int) { { 1, } }; /* { dg-error "braces around scalar initializer" } */
+
+int ok1 = { 1 };
+struct s ok2 = { { 1 } }; /* { dg-warning "braces around scalar initializer" } */
+struct s ok3 = { { 1, } }; /* { dg-warning "braces around scalar initializer" } */
+int *ok4 = &(int) { 1 };
+int *ok5 = &(int) { 1, };
+int ok6[1] = { { 1 } }; /* { dg-warning "braces around scalar initializer" } */
+int ok7[1] = { { 1, } }; /* { dg-warning "braces around scalar initializer" } */
+union u ok8 = { { 1 } }; /* { dg-warning "braces around scalar initializer" } */
+union u ok9 = { { 1, } }; /* { dg-warning "braces around scalar initializer" } */