From 6b1a99c3e2cf0fb858ad42b19c6834f7593f091d Mon Sep 17 00:00:00 2001 From: Nathaniel Shead Date: Thu, 8 May 2025 23:06:13 +1000 Subject: [PATCH] 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 Reviewed-by: Jason Merrill --- 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(-) create mode 100644 gcc/testsuite/g++.dg/modules/clone-4_a.C create mode 100644 gcc/testsuite/g++.dg/modules/clone-4_b.C diff --git a/gcc/cp/optimize.cc b/gcc/cp/optimize.cc index 8429d856728..e8e707516d6 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 00000000000..bd74f588c7e --- /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 struct __shared_ptr { + inline __shared_ptr() { foo(); } +}; + +template class __shared_ptr; 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 00000000000..0487dc2e395 --- /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 s1; + __shared_ptr s2; +} + +// { dg-final { scan-assembler-not {_ZNW1M12__shared_ptrIiEC[1-4]Ev:} { xfail *-*-* } } } +// { dg-final { scan-assembler {_ZNW1M12__shared_ptrIdEC2Ev:} } } -- 2.47.2