aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2000-11-22 22:43:49 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2000-11-22 22:43:49 +0000
commitcac78ea2814a35a8e797ba0ed6ab1f24531df18a (patch)
treec8e4c38b3a0dc7cfc437bf28e92fbe711fd71519 /gcc
parent57f56af4c574c7b7185cdf211ebe4877a0ca877a (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/ctor1-aux.cc12
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/ctor1.C14
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);