diff options
Diffstat (limited to 'packages/gcc/11.2.0/0012-c-designator-and-anon-struct-PR101767.patch')
-rw-r--r-- | packages/gcc/11.2.0/0012-c-designator-and-anon-struct-PR101767.patch | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/packages/gcc/11.2.0/0012-c-designator-and-anon-struct-PR101767.patch b/packages/gcc/11.2.0/0012-c-designator-and-anon-struct-PR101767.patch new file mode 100644 index 00000000..65f3237e --- /dev/null +++ b/packages/gcc/11.2.0/0012-c-designator-and-anon-struct-PR101767.patch @@ -0,0 +1,71 @@ +From b94c95fc1199bfa2c7ab577921b07ef545976cac Mon Sep 17 00:00:00 2001 +From: Jason Merrill <jason@redhat.com> +Date: Fri, 18 Mar 2022 14:36:19 -0400 +Subject: 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.c (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. +--- + gcc/cp/decl.c | 5 +++++ + gcc/testsuite/g++.dg/ext/anon-struct10.C | 21 +++++++++++++++++++++ + 2 files changed, 26 insertions(+) + create mode 100644 gcc/testsuite/g++.dg/ext/anon-struct10.C + +diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c +index 41094c891fc..6d3e764fb14 100644 +--- a/gcc/cp/decl.c ++++ b/gcc/cp/decl.c +@@ -6437,6 +6437,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 00000000000..9b01bf3fada +--- /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 ++ }; ++} +-- +2.31.1 + |