mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-10 14:27:26 +08:00
re PR c++/10551 (Failure to emit explicitly instantiated template w/--no-implicit-templates)
PR c++/10551 * pt.c (mark_decl_instantiated): Defer all explicit instantiations that have not yet been written out. PR c++/10551 * g++.dg/template/explicit1.C: New test. From-SVN: r66263
This commit is contained in:
parent
51dc3d74f8
commit
1f6f0cb610
@ -1,3 +1,9 @@
|
||||
2003-04-29 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/10551
|
||||
* pt.c (mark_decl_instantiated): Defer all explicit instantiations
|
||||
that have not yet been written out.
|
||||
|
||||
2003-04-29 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/10549
|
||||
|
18
gcc/cp/pt.c
18
gcc/cp/pt.c
@ -9915,11 +9915,6 @@ mark_decl_instantiated (result, extern_p)
|
||||
tree result;
|
||||
int extern_p;
|
||||
{
|
||||
if (TREE_CODE (result) != FUNCTION_DECL)
|
||||
/* The TREE_PUBLIC flag for function declarations will have been
|
||||
set correctly by tsubst. */
|
||||
TREE_PUBLIC (result) = 1;
|
||||
|
||||
/* We used to set this unconditionally; we moved that to
|
||||
do_decl_instantiation so it wouldn't get set on members of
|
||||
explicit class template instantiations. But we still need to set
|
||||
@ -9928,6 +9923,16 @@ mark_decl_instantiated (result, extern_p)
|
||||
if (extern_p)
|
||||
SET_DECL_EXPLICIT_INSTANTIATION (result);
|
||||
|
||||
/* If this entity has already been written out, it's too late to
|
||||
make any modifications. */
|
||||
if (TREE_ASM_WRITTEN (result))
|
||||
return;
|
||||
|
||||
if (TREE_CODE (result) != FUNCTION_DECL)
|
||||
/* The TREE_PUBLIC flag for function declarations will have been
|
||||
set correctly by tsubst. */
|
||||
TREE_PUBLIC (result) = 1;
|
||||
|
||||
if (! extern_p)
|
||||
{
|
||||
DECL_INTERFACE_KNOWN (result) = 1;
|
||||
@ -9941,7 +9946,8 @@ mark_decl_instantiated (result, extern_p)
|
||||
else if (TREE_PUBLIC (result))
|
||||
maybe_make_one_only (result);
|
||||
}
|
||||
else if (TREE_CODE (result) == FUNCTION_DECL)
|
||||
|
||||
if (TREE_CODE (result) == FUNCTION_DECL)
|
||||
defer_fn (result);
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2003-04-29 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/10551
|
||||
* g++.dg/template/explicit1.C: New test.
|
||||
|
||||
2003-04-29 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/10549
|
||||
|
17
gcc/testsuite/g++.dg/template/explicit1.C
Normal file
17
gcc/testsuite/g++.dg/template/explicit1.C
Normal file
@ -0,0 +1,17 @@
|
||||
// { dg-do link }
|
||||
// { dg-options "-fno-implicit-templates" }
|
||||
|
||||
template <class T> struct C {
|
||||
~C();
|
||||
};
|
||||
template <class T> C<T>::~C() {}
|
||||
|
||||
struct X {
|
||||
C<X> *p;
|
||||
~X() { delete p; }
|
||||
};
|
||||
|
||||
template class C<X>;
|
||||
C<X> x;
|
||||
|
||||
int main () {}
|
Loading…
Reference in New Issue
Block a user