diff options
author | Richard Guenther <rguenther@suse.de> | 2009-12-11 10:56:17 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-12-11 10:56:17 +0000 |
commit | 5d96330ac864e99e367c7ffcb88a685342a1e38c (patch) | |
tree | 73d4585314a2a4fb760d1416fc5ccc094be034d5 /gcc | |
parent | f7dc4e3dc72e84cbce662e2635ae5eff52c311b2 (diff) | |
download | gcc-5d96330ac864e99e367c7ffcb88a685342a1e38c.zip gcc-5d96330ac864e99e367c7ffcb88a685342a1e38c.tar.gz gcc-5d96330ac864e99e367c7ffcb88a685342a1e38c.tar.bz2 |
re PR middle-end/42320 (link error with -flto (undefined reference to 'non-virtual thunk ...))
2009-12-11 Richard Guenther <rguenther@suse.de>
PR lto/42320
* lto-symtab.c (lto_symtab_resolve_can_prevail_p): Properly
detect non-prevailing decls.
* g++.dg/lto/20091210-1_0.h: New testcase.
* g++.dg/lto/20091210-1_0.C: Likewise.
* g++.dg/lto/20091210-1_1.C: Likewise.
From-SVN: r155155
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lto-symtab.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/20091210-1_0.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/20091210-1_0.h | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/20091210-1_1.C | 9 |
6 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 79fb7b1..d2d8f21 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-12-11 Richard Guenther <rguenther@suse.de> + + PR lto/42320 + * lto-symtab.c (lto_symtab_resolve_can_prevail_p): Properly + detect non-prevailing decls. + 2009-12-10 Jakub Jelinek <jakub@redhat.com> PR c++/42317 diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index ab96b48..79eb3e4 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -371,7 +371,10 @@ lto_symtab_resolve_replaceable_p (lto_symtab_entry_t e) static bool lto_symtab_resolve_can_prevail_p (lto_symtab_entry_t e) { - if (!TREE_STATIC (e->decl)) + /* The C++ frontend ends up neither setting TREE_STATIC nor + DECL_EXTERNAL on virtual methods but only TREE_PUBLIC. + So do not reject !TREE_STATIC here but only DECL_EXTERNAL. */ + if (DECL_EXTERNAL (e->decl)) return false; /* For functions we need a non-discarded body. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 939bab3..d6256a3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-12-11 Richard Guenther <rguenther@suse.de> + + PR lto/42320 + * g++.dg/lto/20091210-1_0.h: New testcase. + * g++.dg/lto/20091210-1_0.C: Likewise. + * g++.dg/lto/20091210-1_1.C: Likewise. + 2009-12-10 Jakub Jelinek <jakub@redhat.com> PR c++/42317 diff --git a/gcc/testsuite/g++.dg/lto/20091210-1_0.C b/gcc/testsuite/g++.dg/lto/20091210-1_0.C new file mode 100644 index 0000000..3bdfd9d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091210-1_0.C @@ -0,0 +1,3 @@ +// { dg-lto-do link } +#include "20091210-1_0.h" +void Base::f() {} diff --git a/gcc/testsuite/g++.dg/lto/20091210-1_0.h b/gcc/testsuite/g++.dg/lto/20091210-1_0.h new file mode 100644 index 0000000..a46f3c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091210-1_0.h @@ -0,0 +1,9 @@ +struct Base1 { + virtual ~Base1() {} +}; +struct Base2 { + virtual void f() = 0; +}; +struct Base : Base1, Base2 { + virtual void f(); +}; diff --git a/gcc/testsuite/g++.dg/lto/20091210-1_1.C b/gcc/testsuite/g++.dg/lto/20091210-1_1.C new file mode 100644 index 0000000..4fb15cd --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091210-1_1.C @@ -0,0 +1,9 @@ +#include "20091210-1_0.h" + +struct Foo : Base { + virtual void g(); +}; + +void Foo::g() {} + +int main() {} |