PR c++/80073 - C++17 ICE with virtual base.
authorJason Merrill <jason@redhat.com>
Fri, 17 Mar 2017 18:42:09 +0000 (14:42 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 17 Mar 2017 18:42:09 +0000 (14:42 -0400)
* decl.c (xref_basetypes): Also check for indirect vbases.

From-SVN: r246242

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/init/vbase2.C [new file with mode: 0644]

index 089d388..a5c150a 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/80073 - C++17 ICE with virtual base.
+       * decl.c (xref_basetypes): Also check for indirect vbases.
+
 2017-03-16  Jason Merrill  <jason@redhat.com>
 
        * decl.c (start_enum): std::byte aliases anything.
index 61ecf81..bf24e8b 100644 (file)
@@ -13812,6 +13812,9 @@ xref_basetypes (tree ref, tree base_list)
 
   if (max_vbases)
     {
+      /* An aggregate can't have virtual base classes.  */
+      CLASSTYPE_NON_AGGREGATE (ref) = true;
+
       vec_alloc (CLASSTYPE_VBASECLASSES (ref), max_vbases);
 
       if (max_dvbases)
diff --git a/gcc/testsuite/g++.dg/init/vbase2.C b/gcc/testsuite/g++.dg/init/vbase2.C
new file mode 100644 (file)
index 0000000..1711ea9
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/80073
+// { dg-do compile { target c++11 } }
+
+struct A {};
+
+struct B : virtual A {};
+
+struct C : B {} c {};