This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Fix ICE with bitfields (PR c++/69164)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 7 Jan 2016 22:43:29 +0100
- Subject: [C++ PATCH] Fix ICE with bitfields (PR c++/69164)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
We ICE on the following testcase during SRA, because it sees a field
with DECL_SIZE of 1 which is not DECL_BIT_FIELD. The problem is that
layout_class_type in some cases copies fields, including DECL_SIZE, but does
not copy over DECL_BIT_FIELD flag. The following patch copies even that
and also DECL_SIZE_UNIT and DEC_BIT_FIELD_TYPE that weren't copied either.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2016-01-07 Jakub Jelinek <jakub@redhat.com>
PR c++/69164
* class.c (layout_class_type): Also copy DEC_SIZE_UNIT, DECL_BIT_FIELD
and DEC_BIT_FIELD_TYPE.
* g++.dg/opt/pr69164.C: New test.
--- gcc/cp/class.c.jj 2016-01-04 14:55:57.000000000 +0100
+++ gcc/cp/class.c 2016-01-07 13:59:13.895677297 +0100
@@ -6493,7 +6493,10 @@ layout_class_type (tree t, tree *virtual
DECL_FIELD_BIT_OFFSET (*next_field)
= DECL_FIELD_BIT_OFFSET (field);
DECL_SIZE (*next_field) = DECL_SIZE (field);
+ DECL_SIZE_UNIT (*next_field) = DECL_SIZE_UNIT (field);
DECL_MODE (*next_field) = DECL_MODE (field);
+ DECL_BIT_FIELD (*next_field) = DECL_BIT_FIELD (field);
+ DECL_BIT_FIELD_TYPE (*next_field) = DECL_BIT_FIELD_TYPE (field);
next_field = &DECL_CHAIN (*next_field);
}
--- gcc/testsuite/g++.dg/opt/pr69164.C.jj 2016-01-07 13:56:33.013915214 +0100
+++ gcc/testsuite/g++.dg/opt/pr69164.C 2016-01-07 13:55:57.000000000 +0100
@@ -0,0 +1,30 @@
+// PR c++/69164
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2" }
+
+struct A {
+ struct B {
+ B () {}
+ bool : 1;
+ };
+ B foo () { B r; return r; }
+};
+
+struct C {
+ struct D {
+ D (C *x) : d (x->c.foo ()) {}
+ A::B d;
+ };
+ A c;
+};
+
+struct F : C {
+ D f = this;
+ F (int, int) {}
+};
+
+void
+bar (int a, int b)
+{
+ F (b, a);
+}
Jakub