diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-12-03 09:03:36 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-12-03 09:03:36 +0100 |
commit | 249ccaff220334750acbaf9351dd06b0fdcbde06 (patch) | |
tree | 0119980c05edf08a422e0c6762e48fc72b63b3ef /gcc | |
parent | 90df451fdebaab5673e752a3528be0337781557e (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/optimize.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/thunk11-aux.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/thunk11.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/thunk11.h | 16 |
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 () {} |