aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2005-08-27 21:37:53 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2005-08-27 14:37:53 -0700
commit412f898605314d3c2eac39fc5e9774ea9a134f1c (patch)
treeb36e7c770eb95bb27062a0aa0a4a320f647f0343
parent147a8fb1ca28372e8beb030b1ca91b59f7be42b0 (diff)
downloadgcc-412f898605314d3c2eac39fc5e9774ea9a134f1c.zip
gcc-412f898605314d3c2eac39fc5e9774ea9a134f1c.tar.gz
gcc-412f898605314d3c2eac39fc5e9774ea9a134f1c.tar.bz2
re PR middle-end/23463 (va-arg-22.c execution fails)
2005-08-27 Andrew Pinski <pinskia@physics.uc.edu> 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 <pinskia@physics.uc.edu> PR middle-end/23463 * gcc.c-torture/execute/zero-struct-1.c: New test. From-SVN: r103571
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gimplify.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/zero-struct-1.c23
4 files changed, 48 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 68cdb66..424e2ca 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2005-08-27 Andrew Pinski <pinskia@physics.uc.edu>
+
+ 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 <dave.anflin@nrc-cnrc.gc.ca>
PR libgcj/23508
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 9b34970..7d76d66 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 be6077d..5821e1f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-08-27 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR middle-end/23463
+ * gcc.c-torture/execute/zero-struct-1.c: New test.
+
2005-08-27 Richard Guenther <rguenther@suse.de>
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 0000000..d673adf
--- /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;
+}