diff options
author | Mark Mitchell <mark@codesourcery.com> | 2000-11-22 22:43:49 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2000-11-22 22:43:49 +0000 |
commit | cac78ea2814a35a8e797ba0ed6ab1f24531df18a (patch) | |
tree | c8e4c38b3a0dc7cfc437bf28e92fbe711fd71519 /gcc | |
parent | 57f56af4c574c7b7185cdf211ebe4877a0ca877a (diff) | |
download | gcc-cac78ea2814a35a8e797ba0ed6ab1f24531df18a.zip gcc-cac78ea2814a35a8e797ba0ed6ab1f24531df18a.tar.gz gcc-cac78ea2814a35a8e797ba0ed6ab1f24531df18a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/ctor1-aux.cc | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/ctor1.C | 14 |
4 files changed, 40 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bc73be5..ef02d3d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 3327110..ddcdf8a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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); diff --git a/gcc/testsuite/g++.old-deja/g++.other/ctor1-aux.cc b/gcc/testsuite/g++.old-deja/g++.other/ctor1-aux.cc new file mode 100644 index 0000000..9990ca2 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/ctor1-aux.cc @@ -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); +} diff --git a/gcc/testsuite/g++.old-deja/g++.other/ctor1.C b/gcc/testsuite/g++.old-deja/g++.other/ctor1.C new file mode 100644 index 0000000..1c67d0a --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/ctor1.C @@ -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); |