mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-30 16:15:35 +08:00
pt.c (do_decl_instantiate): Explicitly clone constructors and destructors that haven't already been cloned.
* pt.c (do_decl_instantiate): Explicitly clone constructors and destructors that haven't already been cloned. From-SVN: r37673
This commit is contained in:
parent
57f56af4c5
commit
cac78ea281
@ -1,3 +1,8 @@
|
||||
2000-11-22 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* pt.c (do_decl_instantiate): Explicitly clone constructors and
|
||||
destructors that haven't already been cloned.
|
||||
|
||||
2000-11-20 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* parse.y (yyparse_1): Rename the parser entry point.
|
||||
|
@ -9214,6 +9214,15 @@ do_decl_instantiation (declspecs, declarator, storage)
|
||||
cp_error ("storage class `%D' applied to template instantiation",
|
||||
storage);
|
||||
|
||||
/* Under the new ABI, we need to make sure to instantiate all the
|
||||
cloned versions of constructors or destructors. */
|
||||
if (flag_new_abi &&
|
||||
(DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (result) ||
|
||||
DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (result)) &&
|
||||
!(TREE_CHAIN (result) &&
|
||||
DECL_CLONED_FUNCTION (TREE_CHAIN (result))))
|
||||
clone_function_decl(result, /*update_method_vec_p=*/0);
|
||||
|
||||
SET_DECL_EXPLICIT_INSTANTIATION (result);
|
||||
mark_decl_instantiated (result, extern_p);
|
||||
repo_template_instantiated (result, extern_p);
|
||||
|
12
gcc/testsuite/g++.old-deja/g++.other/ctor1-aux.cc
Normal file
12
gcc/testsuite/g++.old-deja/g++.other/ctor1-aux.cc
Normal file
@ -0,0 +1,12 @@
|
||||
// Origin: Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
template <class T>
|
||||
struct S {
|
||||
template <class U>
|
||||
S (U);
|
||||
};
|
||||
|
||||
int main ()
|
||||
{
|
||||
S<int> (3.0);
|
||||
}
|
14
gcc/testsuite/g++.old-deja/g++.other/ctor1.C
Normal file
14
gcc/testsuite/g++.old-deja/g++.other/ctor1.C
Normal file
@ -0,0 +1,14 @@
|
||||
// Additional sources: ctor1-aux.cc
|
||||
// Origin: Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
template <class T>
|
||||
struct S {
|
||||
template <class U>
|
||||
S (U);
|
||||
};
|
||||
|
||||
template <class T>
|
||||
template <class U>
|
||||
S<T>::S (U) {}
|
||||
|
||||
template S<int>::S (double);
|
Loading…
Reference in New Issue
Block a user