aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-03-27 13:02:08 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-03-27 13:02:08 +0200
commit8a5a37c0318cd558a1dc0fd867eaee55dcc51842 (patch)
treee500e3cb2dad91e10a0464127fd2621765401e9d
parent36a4fb13d88960c9950a2a68b05321422245658a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/class.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/inherit/covariant22.C19
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 ();
+};