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:
parent
3873e614ef
commit
e3e191b410
@ -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)
|
||||
|
21
gcc/testsuite/g++.dg/ext/anon-struct10.C
Normal file
21
gcc/testsuite/g++.dg/ext/anon-struct10.C
Normal 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
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue
Block a user