re PR c++/3986 (ICE in build_rtti_vtbl_entries)
cp: PR c++/3986 * class.c (force_canonical_binfo_r): Check & move an indirect primary base first. (force_canonical_binfo): Check that it's not already canonical. (mark_primary_virtual_base): Remove BINFO parameter. (mark_primary_bases): Adjust, set BINFO_LOST_PRIMARY_P here. testsuite: PR c++/3986 * g++.dg/abi/vbase1.C: New test. From-SVN: r45435
This commit is contained in:
parent
6d0a3f67bb
commit
39e78d8bfc
|
@ -1,3 +1,13 @@
|
|||
2001-09-06 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/3986
|
||||
* class.c (force_canonical_binfo_r): Check & move an indirect
|
||||
primary base first.
|
||||
(force_canonical_binfo): Check that it's not already
|
||||
canonical.
|
||||
(mark_primary_virtual_base): Remove BINFO parameter.
|
||||
(mark_primary_bases): Adjust, set BINFO_LOST_PRIMARY_P here.
|
||||
|
||||
2001-09-06 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
Remove TYPE_NONCOPIED_PARTS.
|
||||
|
|
|
@ -1438,6 +1438,7 @@ force_canonical_binfo_r (to, from, type, mappings)
|
|||
{
|
||||
int i, n_baseclasses = BINFO_N_BASETYPES (from);
|
||||
|
||||
my_friendly_assert (to != from, 20010905);
|
||||
BINFO_INDIRECT_PRIMARY_P (to)
|
||||
= BINFO_INDIRECT_PRIMARY_P (from);
|
||||
BINFO_INDIRECT_PRIMARY_P (from) = 0;
|
||||
|
@ -1461,6 +1462,17 @@ force_canonical_binfo_r (to, from, type, mappings)
|
|||
my_friendly_assert (same_type_p (BINFO_TYPE (to), BINFO_TYPE (from)),
|
||||
20010104);
|
||||
mappings = tree_cons (from, to, mappings);
|
||||
|
||||
if (CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (from))
|
||||
&& TREE_VIA_VIRTUAL (CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (from))))
|
||||
{
|
||||
tree from_primary = get_primary_binfo (from);
|
||||
|
||||
if (BINFO_PRIMARY_BASE_OF (from_primary) == from)
|
||||
force_canonical_binfo (get_primary_binfo (to), from_primary,
|
||||
type, mappings);
|
||||
}
|
||||
|
||||
for (i = 0; i != n_baseclasses; i++)
|
||||
{
|
||||
tree from_binfo = BINFO_BASETYPE (from, i);
|
||||
|
@ -1498,17 +1510,19 @@ force_canonical_binfo (to, from, type, mappings)
|
|||
{
|
||||
tree assoc = purpose_member (BINFO_TYPE (to),
|
||||
CLASSTYPE_VBASECLASSES (type));
|
||||
if (TREE_VALUE (assoc) != to)
|
||||
{
|
||||
TREE_VALUE (assoc) = to;
|
||||
force_canonical_binfo_r (to, from, type, mappings);
|
||||
}
|
||||
}
|
||||
|
||||
/* Make BASE_BINFO the primary virtual base of BINFO within the hierarchy
|
||||
dominated by TYPE. Returns BASE_BINFO, if it can be made so, NULL
|
||||
/* Make BASE_BINFO the a primary virtual base within the hierarchy
|
||||
dominated by TYPE. Returns BASE_BINFO, if it is not already one, NULL
|
||||
otherwise (because something else has already made it primary). */
|
||||
|
||||
static tree
|
||||
mark_primary_virtual_base (binfo, base_binfo, type)
|
||||
tree binfo;
|
||||
mark_primary_virtual_base (base_binfo, type)
|
||||
tree base_binfo;
|
||||
tree type;
|
||||
{
|
||||
|
@ -1519,8 +1533,6 @@ mark_primary_virtual_base (binfo, base_binfo, type)
|
|||
/* It's already allocated in the hierarchy. BINFO won't have a
|
||||
primary base in this hierachy, even though the complete object
|
||||
BINFO is for, would do. */
|
||||
BINFO_LOST_PRIMARY_P (binfo) = 1;
|
||||
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
|
@ -1608,10 +1620,12 @@ mark_primary_bases (type)
|
|||
base_binfo = get_primary_binfo (binfo);
|
||||
|
||||
if (TREE_VIA_VIRTUAL (base_binfo))
|
||||
base_binfo = mark_primary_virtual_base (binfo, base_binfo, type);
|
||||
base_binfo = mark_primary_virtual_base (base_binfo, type);
|
||||
|
||||
if (base_binfo)
|
||||
BINFO_PRIMARY_BASE_OF (base_binfo) = binfo;
|
||||
else
|
||||
BINFO_LOST_PRIMARY_P (binfo) = 1;
|
||||
|
||||
BINFO_UNSHARED_MARKED (binfo) = 1;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2001-09-06 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/3986
|
||||
* g++.dg/abi/vbase1.C: New test.
|
||||
|
||||
2001-09-05 Ziemowit Laski <zlaski@apple.com>
|
||||
|
||||
* objc.dg/method-2.m: New.
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
// { dg-do compile }
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
// Contributed by Nathan Sidwell 5 Sept 2001 <nathan@codesourcery.com>
|
||||
|
||||
// Bug 3986. Another indirect primary base problem.
|
||||
|
||||
struct Consts
|
||||
{
|
||||
};
|
||||
|
||||
struct MathLib :
|
||||
virtual Consts
|
||||
{
|
||||
};
|
||||
|
||||
struct Parallel :
|
||||
virtual Consts
|
||||
{
|
||||
};
|
||||
|
||||
struct Particles :
|
||||
virtual MathLib,
|
||||
virtual Parallel
|
||||
{
|
||||
};
|
||||
|
||||
struct Ring :
|
||||
virtual Particles
|
||||
{
|
||||
};
|
||||
|
||||
struct Injection :
|
||||
virtual Particles,
|
||||
virtual Ring
|
||||
{
|
||||
};
|
||||
|
||||
struct LSpaceCharge :
|
||||
virtual Ring,
|
||||
virtual Injection
|
||||
{
|
||||
};
|
||||
|
||||
struct Bump :
|
||||
virtual Consts
|
||||
{
|
||||
};
|
||||
|
||||
struct Output :
|
||||
virtual Injection,
|
||||
virtual Bump
|
||||
{
|
||||
};
|
||||
|
||||
struct Plots :
|
||||
virtual LSpaceCharge,
|
||||
virtual Output
|
||||
{
|
||||
};
|
Loading…
Reference in New Issue