https://gcc.gnu.org/g:6b1a99c3e2cf0fb858ad42b19c6834f7593f091d

commit r14-11775-g6b1a99c3e2cf0fb858ad42b19c6834f7593f091d
Author: Nathaniel Shead <nathanielosh...@gmail.com>
Date:   Thu May 8 23:06:13 2025 +1000

    c++/modules: Fix handling of -fdeclone-ctor-dtor with explicit 
instantiations [PR120125]
    
    The attached testcase ICEs in maybe_thunk_body because we haven't
    created a node in the cgraph for an imported explicit instantiation yet.
    
    We in fact really shouldn't be emitting calls at all, since an imported
    explicit instantiation always exists in the TU we imported it from.  But
    the required logic for that doesn't exist in this branch, so we'll just
    xfail the relevant check.
    
            PR c++/120125
    
    gcc/cp/ChangeLog:
    
            * optimize.cc (maybe_thunk_body): Don't assume 'fn' has a cgraph
            node created.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/modules/clone-4_a.C: New test.
            * g++.dg/modules/clone-4_b.C: New test.
    
    Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
    Reviewed-by: Jason Merrill <ja...@redhat.com>

Diff:
---
 gcc/cp/optimize.cc                       |  4 ++--
 gcc/testsuite/g++.dg/modules/clone-4_a.C | 12 ++++++++++++
 gcc/testsuite/g++.dg/modules/clone-4_b.C | 12 ++++++++++++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/optimize.cc b/gcc/cp/optimize.cc
index 8429d856728f..e8e707516d60 100644
--- a/gcc/cp/optimize.cc
+++ b/gcc/cp/optimize.cc
@@ -309,8 +309,8 @@ maybe_thunk_body (tree fn, bool force)
       defer_mangling_aliases = save_defer_mangling_aliases;
       cgraph_node::get_create (fns[0])->set_comdat_group (comdat_group);
       cgraph_node::get_create (fns[1])->add_to_same_comdat_group
-       (cgraph_node::get_create (fns[0]));
-      symtab_node::get (fn)->add_to_same_comdat_group
+       (cgraph_node::get (fns[0]));
+      symtab_node::get_create (fn)->add_to_same_comdat_group
        (symtab_node::get (fns[0]));
       if (fns[2])
        /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
diff --git a/gcc/testsuite/g++.dg/modules/clone-4_a.C 
b/gcc/testsuite/g++.dg/modules/clone-4_a.C
new file mode 100644
index 000000000000..bd74f588c7ec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/clone-4_a.C
@@ -0,0 +1,12 @@
+// PR c++/120125
+// { dg-additional-options "-fmodules-ts -fdeclone-ctor-dtor" }
+// { dg-module-cmi M }
+
+export module M;
+
+void foo();
+export template <typename _Tp> struct __shared_ptr {
+  inline __shared_ptr() { foo(); }
+};
+
+template class __shared_ptr<int>;
diff --git a/gcc/testsuite/g++.dg/modules/clone-4_b.C 
b/gcc/testsuite/g++.dg/modules/clone-4_b.C
new file mode 100644
index 000000000000..0487dc2e3957
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/clone-4_b.C
@@ -0,0 +1,12 @@
+// PR c++/120125
+// { dg-additional-options "-fmodules-ts -fdeclone-ctor-dtor" }
+
+import M;
+
+int main() {
+  __shared_ptr<int> s1;
+  __shared_ptr<double> s2;
+}
+
+// { dg-final { scan-assembler-not {_ZNW1M12__shared_ptrIiEC[1-4]Ev:} { xfail 
*-*-* } } }
+// { dg-final { scan-assembler {_ZNW1M12__shared_ptrIdEC2Ev:} } }

Reply via email to