aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-12-11 10:56:17 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-12-11 10:56:17 +0000
commit5d96330ac864e99e367c7ffcb88a685342a1e38c (patch)
tree73d4585314a2a4fb760d1416fc5ccc094be034d5 /gcc
parentf7dc4e3dc72e84cbce662e2635ae5eff52c311b2 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/lto-symtab.c5
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/lto/20091210-1_0.C3
-rw-r--r--gcc/testsuite/g++.dg/lto/20091210-1_0.h9
-rw-r--r--gcc/testsuite/g++.dg/lto/20091210-1_1.C9
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() {}