OSDN Git Service

2005-06-01 Daniel Berlin <dberlin@dberlin.org>
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Jun 2005 02:08:02 +0000 (02:08 +0000)
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Jun 2005 02:08:02 +0000 (02:08 +0000)
Fix PR tree-optimization/21839

* gimplify.c (zero_sized_field_decl): New function.
(gimplify_init_ctor_eval): Use it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100477 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/gcc.c-torture/compile/pr21839.c [new file with mode: 0644]

index 1531a27..8b879e5 100644 (file)
@@ -1,3 +1,10 @@
+2005-06-01  Daniel Berlin  <dberlin@dberlin.org>
+
+       Fix PR tree-optimization/21839
+
+       * gimplify.c (zero_sized_field_decl): New function.
+       (gimplify_init_ctor_eval): Use it.
+
 2005-06-01  Josh Conner <jconner@apple.com>
 
        PR 21478
        
        * Makefile.in: Update dependencies.
        
-
 2005-06-01  Danny Smith  <dannysmith@users.sourceforge.net>
 
        * config/i386/cygming.h (NO_PROFILE_COUNTERS): Define.
index a659e77..3370f44 100644 (file)
@@ -2501,6 +2501,17 @@ gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
                            pre_p);
 }
 
+/* Return true if FDECL is accessing a field that is zero sized.  */
+   
+static bool
+zero_sized_field_decl (tree fdecl)
+{
+  if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl) 
+      && integer_zerop (DECL_SIZE (fdecl)))
+    return true;
+  return false;
+}
+
 /* A subroutine of gimplify_init_constructor.  Generate individual
    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
    assignments should happen.  LIST is the CONSTRUCTOR_ELTS of the
@@ -2533,6 +2544,9 @@ gimplify_init_ctor_eval (tree object, tree list, tree *pre_p, bool cleared)
         so we don't have to figure out what's missing ourselves.  */
       gcc_assert (purpose);
 
+      if (zero_sized_field_decl (purpose))
+       continue;
+
       /* If we have a RANGE_EXPR, we have to build a loop to assign the
         whole range.  */
       if (TREE_CODE (purpose) == RANGE_EXPR)
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21839.c b/gcc/testsuite/gcc.c-torture/compile/pr21839.c
new file mode 100644 (file)
index 0000000..c02085c
--- /dev/null
@@ -0,0 +1,12 @@
+ typedef struct { } spinlock_t;
+typedef struct {
+ unsigned sequence;
+ spinlock_t lock;
+} seqlock_t;
+void ext3_new_inode(seqlock_t *rsv_seqlock)
+{
+ *rsv_seqlock = (seqlock_t) { 0, (spinlock_t) { } };
+
+}
+
+