]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Local instantiations of imported specializations [PR 99377]
authorNathan Sidwell <nathan@acm.org>
Fri, 5 Mar 2021 18:34:23 +0000 (10:34 -0800)
committerNathan Sidwell <nathan@acm.org>
Fri, 5 Mar 2021 19:54:57 +0000 (11:54 -0800)
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.

gcc/cp/pt.c
gcc/testsuite/g++.dg/modules/pr99377_a.H [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr99377_b.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr99377_c.C [new file with mode: 0644]

index 8ca3dc8ec2bfe8eba163d7e15e3375f49f0f9a26..1f3cd9c45f16e197afec0cc832b49bc41cca1cdc 100644 (file)
@@ -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 a/gcc/testsuite/g++.dg/modules/pr99377_a.H b/gcc/testsuite/g++.dg/modules/pr99377_a.H
new file mode 100644 (file)
index 0000000..b5e5a3f
--- /dev/null
@@ -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 a/gcc/testsuite/g++.dg/modules/pr99377_b.C b/gcc/testsuite/g++.dg/modules/pr99377_b.C
new file mode 100644 (file)
index 0000000..7782637
--- /dev/null
@@ -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 a/gcc/testsuite/g++.dg/modules/pr99377_c.C b/gcc/testsuite/g++.dg/modules/pr99377_c.C
new file mode 100644 (file)
index 0000000..287388f
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-additional-options -fmodules-ts }
+
+import Foo;
+
+int main ()
+{
+  return Check (0) ? 0 : 1;
+}