aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-12-03 09:03:36 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2009-12-03 09:03:36 +0100
commit249ccaff220334750acbaf9351dd06b0fdcbde06 (patch)
tree0119980c05edf08a422e0c6762e48fc72b63b3ef /gcc
parent90df451fdebaab5673e752a3528be0337781557e (diff)
downloadgcc-249ccaff220334750acbaf9351dd06b0fdcbde06.zip
gcc-249ccaff220334750acbaf9351dd06b0fdcbde06.tar.gz
gcc-249ccaff220334750acbaf9351dd06b0fdcbde06.tar.bz2
re PR c++/42256 (483.xalancbmk fails to link)
PR c++/42256 * optimize.c (maybe_clone_body): Call emit_associated_thunks after expand_or_defer_fn_1. * g++.dg/inherit/thunk11.C: New test. * g++.dg/inherit/thunk11.h: New file. * g++.dg/inherit/thunk11-aux.cc: New file. From-SVN: r154937
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/optimize.c6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/inherit/thunk11-aux.cc4
-rw-r--r--gcc/testsuite/g++.dg/inherit/thunk11.C11
-rw-r--r--gcc/testsuite/g++.dg/inherit/thunk11.h16
6 files changed, 48 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 84ce5a5..6753829 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2009-12-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/42256
+ * optimize.c (maybe_clone_body): Call emit_associated_thunks
+ after expand_or_defer_fn_1.
+
2009-12-02 Taras Glek <taras@mozilla.com>
* parser.c (cp_parser_class_specifier): Back out my previous change.
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index 5a67431..9210a80 100644
--- a/gcc/cp/optimize.c
+++ b/gcc/cp/optimize.c
@@ -309,7 +309,6 @@ maybe_clone_body (tree fn)
comdat_group = cdtor_comdat_group (fns[1], fns[0]);
DECL_COMDAT_GROUP (fns[0]) = comdat_group;
}
- emit_associated_thunks (clone);
}
/* Build the delete destructor by calling complete destructor
@@ -383,7 +382,10 @@ maybe_clone_body (tree fn)
finish_function (0);
BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone)) = DECL_INITIAL (fn);
if (alias)
- expand_or_defer_fn_1 (clone);
+ {
+ if (expand_or_defer_fn_1 (clone))
+ emit_associated_thunks (clone);
+ }
else
expand_or_defer_fn (clone);
first = false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dab89fa..aeb92ac 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2009-12-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/42256
+ * g++.dg/inherit/thunk11.C: New test.
+ * g++.dg/inherit/thunk11.h: New file.
+ * g++.dg/inherit/thunk11-aux.cc: New file.
+
2009-12-02 Richard Guenther <rguenther@suse.de>
* g++.dg/ipa/iinline-1.C: Adjust.
diff --git a/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc b/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
new file mode 100644
index 0000000..7009d6c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
diff --git a/gcc/testsuite/g++.dg/inherit/thunk11.C b/gcc/testsuite/g++.dg/inherit/thunk11.C
new file mode 100644
index 0000000..6e3bc32
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/thunk11.C
@@ -0,0 +1,11 @@
+// PR c++/42256
+// { dg-do link }
+// { dg-additional-sources "thunk11-aux.cc" }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
+
+int
+main ()
+{
+}
diff --git a/gcc/testsuite/g++.dg/inherit/thunk11.h b/gcc/testsuite/g++.dg/inherit/thunk11.h
new file mode 100644
index 0000000..641f40e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/thunk11.h
@@ -0,0 +1,16 @@
+struct A
+{
+ A () {}
+ virtual ~A () {}
+};
+struct B
+{
+ B () {}
+ virtual ~B () {}
+};
+struct C : public A, public B
+{
+ virtual void foo ();
+ virtual ~C () {};
+};
+inline void C::foo () {}