]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: Fix handling of -fdeclone-ctor-dtor with explicit instantiations [PR120125]
authorNathaniel Shead <nathanieloshead@gmail.com>
Thu, 8 May 2025 13:06:13 +0000 (23:06 +1000)
committerNathaniel Shead <nathanieloshead@gmail.com>
Wed, 14 May 2025 09:42:43 +0000 (19:42 +1000)
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 <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/optimize.cc
gcc/testsuite/g++.dg/modules/clone-4_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/clone-4_b.C [new file with mode: 0644]

index 8429d856728f75a42c220681708e80fd9af911c6..e8e707516d60f6279da5ced5f0ce7b63dcf3eb9a 100644 (file)
@@ -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 (file)
index 0000000..bd74f58
--- /dev/null
@@ -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 (file)
index 0000000..0487dc2
--- /dev/null
@@ -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:} } }