This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR c/8032


Hi,

This is a regression from gcc 2.95.3, present in all gcc 3.x versions. GCC 
forgets pending initializers when encountering an empty one, because it 
wrongly assumes that the field corresponding to the latter is the first one 
not yet written out.

Bootstrapped/regtested on i586-redhat-linux-gnu (c,c++,objc,f77 mainline).
OK to install ? OK for the 3.2 branch after similar testing ?

-- 
Eric Botcazou


2002-11-26  Eric Botcazou  <ebotcazou@libertysurf.fr>

	PR c/8032
	* c-typeck.c (process_init_element): For an empty element,
	do not advance the pointer to unfilled fields if there are
	pending initializers.


2002-11-26  Eric Botcazou  <ebotcazou@libertysurf.fr>

	* gcc.c-torture/execute/20021126-1.c: New test.


Index: c-typeck.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-typeck.c,v
retrieving revision 1.212
diff -u -r1.212 c-typeck.c
--- c-typeck.c	4 Nov 2002 00:22:57 -0000	1.212
+++ c-typeck.c	26 Nov 2002 08:09:33 -0000
@@ -6618,13 +6618,18 @@
 			        bit_position (constructor_fields),
 			        DECL_SIZE (constructor_fields));
 
-	      constructor_unfilled_fields = TREE_CHAIN (constructor_fields);
-	      /* Skip any nameless bit fields.  */
-	      while (constructor_unfilled_fields != 0
-		     && DECL_C_BIT_FIELD (constructor_unfilled_fields)
-		     && DECL_NAME (constructor_unfilled_fields) == 0)
-		constructor_unfilled_fields =
-		  TREE_CHAIN (constructor_unfilled_fields);
+	      /* If the current field was the first one not yet written out,
+		 it isn't now, so update.  */
+	      if (constructor_unfilled_fields == constructor_fields)
+		{
+		  constructor_unfilled_fields = TREE_CHAIN (constructor_fields);
+		  /* Skip any nameless bit fields.  */
+		  while (constructor_unfilled_fields != 0
+			 && DECL_C_BIT_FIELD (constructor_unfilled_fields)
+			 && DECL_NAME (constructor_unfilled_fields) == 0)
+		    constructor_unfilled_fields =
+		      TREE_CHAIN (constructor_unfilled_fields);
+		}
 	    }
 
 	  constructor_fields = TREE_CHAIN (constructor_fields);


/* PR c/8032 */
/* Verify that an empty initializer inside a partial
   parent initializer doesn't confuse GCC.  */

struct X
{
  int a;
  int b;
  int z[0];
};

struct X x = { b:40, z:{} };

int main ()
{
  if (x.b != 40)
    abort ();

  return 0;
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]