aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 250f063..835402f 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 9427c2c..793a974 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 0000000..052b049
--- /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() {}
+