https://gcc.gnu.org/g:fb4583566afdee50aad12e1219610813b44bdff4
commit r16-319-gfb4583566afdee50aad12e1219610813b44bdff4 Author: Nathaniel Shead <nathanielosh...@gmail.com> Date: Wed Apr 30 23:35:51 2025 +1000 c++/modules: Ensure deduction guides for imported types are reachable [PR120023] In the linked PR, because the deduction guides depend on an imported type, we never walk the type and so never call add_deduction_guides. This patch ensures that we make bindings for deduction guides if we saw any deduction guide at all. PR c++/120023 gcc/cp/ChangeLog: * module.cc (depset::hash::find_dependencies): Also call add_deduction_guides when walking one. gcc/testsuite/ChangeLog: * g++.dg/modules/dguide-7_a.C: New test. * g++.dg/modules/dguide-7_b.C: New test. * g++.dg/modules/dguide-7_c.C: New test. Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> Reviewed-by: Jason Merrill <ja...@redhat.com> Diff: --- gcc/cp/module.cc | 7 +++++++ gcc/testsuite/g++.dg/modules/dguide-7_a.C | 9 +++++++++ gcc/testsuite/g++.dg/modules/dguide-7_b.C | 10 ++++++++++ gcc/testsuite/g++.dg/modules/dguide-7_c.C | 12 ++++++++++++ 4 files changed, 38 insertions(+) diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 7e3b24e2e42e..f562bf8cd915 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -14823,9 +14823,16 @@ depset::hash::find_dependencies (module_state *module) } walker.end (); + /* If we see either a class template or a deduction guide, make + sure to add all visible deduction guides. We need to check + both in case they have been added in separate modules, or + one is in the GMF and would have otherwise been discarded. */ if (!is_key_order () && DECL_CLASS_TEMPLATE_P (decl)) add_deduction_guides (decl); + if (!is_key_order () + && deduction_guide_p (decl)) + add_deduction_guides (TYPE_NAME (TREE_TYPE (TREE_TYPE (decl)))); if (!is_key_order () && TREE_CODE (decl) == TEMPLATE_DECL diff --git a/gcc/testsuite/g++.dg/modules/dguide-7_a.C b/gcc/testsuite/g++.dg/modules/dguide-7_a.C new file mode 100644 index 000000000000..8d0eb8088596 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/dguide-7_a.C @@ -0,0 +1,9 @@ +// PR c++/120023 +// { dg-additional-options "-fmodules" } +// { dg-module-cmi M.S } + +export module M.S; + +namespace ns { + export template <typename T> struct S; +} diff --git a/gcc/testsuite/g++.dg/modules/dguide-7_b.C b/gcc/testsuite/g++.dg/modules/dguide-7_b.C new file mode 100644 index 000000000000..85246b22dc34 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/dguide-7_b.C @@ -0,0 +1,10 @@ +// PR c++/120023 +// { dg-additional-options "-fmodules" } +// { dg-module-cmi M.D } + +export module M.D; +import M.S; + +namespace ns { + S(int) -> S<int>; +} diff --git a/gcc/testsuite/g++.dg/modules/dguide-7_c.C b/gcc/testsuite/g++.dg/modules/dguide-7_c.C new file mode 100644 index 000000000000..9579d9d32b31 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/dguide-7_c.C @@ -0,0 +1,12 @@ +// PR c++/120023 +// { dg-additional-options "-fmodules" } + +import M.S; +import M.D; + +template <> struct ns::S<int> { S(int) {} }; + +int main() { + ns::S s(123); + ns::S<int> s2 = s; +}