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:
parent
7b2b3f29e5
commit
7e9abee913
4 changed files with 48 additions and 2 deletions
|
@ -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
|
||||
|
|
20
gcc/cp/pt.c
20
gcc/cp/pt.c
|
@ -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);
|
||||
|
|
15
gcc/testsuite/g++.old-deja/g++.pt/repo4.C
Normal file
15
gcc/testsuite/g++.old-deja/g++.pt/repo4.C
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue