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> 2014-01-16 Bernd Schmidt <bernds@codesourcery.com>
PR middle-end/56791 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> 2014-01-16 Jakub Jelinek <jakub@redhat.com>
PR middle-end/58344 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) ...@@ -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. */ represented in the binfo for the derived class. */
else if (offset != 0) else if (offset != 0)
{ {
tree base_binfo, found_binfo = NULL_TREE; tree base_binfo, binfo2 = binfo;
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
if (types_same_for_odr (TREE_TYPE (base_binfo), TREE_TYPE (fld))) /* Find BINFO corresponding to FLD. This is bit harder
{ by a fact that in virtual inheritance we may need to walk down
found_binfo = base_binfo; the non-virtual inheritance chain. */
break; while (true)
} {
if (!found_binfo) tree containing_binfo = NULL, found_binfo = NULL;
return NULL_TREE; for (i = 0; BINFO_BASE_ITERATE (binfo2, i, base_binfo); i++)
binfo = found_binfo; 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); 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