diff options
author | Nathaniel Shead <nathanieloshead@gmail.com> | 2025-04-30 23:35:51 +1000 |
---|---|---|
committer | Nathaniel Shead <nathanieloshead@gmail.com> | 2025-05-01 13:38:01 +1000 |
commit | 90484ea24e7886f01200619a55c2343728362fc6 (patch) | |
tree | 992aa152888e8bf02573dd56f88a2ac34c661d81 | |
parent | aa49bb9deb7e040679f184009f38c5027f1a8dc4 (diff) | |
download | gcc-90484ea24e7886f01200619a55c2343728362fc6.zip gcc-90484ea24e7886f01200619a55c2343728362fc6.tar.gz gcc-90484ea24e7886f01200619a55c2343728362fc6.tar.bz2 |
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 <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
(cherry picked from commit fb4583566afdee50aad12e1219610813b44bdff4)
-rw-r--r-- | gcc/cp/module.cc | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/modules/dguide-7_a.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/modules/dguide-7_b.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/modules/dguide-7_c.C | 12 |
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 7e3b24e..f562bf8 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 0000000..8d0eb80 --- /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 0000000..85246b2 --- /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 0000000..9579d9d --- /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; +} |