Commit 20dde49d by Nathan Sidwell Committed by Nathan Sidwell

re PR c++/3631 (another linking problem with virtual derivation)

cp:
	PR c++/3631
	* class.c (update_vtable_entry_for_fn): The fixed adjustment
	of a virtual thunk should be from declaring base.
testsuite:
	* g++.dg/abi/vthunk1.C: New test.

From-SVN: r44509
parent b7ad2f8b
2001-07-31 Nathan Sidwell <nathan@codesourcery.com> 2001-07-31 Nathan Sidwell <nathan@codesourcery.com>
PR c++/3631
* class.c (update_vtable_entry_for_fn): The fixed adjustment
of a virtual thunk should be from declaring base.
2001-07-31 Nathan Sidwell <nathan@codesourcery.com>
* class.c (dfs_ctor_vtable_bases_queue_p): Always walk into * class.c (dfs_ctor_vtable_bases_queue_p): Always walk into
the shared virtual base, so preserving inheritance graph order. the shared virtual base, so preserving inheritance graph order.
......
...@@ -2563,10 +2563,10 @@ update_vtable_entry_for_fn (t, binfo, fn, virtuals) ...@@ -2563,10 +2563,10 @@ update_vtable_entry_for_fn (t, binfo, fn, virtuals)
(or one of its primary bases, which are at the same offset). */ (or one of its primary bases, which are at the same offset). */
if (virtual_base) if (virtual_base)
/* The `this' pointer needs to be adjusted to the nearest virtual /* The `this' pointer needs to be adjusted from the declaration to
base. */ the nearest virtual base. */
delta = size_diffop (BINFO_OFFSET (virtual_base), delta = size_diffop (BINFO_OFFSET (virtual_base),
BINFO_OFFSET (binfo)); BINFO_OFFSET (first_defn));
else else
{ {
/* The `this' pointer needs to be adjusted from pointing to /* The `this' pointer needs to be adjusted from pointing to
...@@ -2580,7 +2580,7 @@ update_vtable_entry_for_fn (t, binfo, fn, virtuals) ...@@ -2580,7 +2580,7 @@ update_vtable_entry_for_fn (t, binfo, fn, virtuals)
/* We'll need a thunk. But if we have a (perhaps formerly) /* We'll need a thunk. But if we have a (perhaps formerly)
primary virtual base, we have a vcall slot for this function, primary virtual base, we have a vcall slot for this function,
so we can use it rather than create a non-virtual thunk. */ so we can use it rather than create a non-virtual thunk. */
b = get_primary_binfo (first_defn); b = get_primary_binfo (first_defn);
for (; b; b = get_primary_binfo (b)) for (; b; b = get_primary_binfo (b))
{ {
......
2001-07-31 Nathan Sidwell <nathan@codesourcery.com> 2001-07-31 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/abi/vthunk1.C: New test.
2001-07-31 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/abi/vbase8-22.C: New test. * g++.dg/abi/vbase8-22.C: New test.
2001-07-31 Neil Booth <neil@cat.daikokuya.demon.co.uk> 2001-07-31 Neil Booth <neil@cat.daikokuya.demon.co.uk>
......
// { dg-do link }
// Copyright (C) 2001 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 29 Jul 2001 <nathan@codesourcery.com>
// Origin snyder@fnal.gov
// Bug 3631. We mis-calculated the non-virtual part of a virtual
// thunk. Leading to a link failure, in this case.
struct A { virtual ~A () {} };
struct B : virtual public A
{
virtual void destroy() {}
};
class C : virtual public B {};
class D : virtual public C {};
class E : public virtual A {};
struct F : virtual public B, virtual public E
{
virtual void destroy() = 0;
};
struct G : public virtual F
{
virtual void destroy() {}
};
class H : virtual public C, virtual public F {};
class I : virtual public D, virtual public H {};
class J : public virtual G, public virtual H {};
class K : public virtual I, public virtual J
{
public:
virtual ~K();
};
K::~K() {}
int main ()
{
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment