class.c (build_vbase_offset_vbtl_entries): Look for non-primary base of which we are a sub vtable.
cp: * class.c (build_vbase_offset_vbtl_entries): Look for non-primary base of which we are a sub vtable. testsuite: * g++.old-deja/g++.abi/vbase8-5.C: New test. From-SVN: r44336
This commit is contained in:
parent
a368a2fabb
commit
90b1ca2f52
|
@ -1,3 +1,8 @@
|
||||||
|
2001-07-25 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
* class.c (build_vbase_offset_vbtl_entries): Look for
|
||||||
|
non-primary base of which we are a sub vtable.
|
||||||
|
|
||||||
2001-07-24 Phil Edwards <pme@sources.redhat.com>
|
2001-07-24 Phil Edwards <pme@sources.redhat.com>
|
||||||
|
|
||||||
* semantics.c (finish_this_expr): Remove unused code.
|
* semantics.c (finish_this_expr): Remove unused code.
|
||||||
|
|
|
@ -7671,6 +7671,7 @@ build_vbase_offset_vtbl_entries (binfo, vid)
|
||||||
{
|
{
|
||||||
tree vbase;
|
tree vbase;
|
||||||
tree t;
|
tree t;
|
||||||
|
tree non_primary_binfo;
|
||||||
|
|
||||||
/* If there are no virtual baseclasses, then there is nothing to
|
/* If there are no virtual baseclasses, then there is nothing to
|
||||||
do. */
|
do. */
|
||||||
|
@ -7678,6 +7679,30 @@ build_vbase_offset_vtbl_entries (binfo, vid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
t = vid->derived;
|
t = vid->derived;
|
||||||
|
|
||||||
|
/* We might be a primary base class. Go up the inheritance hierarchy
|
||||||
|
until we find the most derived class of which we are a primary base:
|
||||||
|
it is the offset of that which we need to use. */
|
||||||
|
non_primary_binfo = binfo;
|
||||||
|
while (BINFO_INHERITANCE_CHAIN (non_primary_binfo))
|
||||||
|
{
|
||||||
|
tree b;
|
||||||
|
|
||||||
|
/* If we have reached a virtual base, then it must be a primary
|
||||||
|
base (possibly multi-level) of vid->binfo, or we wouldn't
|
||||||
|
have called build_vcall_and_vbase_vtbl_entries for it. But it
|
||||||
|
might be a lost primary, so just skip down to vid->binfo. */
|
||||||
|
if (TREE_VIA_VIRTUAL (non_primary_binfo))
|
||||||
|
{
|
||||||
|
non_primary_binfo = vid->binfo;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
b = BINFO_INHERITANCE_CHAIN (non_primary_binfo);
|
||||||
|
if (get_primary_binfo (b) != non_primary_binfo)
|
||||||
|
break;
|
||||||
|
non_primary_binfo = b;
|
||||||
|
}
|
||||||
|
|
||||||
/* Go through the virtual bases, adding the offsets. */
|
/* Go through the virtual bases, adding the offsets. */
|
||||||
for (vbase = TYPE_BINFO (BINFO_TYPE (binfo));
|
for (vbase = TYPE_BINFO (BINFO_TYPE (binfo));
|
||||||
|
@ -7729,7 +7754,8 @@ build_vbase_offset_vtbl_entries (binfo, vid)
|
||||||
The vbase offsets go in reverse inheritance-graph order, and
|
The vbase offsets go in reverse inheritance-graph order, and
|
||||||
we are walking in inheritance graph order so these end up in
|
we are walking in inheritance graph order so these end up in
|
||||||
the right order. */
|
the right order. */
|
||||||
delta = size_diffop (BINFO_OFFSET (b), BINFO_OFFSET (binfo));
|
delta = size_diffop (BINFO_OFFSET (b), BINFO_OFFSET (non_primary_binfo));
|
||||||
|
|
||||||
*vid->last_init
|
*vid->last_init
|
||||||
= build_tree_list (NULL_TREE,
|
= build_tree_list (NULL_TREE,
|
||||||
fold (build1 (NOP_EXPR,
|
fold (build1 (NOP_EXPR,
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2001-07-25 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
* g++.old-deja/g++.abi/vbase8-5.C: New test.
|
||||||
|
|
||||||
2001-07-24 Jason Merrill <jason_merrill@redhat.com>
|
2001-07-24 Jason Merrill <jason_merrill@redhat.com>
|
||||||
|
|
||||||
* lib/scanasm.exp (scan-assembler*): Don't take "testcase" argument.
|
* lib/scanasm.exp (scan-assembler*): Don't take "testcase" argument.
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
// Special g++ Options: -w
|
||||||
|
|
||||||
|
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||||
|
// Contributed by Nathan Sidwell 24 Jul 2001 <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
// Origin stefan@space.twc.de
|
||||||
|
// Bug 3145 case 5. Horribly complicated class hierarchy
|
||||||
|
|
||||||
|
class C0
|
||||||
|
{};
|
||||||
|
class C1
|
||||||
|
: virtual public C0
|
||||||
|
{};
|
||||||
|
class C2
|
||||||
|
: public C0
|
||||||
|
, virtual public C1
|
||||||
|
{};
|
||||||
|
class C3
|
||||||
|
: virtual public C0
|
||||||
|
, virtual public C2
|
||||||
|
, public C1
|
||||||
|
{};
|
||||||
|
class C4
|
||||||
|
: virtual public C0
|
||||||
|
, virtual public C2
|
||||||
|
, virtual public C1
|
||||||
|
, virtual public C3
|
||||||
|
{};
|
||||||
|
class C5
|
||||||
|
: virtual public C3
|
||||||
|
, virtual public C2
|
||||||
|
, virtual public C0
|
||||||
|
, public C4
|
||||||
|
, virtual public C1
|
||||||
|
{};
|
||||||
|
class C6
|
||||||
|
: public C0
|
||||||
|
, virtual public C3
|
||||||
|
, public C4
|
||||||
|
, virtual public C5
|
||||||
|
, public C1
|
||||||
|
{};
|
||||||
|
class C7
|
||||||
|
: virtual public C3
|
||||||
|
, public C5
|
||||||
|
, public C2
|
||||||
|
, virtual public C4
|
||||||
|
, public C6
|
||||||
|
, public C0
|
||||||
|
{};
|
||||||
|
class C8
|
||||||
|
: virtual public C2
|
||||||
|
, public C5
|
||||||
|
, public C7
|
||||||
|
, public C1
|
||||||
|
, public C0
|
||||||
|
, public C4
|
||||||
|
, public C3
|
||||||
|
{};
|
||||||
|
class C9
|
||||||
|
: public C3
|
||||||
|
, public C2
|
||||||
|
, virtual public C6
|
||||||
|
, public C8
|
||||||
|
, virtual public C7
|
||||||
|
, public C5
|
||||||
|
{};
|
||||||
|
main() {
|
||||||
|
C0 c0;
|
||||||
|
C1 c1;
|
||||||
|
C2 c2;
|
||||||
|
C3 c3;
|
||||||
|
C4 c4;
|
||||||
|
C5 c5;
|
||||||
|
C6 c6;
|
||||||
|
C7 c7;
|
||||||
|
C8 c8;
|
||||||
|
C9 c9;
|
||||||
|
}
|
Loading…
Reference in New Issue