public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6779] c++: designator for base class member [PR101405]
@ 2022-01-20 20:24 Jason Merrill
0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2022-01-20 20:24 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:cc01cd9397fe99e707bcc5b98bb33d807ba610d7
commit r12-6779-gcc01cd9397fe99e707bcc5b98bb33d807ba610d7
Author: Jason Merrill <jason@redhat.com>
Date: Thu Jan 20 09:18:45 2022 -0500
c++: designator for base class member [PR101405]
A C++20 designator must name a direct non-static member of the class; in
this case it names a member of a base class, and we should give an error
instead of crashing.
PR c++/101405
gcc/cp/ChangeLog:
* decl.cc (reshape_init_class): Reject designator for a member of
another class.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/desig20.C: New test.
Diff:
---
gcc/cp/decl.cc | 14 ++++++++++----
gcc/testsuite/g++.dg/cpp2a/desig20.C | 20 ++++++++++++++++++++
2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 1cbe9a34be0..8e5421848d1 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -6569,16 +6569,22 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p,
tree ictx = DECL_CONTEXT (field);
if (!same_type_ignoring_top_level_qualifiers_p (ictx, type))
{
- gcc_assert (ANON_AGGR_TYPE_P (ictx));
/* Find the anon aggr that is a direct member of TYPE. */
- while (true)
+ while (ANON_AGGR_TYPE_P (ictx))
{
tree cctx = TYPE_CONTEXT (ictx);
if (same_type_ignoring_top_level_qualifiers_p (cctx, type))
- break;
+ goto found;
ictx = cctx;
}
- /* And then the TYPE member with that anon aggr type. */
+
+ /* Not found, e.g. FIELD is a member of a base class. */
+ if (complain & tf_error)
+ error ("%qD is not a direct member of %qT", field, type);
+ return error_mark_node;
+
+ found:
+ /* Now find the TYPE member with that anon aggr type. */
tree aafield = TYPE_FIELDS (type);
for (; aafield; aafield = TREE_CHAIN (aafield))
if (TREE_TYPE (aafield) == ictx)
diff --git a/gcc/testsuite/g++.dg/cpp2a/desig20.C b/gcc/testsuite/g++.dg/cpp2a/desig20.C
new file mode 100644
index 00000000000..0ceda7ccabd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/desig20.C
@@ -0,0 +1,20 @@
+// PR c++/101405
+// { dg-do compile { target c++20 } }
+
+struct A {
+ int const a = 1;
+ int const b = 2;
+};
+
+struct B : A {
+ using A::a;
+ using A::b;
+ int const c = 3;
+ int const d = 4;
+};
+
+int main()
+{
+ [[maybe_unused]] B b =
+ { .a = 10, .d = 42 }; // { dg-error "not a direct member" }
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-01-20 20:24 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-20 20:24 [gcc r12-6779] c++: designator for base class member [PR101405] Jason Merrill
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).