Commit 742f25b3 by Nathan Sidwell Committed by Nathan Sidwell

re PR c++/20232 (ICE with covariancy)

cp:
	PR c++/20232
	* class.c (update_vtable_entry_for_fn): Don't crash on invalid
	covariancy.

	* cp-tree.g (THUNK_TARGET): Expand comment.
	* method.c (use_thunk): Make sure we also use the target, if that
	is a thunk.
testsuite:
	PR c++/20232
	* g++.dg/inherit/covariant12.C: New.

From-SVN: r95733
parent c363985d
2005-03-01 Nathan Sidwell <nathan@codesourcery.com>
PR c++/20232
* class.c (update_vtable_entry_for_fn): Don't crash on invalid
covariancy.
* cp-tree.g (THUNK_TARGET): Expand comment.
* method.c (use_thunk): Make sure we also use the target, if that
is a thunk.
2005-02-27 Jakub Jelinek <jakub@redhat.com> 2005-02-27 Jakub Jelinek <jakub@redhat.com>
PR c++/20206 PR c++/20206
......
...@@ -2048,14 +2048,17 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals, ...@@ -2048,14 +2048,17 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
tree thunk_binfo, base_binfo; tree thunk_binfo, base_binfo;
/* Find the base binfo within the overriding function's /* Find the base binfo within the overriding function's
return type. */ 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), for (base_binfo = TYPE_BINFO (base_return),
thunk_binfo = TYPE_BINFO (over_return); thunk_binfo = TYPE_BINFO (over_return);
!SAME_BINFO_TYPE_P (BINFO_TYPE (thunk_binfo), thunk_binfo;
BINFO_TYPE (base_binfo));
thunk_binfo = TREE_CHAIN (thunk_binfo)) thunk_binfo = TREE_CHAIN (thunk_binfo))
continue; if (SAME_BINFO_TYPE_P (BINFO_TYPE (thunk_binfo),
BINFO_TYPE (base_binfo)))
break;
/* See if virtual inheritance is involved. */ /* See if virtual inheritance is involved. */
for (virtual_offset = thunk_binfo; for (virtual_offset = thunk_binfo;
virtual_offset; virtual_offset;
...@@ -2063,7 +2066,8 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals, ...@@ -2063,7 +2066,8 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
if (BINFO_VIRTUAL_P (virtual_offset)) if (BINFO_VIRTUAL_P (virtual_offset))
break; break;
if (virtual_offset || !BINFO_OFFSET_ZEROP (thunk_binfo)) if (virtual_offset
|| (thunk_binfo && !BINFO_OFFSET_ZEROP (thunk_binfo)))
{ {
tree offset = convert (ssizetype, BINFO_OFFSET (thunk_binfo)); tree offset = convert (ssizetype, BINFO_OFFSET (thunk_binfo));
......
...@@ -2913,7 +2913,8 @@ struct lang_decl GTY(()) ...@@ -2913,7 +2913,8 @@ struct lang_decl GTY(())
#define THUNK_ALIAS(DECL) \ #define THUNK_ALIAS(DECL) \
(DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->decl_flags.u.template_info) (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->decl_flags.u.template_info)
/* For thunk NODE, this is the FUNCTION_DECL thunked to. */ /* For thunk NODE, this is the FUNCTION_DECL thunked to. It is
possible for the target to be a thunk too. */
#define THUNK_TARGET(NODE) \ #define THUNK_TARGET(NODE) \
(DECL_LANG_SPECIFIC (NODE)->u.f.befriending_classes) (DECL_LANG_SPECIFIC (NODE)->u.f.befriending_classes)
......
...@@ -328,6 +328,10 @@ use_thunk (tree thunk_fndecl, bool emit_p) ...@@ -328,6 +328,10 @@ use_thunk (tree thunk_fndecl, bool emit_p)
There's no need to process this thunk again. */ There's no need to process this thunk again. */
return; return;
if (DECL_THUNK_P (function))
/* The target is itself a thunk, process it now. */
use_thunk (function, emit_p);
/* Thunks are always addressable; they only appear in vtables. */ /* Thunks are always addressable; they only appear in vtables. */
TREE_ADDRESSABLE (thunk_fndecl) = 1; TREE_ADDRESSABLE (thunk_fndecl) = 1;
......
2005-03-01 Nathan Sidwell <nathan@codesourcery.com>
PR c++/20232
* g++.dg/inherit/covariant12.C: New.
2005-02-28 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de> 2005-02-28 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/19479 PR fortran/19479
......
// Copyright (C) 2004 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 27 Feb 2005<nathan@codesourcery.com>
// PR 20232: ICE on invalid
struct T { };
struct S;
struct B
{
virtual T *Foo (); // { dg-error "overriding" "" }
};
struct D : B
{
virtual S *Foo (); // { dg-error "invalid covariant" "" }
};
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