2009-12-11 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Dec 2009 10:56:17 +0000 (10:56 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Dec 2009 10:56:17 +0000 (10:56 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155155 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lto-symtab.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/20091210-1_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/20091210-1_0.h [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/20091210-1_1.C [new file with mode: 0644]

index 79fb7b1..d2d8f21 100644 (file)
@@ -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
index ab96b48..79eb3e4 100644 (file)
@@ -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.  */
index 939bab3..d6256a3 100644 (file)
@@ -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 (file)
index 0000000..3bdfd9d
--- /dev/null
@@ -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 (file)
index 0000000..a46f3c2
--- /dev/null
@@ -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 (file)
index 0000000..4fb15cd
--- /dev/null
@@ -0,0 +1,9 @@
+#include "20091210-1_0.h"
+
+struct Foo : Base {
+    virtual void g();
+};
+
+void Foo::g() {}
+
+int main() {}