From 5d96330ac864e99e367c7ffcb88a685342a1e38c Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 11 Dec 2009 10:56:17 +0000 Subject: [PATCH] re PR middle-end/42320 (link error with -flto (undefined reference to 'non-virtual thunk ...)) 2009-12-11 Richard Guenther 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 --- gcc/ChangeLog | 6 ++++++ gcc/lto-symtab.c | 5 ++++- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/lto/20091210-1_0.C | 3 +++ gcc/testsuite/g++.dg/lto/20091210-1_0.h | 9 +++++++++ gcc/testsuite/g++.dg/lto/20091210-1_1.C | 9 +++++++++ 6 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/lto/20091210-1_0.C create mode 100644 gcc/testsuite/g++.dg/lto/20091210-1_0.h create mode 100644 gcc/testsuite/g++.dg/lto/20091210-1_1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 79fb7b1f554..d2d8f2182c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-12-11 Richard Guenther + + PR lto/42320 + * lto-symtab.c (lto_symtab_resolve_can_prevail_p): Properly + detect non-prevailing decls. + 2009-12-10 Jakub Jelinek PR c++/42317 diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index ab96b48cd36..79eb3e48de6 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 939bab3dc93..d6256a3920d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-12-11 Richard Guenther + + 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 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 00000000000..3bdfd9d56ca --- /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 00000000000..a46f3c2db3b --- /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 00000000000..4fb15cd5f23 --- /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() {} -- 2.30.2