* testsuite/g++.dg/abi/empty11.C: New test.
* testsuite/g++.dg/rtti/cv1.C: New test.
* tree.c (cp_build_qualified_type_real): Correct handling of
array types.
* class.c (walk_subobject_offsets): Fix thinko.
(build_base_field): Record offsets of empty bases in primary
virtual bases.
(layout_class_type): Record offsets of empty bases in fields.
From-SVN: r59497
2002-11-25 Mark Mitchell <mark@codesourcery.com>
+ * tree.c (cp_build_qualified_type_real): Correct handling of
+ array types.
+ * class.c (walk_subobject_offsets): Fix thinko.
+ (build_base_field): Record offsets of empty bases in primary
+ virtual bases.
+ (layout_class_type): Record offsets of empty bases in fields.
+
* search.c (is_subobject_of_p_1): Fix thinko.
(lookup_field_queue_p): Likewise.
/* Walk through all the subobjects of TYPE (located at OFFSET). Call
F for every subobject, passing it the type, offset, and table of
- OFFSETS. If VBASES_P is nonzero, then even virtual non-primary
- bases should be traversed; otherwise, they are ignored.
+ OFFSETS. If VBASES_P is one, then virtual non-primary bases should
+ be traversed.
If MAX_OFFSET is non-NULL, then subobjects with an offset greater
than MAX_OFFSET will not be walked.
offsets,
max_offset,
/*vbases_p=*/0);
+ if (r)
+ return r;
}
}
offsets,
/*vbases_p=*/0);
+ if (abi_version_at_least (2))
+ {
+ /* If BINFO has a primary virtual base that is really going to
+ be located at the same offset as binfo, it will have been
+ skipped -- but we should record empty bases from there too. */
+ while (true)
+ {
+ tree b;
+
+ b = get_primary_binfo (binfo);
+ if (!b || BINFO_PRIMARY_BASE_OF (b) != binfo)
+ break;
+ if (TREE_VIA_VIRTUAL (b))
+ record_subobject_offsets (BINFO_TYPE (b),
+ BINFO_OFFSET (b),
+ offsets,
+ /*vbases_p=*/0);
+ binfo = b;
+ }
+ }
+
return next_field;
}
layout_nonempty_base_or_field (rli, field, NULL_TREE,
empty_base_offsets);
+ /* Remember the location of any empty classes in FIELD. */
+ if (abi_version_at_least (2))
+ record_subobject_offsets (TREE_TYPE (field),
+ byte_position(field),
+ empty_base_offsets,
+ /*vbases_p=*/1);
+
/* If a bit-field does not immediately follow another bit-field,
and yet it starts in the middle of a byte, we have failed to
comply with the ABI. */
if (element_type == error_mark_node)
return error_mark_node;
- /* See if we already have an identically qualified type. */
- t = get_qualified_type (type, type_quals);
-
- /* If we didn't already have it, create it now. */
- if (!t)
- {
- /* Make a new array type, just like the old one, but with the
- appropriately qualified element type. */
- t = build_type_copy (type);
- TREE_TYPE (t) = element_type;
- }
+ /* Make a new array type, just like the old one, but with the
+ appropriately qualified element type. */
+ t = build_type_copy (type);
+ TREE_TYPE (t) = element_type;
/* Even if we already had this variant, we update
TYPE_NEEDS_CONSTRUCTING and TYPE_HAS_NONTRIVIAL_DESTRUCTOR in case
+2002-11-25 Mark Mitchell <mark@codesourcery.com>
+
+ * testsuite/g++.dg/abi/empty11.C: New test.
+ * testsuite/g++.dg/rtti/cv1.C: New test.
+
2002-11-25 Hans-Peter Nilsson <hp@bitrange.com>
* lib/prune.exp: Prune more -fpic/-fPIC warnings.
--- /dev/null
+// { dg-do run }
+// { dg-options "-w -fabi-version=0" }
+
+struct E {};
+struct E2 : public E {};
+struct E3 : public E, public E2 {};
+struct E4 : public E, public E2, public E3 { };
+struct E5 : public E, public E2, public E3, public E4 {};
+
+struct S : public virtual E5 {
+ E e;
+};
+
+S s;
+
+int main () {
+ if ((char*)(E4*)&s - (char*)&s == 0)
+ return 1;
+}
--- /dev/null
+// { dg-do run }
+
+#include <typeinfo>
+#include <string.h>
+
+struct S {};
+
+typedef S volatile T[4];
+
+T t[3];
+
+const std::type_info& ti = typeid (t);
+
+int main () {
+ if (strcmp (ti.name (), "A3_A4_1S") != 0)
+ return 1;
+}