PR c++/82764 - C++17 ICE with empty base
authorJason Merrill <jason@redhat.com>
Fri, 16 Feb 2018 16:44:26 +0000 (11:44 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 16 Feb 2018 16:44:26 +0000 (11:44 -0500)
* class.c (build_base_field_1): Set DECL_SIZE to zero for empty
base.

From-SVN: r257745

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/g++.dg/cpp0x/nsdmi-empty1.C [new file with mode: 0644]

index 17af63328ed1e610aa8aa0e9f83f4239d1d37369..141a64fbdc60cdf53ce9cf4b11a9795dab5b40d6 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-16  Jason Merrill  <jason@redhat.com>
+
+       PR c++/82764 - C++17 ICE with empty base
+       * class.c (build_base_field_1): Set DECL_SIZE to zero for empty base.
+
 2018-02-16  Jason Merrill  <jason@redhat.com>
 
        PR c++/84421 - type-dependent if constexpr
index e48a04ade7de9f32ddead55e83b8e1f992929f00..296305ea644a7d4ab9a23237c7bac9acb3ad4498 100644 (file)
@@ -4216,8 +4216,14 @@ build_base_field_1 (tree t, tree basetype, tree *&next_field)
   DECL_ARTIFICIAL (decl) = 1;
   DECL_IGNORED_P (decl) = 1;
   DECL_FIELD_CONTEXT (decl) = t;
-  DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
-  DECL_SIZE_UNIT (decl) = CLASSTYPE_SIZE_UNIT (basetype);
+  if (is_empty_class (basetype))
+    /* CLASSTYPE_SIZE is one byte, but the field needs to have size zero.  */
+    DECL_SIZE (decl) = DECL_SIZE_UNIT (decl) = size_zero_node;
+  else
+    {
+      DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
+      DECL_SIZE_UNIT (decl) = CLASSTYPE_SIZE_UNIT (basetype);
+    }
   SET_DECL_ALIGN (decl, CLASSTYPE_ALIGN (basetype));
   DECL_USER_ALIGN (decl) = CLASSTYPE_USER_ALIGN (basetype);
   SET_DECL_MODE (decl, TYPE_MODE (basetype));
diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-empty1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-empty1.C
new file mode 100644 (file)
index 0000000..66d94e5
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/82764
+// { dg-do compile { target c++11 } }
+
+struct Empty {};
+struct Empty2 : Empty {};
+
+struct A : Empty2
+{
+  int x {1};
+  int y {2};
+};
+
+struct B
+{
+  A a {};
+};
+
+B b;