diff mbox series

c++: Local instantiations of imported specializations [PR 99377]

Message ID ab30e980-9156-c9e3-e7a1-885766703e40@acm.org
State New
Headers show
Series c++: Local instantiations of imported specializations [PR 99377] | expand

Commit Message

Nathan Sidwell March 5, 2021, 7:55 p.m. UTC
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.
diff mbox series

Patch

diff --git c/gcc/cp/pt.c w/gcc/cp/pt.c
index 8ca3dc8ec2b..1f3cd9c45f1 100644
--- c/gcc/cp/pt.c
+++ w/gcc/cp/pt.c
@@ -26154,6 +26154,7 @@  instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
     }
   else
     {
+      set_instantiating_module (d);
       if (variable_template_p (gen_tmpl))
 	note_variable_template_instantiation (d);
       instantiate_body (td, args, d, false);
diff --git c/gcc/testsuite/g++.dg/modules/pr99377_a.H w/gcc/testsuite/g++.dg/modules/pr99377_a.H
new file mode 100644
index 00000000000..b5e5a3fea54
--- /dev/null
+++ w/gcc/testsuite/g++.dg/modules/pr99377_a.H
@@ -0,0 +1,21 @@ 
+// 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 ();
+}
+
diff --git c/gcc/testsuite/g++.dg/modules/pr99377_b.C w/gcc/testsuite/g++.dg/modules/pr99377_b.C
new file mode 100644
index 00000000000..77826379fc7
--- /dev/null
+++ w/gcc/testsuite/g++.dg/modules/pr99377_b.C
@@ -0,0 +1,10 @@ 
+// { 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 ();
+}
+
diff --git c/gcc/testsuite/g++.dg/modules/pr99377_c.C w/gcc/testsuite/g++.dg/modules/pr99377_c.C
new file mode 100644
index 00000000000..287388fa6dd
--- /dev/null
+++ w/gcc/testsuite/g++.dg/modules/pr99377_c.C
@@ -0,0 +1,8 @@ 
+// { dg-additional-options -fmodules-ts }
+
+import Foo;
+
+int main ()
+{
+  return Check (0) ? 0 : 1;
+}