From 412f898605314d3c2eac39fc5e9774ea9a134f1c Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Sat, 27 Aug 2005 21:37:53 +0000 Subject: [PATCH] re PR middle-end/23463 (va-arg-22.c execution fails) 2005-08-27 Andrew Pinski PR middle-end/23463 * gimplify.c (gimplify_modify_expr_rhs): Remove check for zero sized types. (gimplify_modify_expr): Check for zero sized types and gimplify the rhs and lhs as statements. 2005-08-27 Andrew Pinski PR middle-end/23463 * gcc.c-torture/execute/zero-struct-1.c: New test. From-SVN: r103571 --- gcc/ChangeLog | 8 +++++++ gcc/gimplify.c | 18 ++++++++++----- gcc/testsuite/ChangeLog | 5 ++++ .../gcc.c-torture/execute/zero-struct-1.c | 23 +++++++++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/zero-struct-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 68cdb6658b0..424e2caac76 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-08-27 Andrew Pinski + + PR middle-end/23463 + * gimplify.c (gimplify_modify_expr_rhs): Remove check for zero sized + types. + (gimplify_modify_expr): Check for zero sized types and gimplify the + rhs and lhs as statements. + 2005-08-27 John David Anglin PR libgcj/23508 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 9b34970647f..7d76d66c507 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -2965,12 +2965,6 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p, tree *post_p, bool want_value) { enum gimplify_status ret = GS_OK; - tree type = TREE_TYPE (*from_p); - if (zero_sized_type (type)) - { - *expr_p = NULL_TREE; - return GS_ALL_DONE; - } while (ret != GS_UNHANDLED) switch (TREE_CODE (*from_p)) @@ -3164,6 +3158,18 @@ gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value) /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer useful. */ if (TREE_CODE (*expr_p) == INIT_EXPR) TREE_SET_CODE (*expr_p, MODIFY_EXPR); + + /* For zero sized types only gimplify the left hand side and right hand side + as statements and throw away the assignment. */ + if (zero_sized_type (TREE_TYPE (*from_p))) + { + gimplify_stmt (from_p); + gimplify_stmt (to_p); + append_to_statement_list (*from_p, pre_p); + append_to_statement_list (*to_p, pre_p); + *expr_p = NULL_TREE; + return GS_ALL_DONE; + } /* See if any simplifications can be done based on what the RHS is. */ ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be6077d6163..5821e1f8bc6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-08-27 Andrew Pinski + + PR middle-end/23463 + * gcc.c-torture/execute/zero-struct-1.c: New test. + 2005-08-27 Richard Guenther PR target/23575 diff --git a/gcc/testsuite/gcc.c-torture/execute/zero-struct-1.c b/gcc/testsuite/gcc.c-torture/execute/zero-struct-1.c new file mode 100644 index 00000000000..d673adf5c31 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/zero-struct-1.c @@ -0,0 +1,23 @@ +struct g{}; +char y[3]; +char *f = &y[0]; +char *ff = &y[0]; +void h(void) +{ + struct g t; + *((struct g*)(f++)) = *((struct g*)(ff++)); + *((struct g*)(f++)) = (struct g){}; + t = *((struct g*)(ff++)); +} + +void abort (void); + +int main(void) +{ + h(); + if (f != &y[2]) + abort(); + if (ff != &y[2]) + abort(); + return 0; +} -- 2.30.2