public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Jason Merrill <jason@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r13-6582] c++: class NTTP and nested anon union [PR108566]
Date: Fri, 10 Mar 2023 13:54:40 +0000 (GMT)	[thread overview]
Message-ID: <20230310135440.DAF293858414@sourceware.org> (raw)

https://gcc.gnu.org/g:e1c8cf9006bd278e969ab7ed35178067ce128f32

commit r13-6582-ge1c8cf9006bd278e969ab7ed35178067ce128f32
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Mar 9 23:33:43 2023 -0500

    c++: class NTTP and nested anon union [PR108566]
    
    We were failing to come up with the name for the anonymous union.  It seems
    like unfortunate redundancy, but the ABI does say that the name of an
    anonymous union is its first named member.
    
            PR c++/108566
    
    gcc/cp/ChangeLog:
    
            * mangle.cc (anon_aggr_naming_decl): New.
            (write_unqualified_name): Use it.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/abi/anon6.C: New test.

Diff:
---
 gcc/cp/mangle.cc                 | 27 ++++++++++++++++++++++++++-
 gcc/testsuite/g++.dg/abi/anon6.C | 19 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
index 242b3f31cba..a235f23459d 100644
--- a/gcc/cp/mangle.cc
+++ b/gcc/cp/mangle.cc
@@ -1389,6 +1389,28 @@ find_decomp_unqualified_name (tree decl, size_t *len)
   return p;
 }
 
+/* "For the purposes of mangling, the name of an anonymous union is considered
+   to be the name of the first named data member found by a pre-order,
+   depth-first, declaration-order walk of the data members of the anonymous
+   union. If there is no such data member (i.e., if all of the data members in
+   the union are unnamed), then there is no way for a program to refer to the
+   anonymous union, and there is therefore no need to mangle its name."  */
+
+static tree
+anon_aggr_naming_decl (tree type)
+{
+  tree field = next_aggregate_field (TYPE_FIELDS (type));
+  for (; field; field = next_aggregate_field (DECL_CHAIN (field)))
+    {
+      if (DECL_NAME (field))
+	return field;
+      if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
+	if (tree sub = anon_aggr_naming_decl (TREE_TYPE (field)))
+	  return sub;
+    }
+  return NULL_TREE;
+}
+
 /* We don't need to handle thunks, vtables, or VTTs here.  Those are
    mangled through special entry points.
 
@@ -1432,7 +1454,10 @@ write_unqualified_name (tree decl)
 
   bool found = false;
 
-  if (DECL_NAME (decl) == NULL_TREE)
+  if (DECL_NAME (decl) == NULL_TREE
+      && ANON_AGGR_TYPE_P (TREE_TYPE (decl)))
+    decl = anon_aggr_naming_decl (TREE_TYPE (decl));
+  else if (DECL_NAME (decl) == NULL_TREE)
     {
       found = true;
       gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
diff --git a/gcc/testsuite/g++.dg/abi/anon6.C b/gcc/testsuite/g++.dg/abi/anon6.C
new file mode 100644
index 00000000000..7be0b0bbdb7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/anon6.C
@@ -0,0 +1,19 @@
+// PR c++/108566
+// { dg-do compile { target c++20 } }
+
+template<typename T>
+struct wrapper1 {
+  union {
+    union {
+      T RightName;
+    };
+  };
+};
+
+template<auto tparam> void dummy(){}
+
+void uses() {
+  dummy<wrapper1<double>{123.0}>();
+}
+
+// { dg-final { scan-assembler "_Z5dummyIXtl8wrapper1IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_Edi9RightNameLd405ec00000000000EEEEEEvv" } }

                 reply	other threads:[~2023-03-10 13:54 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230310135440.DAF293858414@sourceware.org \
    --to=jason@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).