Commit 8a5a37c0 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/85068 (ICE with invalid covariant return type hierarchy)

	PR c++/85068
	* class.c (update_vtable_entry_for_fn): Don't ICE if base_binfo
	is NULL.  Assert if thunk_binfo is NULL then errorcount is non-zero.

	* g++.dg/inherit/covariant22.C: New test.

From-SVN: r258873
parent 36a4fb13
2018-03-27 Jakub Jelinek <jakub@redhat.com>
PR c++/85068
* class.c (update_vtable_entry_for_fn): Don't ICE if base_binfo
is NULL. Assert if thunk_binfo is NULL then errorcount is non-zero.
2018-03-27 Paolo Carlini <paolo.carlini@oracle.com>
Jason Merrill <jason@redhat.com>
......
......@@ -2479,19 +2479,20 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
order. Of course it is lame that we have to repeat the
search here anyway -- we should really be caching pieces
of the vtable and avoiding this repeated work. */
tree thunk_binfo, base_binfo;
tree thunk_binfo = NULL_TREE;
tree base_binfo = TYPE_BINFO (base_return);
/* Find the base binfo within the overriding function's
return type. We will always find a thunk_binfo, except
when the covariancy is invalid (which we will have
already diagnosed). */
for (base_binfo = TYPE_BINFO (base_return),
thunk_binfo = TYPE_BINFO (over_return);
thunk_binfo;
thunk_binfo = TREE_CHAIN (thunk_binfo))
if (SAME_BINFO_TYPE_P (BINFO_TYPE (thunk_binfo),
BINFO_TYPE (base_binfo)))
break;
if (base_binfo)
for (thunk_binfo = TYPE_BINFO (over_return); thunk_binfo;
thunk_binfo = TREE_CHAIN (thunk_binfo))
if (SAME_BINFO_TYPE_P (BINFO_TYPE (thunk_binfo),
BINFO_TYPE (base_binfo)))
break;
gcc_assert (thunk_binfo || errorcount);
/* See if virtual inheritance is involved. */
for (virtual_offset = thunk_binfo;
......
2018-03-27 Jakub Jelinek <jakub@redhat.com>
PR c++/85068
* g++.dg/inherit/covariant22.C: New test.
2018-03-27 Richard Biener <rguenther@suse.de>
PR testsuite/84004
......
// PR c++/85068
// { dg-do compile }
struct A;
struct B
{
virtual A *foo (); // { dg-error "overriding" }
};
struct C : virtual B
{
virtual C *foo (); // { dg-error "invalid covariant return type for" }
};
struct D : C
{
virtual C *foo ();
};
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