aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-05-09 16:38:03 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-05-09 16:38:03 -0400
commitc0aad6778c5c5c9bf262b89edb91655a1df7da0e (patch)
tree89c6c8fd26b0b242fabfcf96a73edfc6e55bb10c /gcc
parent824c3184d7364aa92e9990b4f23cd5ede4ca53df (diff)
downloadgcc-c0aad6778c5c5c9bf262b89edb91655a1df7da0e.zip
gcc-c0aad6778c5c5c9bf262b89edb91655a1df7da0e.tar.gz
gcc-c0aad6778c5c5c9bf262b89edb91655a1df7da0e.tar.bz2
* class.c (check_bases): Ignore empty bases.
From-SVN: r247816
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog2
-rw-r--r--gcc/cp/class.c4
-rw-r--r--gcc/testsuite/g++.dg/ext/is_std_layout1.C12
3 files changed, 17 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3a12217..7c63318 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,7 @@
2017-05-09 Jason Merrill <jason@redhat.com>
+ * class.c (check_bases): Ignore empty bases.
+
PR c++/70979 - literal class and closure types
* class.c (finalize_literal_type_property): Handle closures
specifically.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index fc71766..085dbc3 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -1860,7 +1860,9 @@ check_bases (tree t,
members */
for (basefield = TYPE_FIELDS (basetype); basefield;
basefield = DECL_CHAIN (basefield))
- if (TREE_CODE (basefield) == FIELD_DECL)
+ if (TREE_CODE (basefield) == FIELD_DECL
+ && DECL_SIZE (basefield)
+ && !integer_zerop (DECL_SIZE (basefield)))
{
if (field)
CLASSTYPE_NON_STD_LAYOUT (t) = 1;
diff --git a/gcc/testsuite/g++.dg/ext/is_std_layout1.C b/gcc/testsuite/g++.dg/ext/is_std_layout1.C
new file mode 100644
index 0000000..007c94a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/is_std_layout1.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+template <int> struct E { };
+
+struct E1: E<0>, E<1> { };
+struct E2: E<2>, E<3> { };
+
+struct A1x { int n; };
+struct D2: A1x, E1, E2 { };
+
+#define SA(X) static_assert((X),#X)
+SA(__is_standard_layout (D2));