c++: designator and anon struct [PR101767]

We found .x in the anonymous struct, but then didn't find .y there; we
should decide that means we're done with the struct rather than that the
code is wrong.

	PR c++/101767

gcc/cp/ChangeLog:

	* decl.cc (reshape_init_class): Back out of anon struct
	if a designator doesn't match.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/anon-struct10.C: New test.
This commit is contained in:
Jason Merrill 2022-03-18 14:36:19 -04:00
parent 3873e614ef
commit e3e191b410
2 changed files with 26 additions and 0 deletions

View File

@ -6626,6 +6626,11 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p,
return error_mark_node;
}
if (!field && ANON_AGGR_TYPE_P (type))
/* Apparently the designator isn't for a member of this anonymous
struct, so head back to the enclosing class. */
break;
if (!field || TREE_CODE (field) != FIELD_DECL)
{
if (complain & tf_error)

View File

@ -0,0 +1,21 @@
// PR c++/101767
// { dg-do compile { target c++11 } }
// { dg-additional-options "-Wno-pedantic" }
typedef struct {
struct {
int x;
};
union {
int y;
float z;
};
} S;
void foo(void)
{
[[maybe_unused]] S a = {
.x = 1,
.y = 0
};
}