Commit 7e9abee9 by Mark Mitchell Committed by Mark Mitchell

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
parent 7b2b3f29
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
......
......@@ -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))
{
......
......@@ -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);
......
// Build then link:
// Special g++ Options: -frepo
template <class T>
struct S {
~S ();
};
template <class T>
S<T>::~S () {}
int main ()
{
S<int> s;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment