diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-03-27 13:02:08 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-03-27 13:02:08 +0200 |
commit | 8a5a37c0318cd558a1dc0fd867eaee55dcc51842 (patch) | |
tree | e500e3cb2dad91e10a0464127fd2621765401e9d | |
parent | 36a4fb13d88960c9950a2a68b05321422245658a (diff) | |
download | gcc-8a5a37c0318cd558a1dc0fd867eaee55dcc51842.zip gcc-8a5a37c0318cd558a1dc0fd867eaee55dcc51842.tar.gz gcc-8a5a37c0318cd558a1dc0fd867eaee55dcc51842.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/class.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/covariant22.C | 19 |
4 files changed, 39 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 654e608..1f035c3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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> diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 3edae0f..debcaf2 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be30a45..1bce088 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/testsuite/g++.dg/inherit/covariant22.C b/gcc/testsuite/g++.dg/inherit/covariant22.C new file mode 100644 index 0000000..26c96e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant22.C @@ -0,0 +1,19 @@ +// 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 (); +}; |