re PR c++/47218 (C++ multiple definitions of non-virtual thunk problem)

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
This commit is contained in:
Dave Korn 2011-01-10 00:33:32 +00:00 committed by Dave Korn
parent 637ebedd38
commit d06865bf07
6 changed files with 79 additions and 2 deletions

View 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

View 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))

View 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

View File

@ -0,0 +1,10 @@
#include "pr47218.h"
Foo2::~Foo2 ()
{
((FooBaseBase1*)this)->Bar();
}
void Foo2::Bar()
{
}

View File

@ -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;
}

View File

@ -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();
};