mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 15:11:20 +08:00
c++: Local instantiations of imported specializations [PR 99377]
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.
This commit is contained in:
parent
3d9577c254
commit
1e5cdb9f89
gcc
@ -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);
|
||||
|
21
gcc/testsuite/g++.dg/modules/pr99377_a.H
Normal file
21
gcc/testsuite/g++.dg/modules/pr99377_a.H
Normal file
@ -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 ();
|
||||
}
|
||||
|
10
gcc/testsuite/g++.dg/modules/pr99377_b.C
Normal file
10
gcc/testsuite/g++.dg/modules/pr99377_b.C
Normal file
@ -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 ();
|
||||
}
|
||||
|
8
gcc/testsuite/g++.dg/modules/pr99377_c.C
Normal file
8
gcc/testsuite/g++.dg/modules/pr99377_c.C
Normal file
@ -0,0 +1,8 @@
|
||||
// { dg-additional-options -fmodules-ts }
|
||||
|
||||
import Foo;
|
||||
|
||||
int main ()
|
||||
{
|
||||
return Check (0) ? 0 : 1;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user