This turned out to be the function version of the previous fix. We
can import an implicit specialization declaration that we need to
instantiate. We must mark the instantiation so we remember to stream
it.
PR c++/99377
gcc/cp/
* pt.c (instantiate_decl): Call set_instantiating_module.
gcc/testsuite/
* g++.dg/modules/pr99377_a.H: New.
* g++.dg/modules/pr99377_b.C: New.
* g++.dg/modules/pr99377_c.C: New.
}
else
{
+ set_instantiating_module (d);
if (variable_template_p (gen_tmpl))
note_variable_template_instantiation (d);
instantiate_body (td, args, d, false);
--- /dev/null
+// PR 99377 failed to stream locally instantiated member
+// link failure in function `Check(Widget<int> const&)':
+// bug_c.ii:(.text._Z5CheckRK6WidgetIiE[_Z5CheckRK6WidgetIiE]+0x14): undefined reference to `Widget<int>::Second() const'
+// { dg-module-do link }
+// { dg-additional-options -fmodule-header }
+// { dg-module-cmi {} }
+template<typename>
+struct Widget
+{
+ Widget (int) { }
+
+ bool First() const { return true; }
+
+ bool Second () const { return true;}
+};
+
+inline void Frob (const Widget<int>& w) noexcept
+{
+ w.First ();
+}
+
--- /dev/null
+// { dg-additional-options -fmodules-ts }
+export module Foo;
+// { dg-module-cmi Foo }
+import "pr99377_a.H";
+
+export inline bool Check (const Widget<int>& w)
+{
+ return w.Second ();
+}
+
--- /dev/null
+// { dg-additional-options -fmodules-ts }
+
+import Foo;
+
+int main ()
+{
+ return Check (0) ? 0 : 1;
+}