https://gcc.gnu.org/g:011ea36d0e5828e9db848f4a46b9a17f634ed2c0
commit r16-611-g011ea36d0e5828e9db848f4a46b9a17f634ed2c0 Author: Nathaniel Shead <nathanielosh...@gmail.com> Date: Sat May 10 01:12:20 2025 +1000 c++/modules: Revert "Remove unnecessary lazy_load_pendings" This reverts commit r16-63-g241157eb0858b3. It turns out that the 'lazy_load_pendings' is necessary if we haven't seen a binding for the given template name at all in the current TU, as it is also used to find template instantiations with the given name. gcc/cp/ChangeLog: * name-lookup.cc (lookup_imported_hidden_friend): Add back lazy_load_pendings with comment. gcc/testsuite/ChangeLog: * g++.dg/modules/tpl-friend-19_a.C: New test. * g++.dg/modules/tpl-friend-19_b.C: New test. Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> Diff: --- gcc/cp/name-lookup.cc | 3 +++ gcc/testsuite/g++.dg/modules/tpl-friend-19_a.C | 16 ++++++++++++++++ gcc/testsuite/g++.dg/modules/tpl-friend-19_b.C | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index 9b317c446690..84b5e673a6d2 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -4556,6 +4556,9 @@ lookup_imported_hidden_friend (tree friend_tmpl) || !DECL_MODULE_ENTITY_P (inner)) return NULL_TREE; + /* Load any templates matching FRIEND_TMPL from importers. */ + lazy_load_pendings (friend_tmpl); + tree name = DECL_NAME (inner); tree *slot = find_namespace_slot (current_namespace, name, false); if (!slot || !*slot || TREE_CODE (*slot) != BINDING_VECTOR) diff --git a/gcc/testsuite/g++.dg/modules/tpl-friend-19_a.C b/gcc/testsuite/g++.dg/modules/tpl-friend-19_a.C new file mode 100644 index 000000000000..59f0175693cf --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/tpl-friend-19_a.C @@ -0,0 +1,16 @@ +// { dg-additional-options "-fmodules -Wno-global-module" } +// { dg-module-cmi M } + +module; + +template <typename _MemFunPtr> +class _Mem_fn_base { + template <typename> friend struct _Bind_check_arity; +}; + +template <typename> struct _Bind_check_arity {}; + +export module M; + +template struct _Bind_check_arity<int>; +export _Mem_fn_base<int> mem_fn(); diff --git a/gcc/testsuite/g++.dg/modules/tpl-friend-19_b.C b/gcc/testsuite/g++.dg/modules/tpl-friend-19_b.C new file mode 100644 index 000000000000..ce99647b9a87 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/tpl-friend-19_b.C @@ -0,0 +1,6 @@ +// { dg-additional-options "-fmodules" } + +import M; +int main() { + mem_fn(); +}