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>
|
2001-09-06 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
Remove TYPE_NONCOPIED_PARTS.
|
Remove TYPE_NONCOPIED_PARTS.
|
||||||
|
|
|
@ -1437,7 +1437,8 @@ force_canonical_binfo_r (to, from, type, mappings)
|
||||||
tree mappings;
|
tree mappings;
|
||||||
{
|
{
|
||||||
int i, n_baseclasses = BINFO_N_BASETYPES (from);
|
int i, n_baseclasses = BINFO_N_BASETYPES (from);
|
||||||
|
|
||||||
|
my_friendly_assert (to != from, 20010905);
|
||||||
BINFO_INDIRECT_PRIMARY_P (to)
|
BINFO_INDIRECT_PRIMARY_P (to)
|
||||||
= BINFO_INDIRECT_PRIMARY_P (from);
|
= BINFO_INDIRECT_PRIMARY_P (from);
|
||||||
BINFO_INDIRECT_PRIMARY_P (from) = 0;
|
BINFO_INDIRECT_PRIMARY_P (from) = 0;
|
||||||
|
@ -1461,11 +1462,22 @@ force_canonical_binfo_r (to, from, type, mappings)
|
||||||
my_friendly_assert (same_type_p (BINFO_TYPE (to), BINFO_TYPE (from)),
|
my_friendly_assert (same_type_p (BINFO_TYPE (to), BINFO_TYPE (from)),
|
||||||
20010104);
|
20010104);
|
||||||
mappings = tree_cons (from, to, mappings);
|
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++)
|
for (i = 0; i != n_baseclasses; i++)
|
||||||
{
|
{
|
||||||
tree from_binfo = BINFO_BASETYPE (from, i);
|
tree from_binfo = BINFO_BASETYPE (from, i);
|
||||||
tree to_binfo = BINFO_BASETYPE (to, i);
|
tree to_binfo = BINFO_BASETYPE (to, i);
|
||||||
|
|
||||||
if (TREE_VIA_VIRTUAL (from_binfo))
|
if (TREE_VIA_VIRTUAL (from_binfo))
|
||||||
{
|
{
|
||||||
if (BINFO_PRIMARY_P (from_binfo) &&
|
if (BINFO_PRIMARY_P (from_binfo) &&
|
||||||
|
@ -1498,17 +1510,19 @@ force_canonical_binfo (to, from, type, mappings)
|
||||||
{
|
{
|
||||||
tree assoc = purpose_member (BINFO_TYPE (to),
|
tree assoc = purpose_member (BINFO_TYPE (to),
|
||||||
CLASSTYPE_VBASECLASSES (type));
|
CLASSTYPE_VBASECLASSES (type));
|
||||||
TREE_VALUE (assoc) = to;
|
if (TREE_VALUE (assoc) != to)
|
||||||
force_canonical_binfo_r (to, from, type, mappings);
|
{
|
||||||
|
TREE_VALUE (assoc) = to;
|
||||||
|
force_canonical_binfo_r (to, from, type, mappings);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make BASE_BINFO the primary virtual base of BINFO within the hierarchy
|
/* Make BASE_BINFO the a primary virtual base within the hierarchy
|
||||||
dominated by TYPE. Returns BASE_BINFO, if it can be made so, NULL
|
dominated by TYPE. Returns BASE_BINFO, if it is not already one, NULL
|
||||||
otherwise (because something else has already made it primary). */
|
otherwise (because something else has already made it primary). */
|
||||||
|
|
||||||
static tree
|
static tree
|
||||||
mark_primary_virtual_base (binfo, base_binfo, type)
|
mark_primary_virtual_base (base_binfo, type)
|
||||||
tree binfo;
|
|
||||||
tree base_binfo;
|
tree base_binfo;
|
||||||
tree type;
|
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
|
/* It's already allocated in the hierarchy. BINFO won't have a
|
||||||
primary base in this hierachy, even though the complete object
|
primary base in this hierachy, even though the complete object
|
||||||
BINFO is for, would do. */
|
BINFO is for, would do. */
|
||||||
BINFO_LOST_PRIMARY_P (binfo) = 1;
|
|
||||||
|
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1608,10 +1620,12 @@ mark_primary_bases (type)
|
||||||
base_binfo = get_primary_binfo (binfo);
|
base_binfo = get_primary_binfo (binfo);
|
||||||
|
|
||||||
if (TREE_VIA_VIRTUAL (base_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)
|
if (base_binfo)
|
||||||
BINFO_PRIMARY_BASE_OF (base_binfo) = binfo;
|
BINFO_PRIMARY_BASE_OF (base_binfo) = binfo;
|
||||||
|
else
|
||||||
|
BINFO_LOST_PRIMARY_P (binfo) = 1;
|
||||||
|
|
||||||
BINFO_UNSHARED_MARKED (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>
|
2001-09-05 Ziemowit Laski <zlaski@apple.com>
|
||||||
|
|
||||||
* objc.dg/method-2.m: New.
|
* 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