From 84894f850fd94064c2673de1d26a1390a65508dd Mon Sep 17 00:00:00 2001
From: Dodji Seketeli <dodji@redhat.com>
Date: Thu, 3 Dec 2009 08:33:03 +0000
Subject: [PATCH] re PR c++/42217 (ICE with zero-length bit-field)

Fix PR c++/42217

gcc/cp/ChangeLog
	PR c++/42217
	* class.c (remove_zero_width_bit_fields): The width of the bit field is
	in DECL_SIZE, not in DECL_INITIAL.

gcc/testsuite/ChangeLog
	PR c++/42217
	* g++.dg/other/bitfield4.C: New test.

From-SVN: r154938
---
 gcc/cp/ChangeLog                       |  6 ++++++
 gcc/cp/class.c                         |  7 ++++++-
 gcc/testsuite/ChangeLog                |  5 +++++
 gcc/testsuite/g++.dg/other/bitfield4.C | 10 ++++++++++
 4 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/other/bitfield4.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6753829fe333..f11ee70f0408 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2009-12-03  Dodji Seketeli  <dodji@redhat.com>
+
+	PR c++/42217
+	* class.c (remove_zero_width_bit_fields): The width of the bit field is
+	in DECL_SIZE, not in DECL_INITIAL.
+
 2009-12-03  Jakub Jelinek  <jakub@redhat.com>
 
 	PR c++/42256
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 1dcc2383794e..ca75bc15896f 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -4254,7 +4254,12 @@ remove_zero_width_bit_fields (tree t)
     {
       if (TREE_CODE (*fieldsp) == FIELD_DECL
 	  && DECL_C_BIT_FIELD (*fieldsp)
-	  && DECL_INITIAL (*fieldsp))
+          /* We should not be confused by the fact that grokbitfield
+	     temporarily sets the width of the bit field into
+	     DECL_INITIAL (*fieldsp).
+	     check_bitfield_decl eventually sets DECL_SIZE (*fieldsp)
+	     to that width.  */
+	  && integer_zerop (DECL_SIZE (*fieldsp)))
 	*fieldsp = TREE_CHAIN (*fieldsp);
       else
 	fieldsp = &TREE_CHAIN (*fieldsp);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index aeb92ac19dde..550c13633053 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-12-03  Dodji Seketeli  <dodji@redhat.com>
+
+	PR c++/42217
+	* g++.dg/other/bitfield4.C: New test.
+
 2009-12-03  Jakub Jelinek  <jakub@redhat.com>
 
 	PR c++/42256
diff --git a/gcc/testsuite/g++.dg/other/bitfield4.C b/gcc/testsuite/g++.dg/other/bitfield4.C
new file mode 100644
index 000000000000..d140f82cb63a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/bitfield4.C
@@ -0,0 +1,10 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/42217
+// { dg-do compile }
+
+struct A
+{
+ int : 0;
+};
+A a = A();
+
-- 
GitLab