Tested on x86_64-pc-linux-gnu (so far just modules.exp), OK for trunk and maybe 15 if full regtest+bootstrap succeeds?
-- >8 -- 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> --- 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(+) create mode 100644 gcc/testsuite/g++.dg/modules/dguide-7_a.C create mode 100644 gcc/testsuite/g++.dg/modules/dguide-7_b.C create mode 100644 gcc/testsuite/g++.dg/modules/dguide-7_c.C diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index a2e0d6d2571..a58614b8459 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -14822,9 +14822,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 00000000000..8d0eb808859 --- /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 00000000000..85246b22dc3 --- /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 00000000000..9579d9d32b3 --- /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; +} -- 2.47.0