Commit f910753d by Jan Hubicka Committed by Jan Hubicka

re PR ipa/59775 (internal compiler error: Segmentation fault)


	PR ipa/59775
	* tree.c (get_binfo_at_offset): Look harder for virtual bases.

From-SVN: r206694
parent 90664160
2014-01-16 Jan Hubicka <jh@suse.cz>
PR ipa/59775
* tree.c (get_binfo_at_offset): Look harder for virtual bases.
2014-01-16 Bernd Schmidt <bernds@codesourcery.com>
PR middle-end/56791
......
2014-01-16 Jan Hubicka <jh@suse.cz>
PR ipa/59775
* g++.dg/torture/pr59775.C: New testcase.
2014-01-16 Jakub Jelinek <jakub@redhat.com>
PR middle-end/58344
......
// { dg-do compile }
struct A
{
virtual void foo () = 0;
void bar () { foo (); }
bool a;
};
struct B : public virtual A
{
virtual void foo ();
};
struct C : public B
{
C ();
};
void
baz ()
{
C c;
c.bar ();
}
......@@ -11995,16 +11995,35 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
represented in the binfo for the derived class. */
else if (offset != 0)
{
tree base_binfo, found_binfo = NULL_TREE;
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
if (types_same_for_odr (TREE_TYPE (base_binfo), TREE_TYPE (fld)))
{
found_binfo = base_binfo;
break;
}
if (!found_binfo)
return NULL_TREE;
binfo = found_binfo;
tree base_binfo, binfo2 = binfo;
/* Find BINFO corresponding to FLD. This is bit harder
by a fact that in virtual inheritance we may need to walk down
the non-virtual inheritance chain. */
while (true)
{
tree containing_binfo = NULL, found_binfo = NULL;
for (i = 0; BINFO_BASE_ITERATE (binfo2, i, base_binfo); i++)
if (types_same_for_odr (TREE_TYPE (base_binfo), TREE_TYPE (fld)))
{
found_binfo = base_binfo;
break;
}
else
if (BINFO_OFFSET (base_binfo) - BINFO_OFFSET (binfo) < pos
&& (!containing_binfo
|| (BINFO_OFFSET (containing_binfo)
< BINFO_OFFSET (base_binfo))))
containing_binfo = base_binfo;
if (found_binfo)
{
binfo = found_binfo;
break;
}
if (!containing_binfo)
return NULL_TREE;
binfo2 = containing_binfo;
}
}
type = TREE_TYPE (fld);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment