]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/47218 (C++ multiple definitions of non-virtual thunk problem)
authorDave Korn <dave.korn.cygwin@gmail.com>
Mon, 10 Jan 2011 00:33:32 +0000 (00:33 +0000)
committerDave Korn <davek@gcc.gnu.org>
Mon, 10 Jan 2011 00:33:32 +0000 (00:33 +0000)
gcc/ChangeLog:

PR c++/47218
* cgraphunit.c (assemble_thunk): Call resolve_unique_section.

gcc/testsuite/ChangeLog:

PR c++/47218
* g++.dg/other/pr47218-1.C: New test file.
* g++.dg/other/pr47218.C: Likewise.
* g++.dg/other/pr47218.h: New supporting header.

From-SVN: r168624

gcc/ChangeLog
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/pr47218-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/pr47218.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/pr47218.h [new file with mode: 0644]

index bb64fa82ea860e5e8b7a21e8770a0d7ecaa1a426..99532478c3ecfe3df0ae971413b7a91d6da93769 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-10  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+       PR c++/47218
+       * cgraphunit.c (assemble_thunk): Call resolve_unique_section.
+
 2011-01-09  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        PR objc/47232
index ec477ee920bdcb36f5306c83ac90c9b2535d4ca1..92e5aa9546120c60b2b9b176a593162aa9007dbf 100644 (file)
@@ -1,6 +1,6 @@
 /* Callgraph based interprocedural optimizations.
-   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+   2011 Free Software Foundation, Inc.
    Contributed by Jan Hubicka
 
 This file is part of GCC.
@@ -1317,6 +1317,9 @@ assemble_thunk (struct cgraph_node *node)
 
   current_function_decl = thunk_fndecl;
 
+  /* Ensure thunks are emitted in their correct sections.  */
+  resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
+
   if (this_adjusting
       && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
                                              virtual_value, alias))
index 0fa673c53c055e1a288213b307acb411352b7219..48aa10137b99761852e1b3ea30b849710203a64a 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-10  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+       PR c++/47218
+       * g++.dg/other/pr47218-1.C: New test file.
+       * g++.dg/other/pr47218.C: Likewise.
+       * g++.dg/other/pr47218.h: New supporting header.
+
 2011-01-09  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        PR objc/47232
diff --git a/gcc/testsuite/g++.dg/other/pr47218-1.C b/gcc/testsuite/g++.dg/other/pr47218-1.C
new file mode 100644 (file)
index 0000000..aeb070b
--- /dev/null
@@ -0,0 +1,10 @@
+#include "pr47218.h"
+
+Foo2::~Foo2 ()
+{
+  ((FooBaseBase1*)this)->Bar();
+}
+
+void Foo2::Bar()
+{
+}
diff --git a/gcc/testsuite/g++.dg/other/pr47218.C b/gcc/testsuite/g++.dg/other/pr47218.C
new file mode 100644 (file)
index 0000000..3056795
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do link } */
+/* { dg-options "--save-temps" } */
+/* { dg-additional-sources "pr47218-1.C" } */
+
+#include "pr47218.h"
+
+Foo3::~Foo3 ()
+{
+  ((FooBaseBase1*)this)->Bar();
+}
+
+void Foo3::Bar()
+{
+}
+
+int main ()
+{
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/other/pr47218.h b/gcc/testsuite/g++.dg/other/pr47218.h
new file mode 100644 (file)
index 0000000..1b07da7
--- /dev/null
@@ -0,0 +1,33 @@
+
+class FooBaseBase0
+{
+public:
+  virtual ~FooBaseBase0 () {}
+};
+
+class FooBaseBase1
+{
+public:
+  virtual void Bar() {}
+};
+
+
+class FooBase: public FooBaseBase0, public FooBaseBase1
+{
+public:
+  virtual void Bar() {}
+};
+
+class Foo2: public FooBase
+{
+public:
+  ~Foo2 ();
+  virtual void Bar();
+};
+
+class Foo3: public FooBase
+{
+public:
+  ~Foo3 ();
+  virtual void Bar();
+};