]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: Revert "Remove unnecessary lazy_load_pendings"
authorNathaniel Shead <nathanieloshead@gmail.com>
Fri, 9 May 2025 15:12:20 +0000 (01:12 +1000)
committerNathaniel Shead <nathanieloshead@gmail.com>
Wed, 14 May 2025 09:26:24 +0000 (19:26 +1000)
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 <nathanieloshead@gmail.com>
gcc/cp/name-lookup.cc
gcc/testsuite/g++.dg/modules/tpl-friend-19_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/tpl-friend-19_b.C [new file with mode: 0644]

index 9b317c4466907e3f849fab14246b3d3125bf4967..84b5e673a6d29fad7463838700d981c8d5544b8b 100644 (file)
@@ -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 (file)
index 0000000..59f0175
--- /dev/null
@@ -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 (file)
index 0000000..ce99647
--- /dev/null
@@ -0,0 +1,6 @@
+// { dg-additional-options "-fmodules" }
+
+import M;
+int main() {
+  mem_fn();
+}