From 8a5a37c0318cd558a1dc0fd867eaee55dcc51842 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Mar 2018 13:02:08 +0200 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/class.c | 17 +++++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/inherit/covariant22.C | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/inherit/covariant22.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 654e608c6b5..1f035c30dac 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-03-27 Jakub Jelinek + + 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 Jason Merrill diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 3edae0f5e61..debcaf21cf7 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 be30a45ebe8..1bce088faf3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-27 Jakub Jelinek + + PR c++/85068 + * g++.dg/inherit/covariant22.C: New test. + 2018-03-27 Richard Biener 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 00000000000..26c96e6abfc --- /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 (); +}; -- 2.30.2