pt.c (instantiate_decl): Tell the repository code about the clones, not the cloned functions.

* pt.c (instantiate_decl): Tell the repository code about the
	clones, not the cloned functions.
	* repo.c (repo_template_used): Explicitly instantiate the cloned
	function, not the clones.

From-SVN: r42931
This commit is contained in:
Mark Mitchell 2001-06-06 03:15:33 +00:00 committed by Mark Mitchell
parent 7b2b3f29e5
commit 7e9abee913
4 changed files with 48 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2001-06-05 Mark Mitchell <mark@codesourcery.com>
* pt.c (instantiate_decl): Tell the repository code about the
clones, not the cloned functions.
* repo.c (repo_template_used): Explicitly instantiate the cloned
function, not the clones.
2001-06-05 Nathan Sidwell <nathan@codesourcery.com>
* call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and

View File

@ -9821,7 +9821,25 @@ instantiate_decl (d, defer_ok)
if (pattern_defined)
{
repo_template_used (d);
/* Let the repository code that this template definition is
available.
The repository doesn't need to know about cloned functions
because they never actually show up in the object file. It
does need to know about the clones; those are the symbols
that the linker will be emitting error messages about. */
if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (d)
|| DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (d))
{
tree t;
for (t = TREE_CHAIN (d);
t && DECL_CLONED_FUNCTION_P (t);
t = TREE_CHAIN (t))
repo_template_used (t);
}
else
repo_template_used (d);
if (flag_external_templates && ! DECL_INTERFACE_KNOWN (d))
{

View File

@ -137,7 +137,13 @@ repo_template_used (t)
else if (DECL_P (t))
{
if (IDENTIFIER_REPO_CHOSEN (id))
mark_decl_instantiated (t, 0);
/* It doesn't make sense to instantiate a clone, so we
instantiate the cloned function instead. Note that this
approach will not work correctly if collect2 assigns
different clones to different files -- but it shouldn't. */
mark_decl_instantiated (DECL_CLONED_FUNCTION_P (t)
? DECL_CLONED_FUNCTION (t) : t,
0);
}
else
my_friendly_abort (1);

View File

@ -0,0 +1,15 @@
// Build then link:
// Special g++ Options: -frepo
template <class T>
struct S {
~S ();
};
template <class T>
S<T>::~S () {}
int main ()
{
S<int> s;
}