diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6753829fe333a674c5648891b2dae4630e63515d..f11ee70f04081dcfe86c75e8e24be4c31ed49b01 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 1dcc2383794e871be2d55e730fb13ad932325adf..ca75bc15896fb476ffc4294c6e5cd2a263386544 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 aeb92ac19dde0032677756f882acf57175943b29..550c13633053424d307cb6bfbe040d93fc26afc4 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 0000000000000000000000000000000000000000..d140f82cb63a65b7eba0d5b90e1614efa18b3329
--- /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();
+