summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>1999-05-24 23:38:55 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>1999-05-24 23:38:55 +0000
commitf5eb8c60e828ccdf19f2c2337c1a32d522fa19d4 (patch)
treeb45a659b2b3d0176195cb9e011fdbd9983c9c5cc
parente051ca41f094b4e87028559001ecd32ac255629c (diff)
downloadgcc-f5eb8c60e828ccdf19f2c2337c1a32d522fa19d4.tar.gz
* decl2.c (mark_vtable_entries): Don't make a copy of a function,
and then make it look like `abort'. Just use `abort' instead. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27131 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/decl2.c3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/virtual2.C21
3 files changed, 25 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 250f063b768..835402f0f0c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
1999-05-24 Mark Mitchell <mark@codesourcery.com>
+ * decl2.c (mark_vtable_entries): Don't make a copy of a function,
+ and then make it look like `abort'. Just use `abort' instead.
+
* typeck.c (build_static_cast): Don't allow static_casts that cast
away constness.
(casts_away_constness_r): New function.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 9427c2c6ba4..793a974c1e3 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -2424,8 +2424,7 @@ mark_vtable_entries (decl)
TREE_ADDRESSABLE (fn) = 1;
if (DECL_LANG_SPECIFIC (fn) && DECL_ABSTRACT_VIRTUAL_P (fn))
{
- TREE_OPERAND (fnaddr, 0) = fn = copy_node (fn);
- DECL_RTL (fn) = DECL_RTL (abort_fndecl);
+ TREE_OPERAND (fnaddr, 0) = abort_fndecl;
mark_used (abort_fndecl);
}
if (TREE_CODE (fn) == THUNK_DECL && DECL_EXTERNAL (fn))
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/virtual2.C b/gcc/testsuite/g++.old-deja/g++.pt/virtual2.C
new file mode 100644
index 00000000000..052b0497908
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/virtual2.C
@@ -0,0 +1,21 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+template <class T>
+struct B
+{
+ virtual void f() = 0;
+};
+
+template <class T>
+struct D : public B<T> {
+ virtual void f();
+};
+
+void g() {
+ B<int>* bi = new D<int>;
+};
+
+template <class T>
+void B<T>::f() {}
+