From: Jason Merrill Date: Thu, 20 May 1999 12:21:53 +0000 (+0000) Subject: class.c (finish_struct_1): Still check for ANON_AGGR_TYPE_P. X-Git-Tag: releases/libgcj-2.95.0~435 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d813d4d850ce5b22d74f3479822dfe91c0fe35f;p=thirdparty%2Fgcc.git class.c (finish_struct_1): Still check for ANON_AGGR_TYPE_P. * class.c (finish_struct_1): Still check for ANON_AGGR_TYPE_P. * class.c (finish_base_struct): Allow non-COM bases for COM classes except at the leftmost position. (modify_one_vtable, fixup_vtable_deltas1, override_one_vtable): Pass the binfo's class, not the most derived, to skip_rtti_stuff. * search.c (get_abstract_virtuals, expand_upcast_fixups): Likewise. From-SVN: r27065 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 801aeea9e6d9..5ac9e81f7360 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,13 @@ 1999-05-20 Jason Merrill + * class.c (finish_struct_1): Still check for ANON_AGGR_TYPE_P. + + * class.c (finish_base_struct): Allow non-COM bases for COM classes + except at the leftmost position. + (modify_one_vtable, fixup_vtable_deltas1, override_one_vtable): + Pass the binfo's class, not the most derived, to skip_rtti_stuff. + * search.c (get_abstract_virtuals, expand_upcast_fixups): Likewise. + * tree.c (lvalue_p_1): A NOP_EXPR can be an lvalue. (build_cplus_new): Make sure that what we return is of the right type. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 94c891ead81a..fe56078644c6 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1649,7 +1649,7 @@ finish_base_struct (t, b) ("COM interface type `%T' must be the leftmost base class", basetype); } - else if (CLASSTYPE_COM_INTERFACE (t)) + else if (CLASSTYPE_COM_INTERFACE (t) && i == 0) { cp_error ("COM interface type `%T' with non-COM base class `%T'", t, basetype); @@ -2356,7 +2356,7 @@ modify_one_vtable (binfo, t, fndecl, pfn) if (fndecl == NULL_TREE) return; - n = skip_rtti_stuff (&virtuals, t); + n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo)); while (virtuals) { @@ -2450,7 +2450,7 @@ fixup_vtable_deltas1 (binfo, t) tree virtuals = BINFO_VIRTUALS (binfo); unsigned HOST_WIDE_INT n; - n = skip_rtti_stuff (&virtuals, t); + n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo)); while (virtuals) { @@ -2623,8 +2623,8 @@ override_one_vtable (binfo, old, t) if (BINFO_NEW_VTABLE_MARKED (binfo)) choose = NEITHER; - skip_rtti_stuff (&virtuals, t); - skip_rtti_stuff (&old_virtuals, t); + skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo)); + skip_rtti_stuff (&old_virtuals, BINFO_TYPE (binfo)); while (virtuals) { @@ -3523,7 +3523,7 @@ finish_struct_1 (t, warn_anon) while (TREE_CODE (type) == ARRAY_TYPE) type = TREE_TYPE (type); - if (CLASS_TYPE_P (type)) + if (CLASS_TYPE_P (type) && ! ANON_AGGR_TYPE_P (type)) { /* Never let anything with uninheritable virtuals make it through without complaint. */ diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 906aa131b3d4..63b733d3ad82 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -2013,7 +2013,7 @@ get_abstract_virtuals (type) { tree virtuals = BINFO_VIRTUALS (vbases); - skip_rtti_stuff (&virtuals, type); + skip_rtti_stuff (&virtuals, BINFO_TYPE (vbases)); while (virtuals) { @@ -2476,7 +2476,7 @@ expand_upcast_fixups (binfo, addr, orig_addr, vbase, vbase_addr, t, *vbase_offsets = delta; } - n = skip_rtti_stuff (&virtuals, t); + n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo)); while (virtuals) {