From: Nathan Sidwell Date: Fri, 27 Jul 2001 15:07:40 +0000 (+0000) Subject: class.c (finish_struct_1): When copying the primary base's VFIELD, make sure we find... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d60d223b176c68cf2559eed8244977f935b39be9;p=gcc.git class.c (finish_struct_1): When copying the primary base's VFIELD, make sure we find it is at offset zero. cp: * class.c (finish_struct_1): When copying the primary base's VFIELD, make sure we find it is at offset zero. testsuite: * g++.dg/abi/vbase8-10.C: New test. From-SVN: r44421 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 756924940da..361b20dd6ca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2001-07-27 Nathan Sidwell + + * class.c (finish_struct_1): When copying the primary base's + VFIELD, make sure we find it is at offset zero. + 2001-07-26 Kriang Lerdsuwanakij * pt.c (tsubst_template_parms): Call maybe_fold_nontype_arg and @@ -5,6 +10,7 @@ 2001-07-26 Nathan Sidwell + PR c++/3621 * spew.c (yylex): Only copy the token's lineno, if it is non-zero. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 4ff29a1e67a..18ade132d17 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5092,20 +5092,25 @@ finish_struct_1 (t) /* Make sure that we get our own copy of the vfield FIELD_DECL. */ vfield = TYPE_VFIELD (t); - if (vfield != NULL_TREE - && DECL_FIELD_CONTEXT (vfield) != t) - { - tree binfo = get_binfo (DECL_FIELD_CONTEXT (vfield), t, 0); - + if (vfield && CLASSTYPE_HAS_PRIMARY_BASE_P (t)) + { + tree primary = CLASSTYPE_PRIMARY_BINFO (t); + + my_friendly_assert (same_type_p (DECL_FIELD_CONTEXT (vfield), + BINFO_TYPE (primary)), + 20010726); + /* The vtable better be at the start. */ + my_friendly_assert (integer_zerop (DECL_FIELD_OFFSET (vfield)), + 20010726); + my_friendly_assert (integer_zerop (BINFO_OFFSET (primary)), + 20010726); + vfield = copy_decl (vfield); - DECL_FIELD_CONTEXT (vfield) = t; - DECL_FIELD_OFFSET (vfield) - = size_binop (PLUS_EXPR, - BINFO_OFFSET (binfo), - DECL_FIELD_OFFSET (vfield)); TYPE_VFIELD (t) = vfield; } + else + my_friendly_assert (!vfield || DECL_FIELD_CONTEXT (vfield) == t, 20010726); overridden_virtuals = modify_all_vtables (t, &vfuns, nreverse (overridden_virtuals)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 70e87e0f93e..4753dc2f50c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-07-27 Nathan Sidwell + + * g++.dg/abi/vbase8-10.C: New test. + 2001-07-27 Rainer Orth * lib/g++.exp (g++_set_ld_library_path): Renamed to diff --git a/gcc/testsuite/g++.dg/abi/vbase8-10.C b/gcc/testsuite/g++.dg/abi/vbase8-10.C new file mode 100644 index 00000000000..81896ed64e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase8-10.C @@ -0,0 +1,75 @@ +// { dg-options -w } +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Jul 2001 + +// Origin stefan@space.twc.de +// Bug 3145 case 10. Horribly complicated class hierarchy + +class C0 +{}; +class C1 + : public C0 +{}; +class C2 + : public C1 + , virtual public C0 +{}; +class C3 + : public C1 + , public C2 + , virtual public C0 +{}; +class C4 + : virtual public C1 + , virtual public C0 + , virtual public C3 + , public C2 +{}; +class C5 + : public C3 + , virtual public C0 + , virtual public C2 +{}; +class C6 + : public C1 + , public C2 + , virtual public C5 + , virtual public C3 + , virtual public C0 +{}; +class C7 + : public C1 + , virtual public C5 + , virtual public C4 + , virtual public C2 + , virtual public C0 + , virtual public C6 +{}; +class C8 + : virtual public C4 + , public C3 + , public C0 + , virtual public C7 + , virtual public C6 +{}; +class C9 + : virtual public C0 + , public C4 + , public C8 + , public C1 + , public C6 +{}; +main() { + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; +}