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();
+}

Reply via email to