aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2001-07-27 15:07:40 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2001-07-27 15:07:40 +0000
commitd60d223b176c68cf2559eed8244977f935b39be9 (patch)
tree9e995882baa499a8e21aa023f3eb814b35513a47
parent08ecdbebab368105c958935c47f6fde5d225e41a (diff)
downloadgcc-d60d223b176c68cf2559eed8244977f935b39be9.zip
gcc-d60d223b176c68cf2559eed8244977f935b39be9.tar.gz
gcc-d60d223b176c68cf2559eed8244977f935b39be9.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c25
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase8-10.C75
4 files changed, 100 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7569249..361b20d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2001-07-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ * 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 <lerdsuwa@users.sourceforge.net>
* pt.c (tsubst_template_parms): Call maybe_fold_nontype_arg and
@@ -5,6 +10,7 @@
2001-07-26 Nathan Sidwell <nathan@codesourcery.com>
+ 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 4ff29a1..18ade13 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 70e87e0..4753dc2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2001-07-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/abi/vbase8-10.C: New test.
+
2001-07-27 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* 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 0000000..81896ed
--- /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 <nathan@codesourcery.com>
+
+// 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;
+}