aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2022-03-18 14:36:19 -0400
committerJason Merrill <jason@redhat.com>2022-03-21 16:46:31 -0400
commite3e191b4104c7d6a177f66dbb77cabf05ab63781 (patch)
treee68af1e50db30c91671c5585ac5e8d59f09b2904
parent3873e614ef295b9fc8b3a1fc536d29d0c3fe37c0 (diff)
downloadgcc-e3e191b4104c7d6a177f66dbb77cabf05ab63781.zip
gcc-e3e191b4104c7d6a177f66dbb77cabf05ab63781.tar.gz
gcc-e3e191b4104c7d6a177f66dbb77cabf05ab63781.tar.bz2
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.
-rw-r--r--gcc/cp/decl.cc5
-rw-r--r--gcc/testsuite/g++.dg/ext/anon-struct10.C21
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 8afda826..375385e 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -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)
diff --git a/gcc/testsuite/g++.dg/ext/anon-struct10.C b/gcc/testsuite/g++.dg/ext/anon-struct10.C
new file mode 100644
index 0000000..9b01bf3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/anon-struct10.C
@@ -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
+ };
+}