]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/85068 (ICE with invalid covariant return type hierarchy)
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 17:39:55 +0000 (19:39 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 17:39:55 +0000 (19:39 +0200)
Backported from mainline
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.

* g++.dg/inherit/covariant22.C: New test.

From-SVN: r262086

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/covariant22.C [new file with mode: 0644]

index c831f14f09c4dd82c899a2bc92a0e5e9677fba91..92171f91b91129042e4eaf33b28886de4edd515d 100644 (file)
@@ -1,6 +1,12 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84874
index 86e7e003fe49f1fd11922c89bdef4b0c30ce6682..6de0421d6dc6571c12deff22247bdbe4e4433cd5 100644 (file)
@@ -2669,19 +2669,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;
index 8fcb4c316c9e7be9cf73437850945d0263729dd7..3eef4e304fb5e8b9ddf4dfc36bffa76ef502299b 100644 (file)
@@ -1,6 +1,11 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2018-03-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/85068
+       * g++.dg/inherit/covariant22.C: New test.
+
        2018-03-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR inline-asm/85034
diff --git a/gcc/testsuite/g++.dg/inherit/covariant22.C b/gcc/testsuite/g++.dg/inherit/covariant22.C
new file mode 100644 (file)
index 0000000..26c96e6
--- /dev/null
@@ -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 ();
+};