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:
Mark Mitchell 2003-04-29 22:15:34 +00:00 committed by Mark Mitchell
parent 51dc3d74f8
commit 1f6f0cb610
4 changed files with 40 additions and 6 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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

View 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 () {}