diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2005-03-01 09:57:45 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2005-03-01 09:57:45 +0000 |
commit | 742f25b311bbf5cc4f25a975f53413a85410292a (patch) | |
tree | 330aeb456e9bc16d26dfa8ee60bf99d4795606d6 /gcc/cp/class.c | |
parent | c363985db8d82f3c097689203d7d805716b6d950 (diff) | |
download | gcc-742f25b311bbf5cc4f25a975f53413a85410292a.zip gcc-742f25b311bbf5cc4f25a975f53413a85410292a.tar.gz gcc-742f25b311bbf5cc4f25a975f53413a85410292a.tar.bz2 |
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
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r-- | gcc/cp/class.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index f6ba914..ba89ea1 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2048,14 +2048,17 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals, tree thunk_binfo, base_binfo; /* 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), thunk_binfo = TYPE_BINFO (over_return); - !SAME_BINFO_TYPE_P (BINFO_TYPE (thunk_binfo), - BINFO_TYPE (base_binfo)); + 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. */ for (virtual_offset = thunk_binfo; virtual_offset; @@ -2063,7 +2066,8 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals, if (BINFO_VIRTUAL_P (virtual_offset)) 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)); |