From: dberlin Date: Thu, 2 Jun 2005 02:08:02 +0000 (+0000) Subject: 2005-06-01 Daniel Berlin X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=5d7bbf40fca8537c4d4fd1c9a1db5b0db017277e 2005-06-01 Daniel Berlin 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1531a278617..8b879e593e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-06-01 Daniel Berlin + + Fix PR tree-optimization/21839 + + * gimplify.c (zero_sized_field_decl): New function. + (gimplify_init_ctor_eval): Use it. + 2005-06-01 Josh Conner PR 21478 @@ -199,7 +206,6 @@ * Makefile.in: Update dependencies. - 2005-06-01 Danny Smith * config/i386/cygming.h (NO_PROFILE_COUNTERS): Define. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index a659e77bb83..3370f449d01 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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 index 00000000000..c02085c2dfd --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr21839.c @@ -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) { } }; + +} + +