From dca267461a4ec936658e9dccdb952a2ca4b9f3e4 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 23 Sep 2010 11:00:27 +0000 Subject: [PATCH] re PR tree-optimization/45750 (ICE: in iterative_hash_expr, at tree.c:6831 on invalid code) 2010-09-23 Richard Guenther PR middle-end/45750 * gimplify.c (gimplify_expr): Properly pass on GS_ERROR when gimplifying MEM_REF. * gcc.dg/pr45750.c: New testcase. From-SVN: r164555 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 6 +++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr45750.c | 16 ++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr45750.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3f2e66fdebe7..4b5294cbf0d1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-09-23 Richard Guenther + + PR middle-end/45750 + * gimplify.c (gimplify_expr): Properly pass on GS_ERROR when + gimplifying MEM_REF. + 2010-09-23 Alan Modra * config/rs6000/rs6000.c (toc_relative_ok): Delete. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 4e6a037e7ae0..994ffdecea26 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -6809,8 +6809,10 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p, is_gimple_reg, fb_rvalue); - recalculate_side_effects (*expr_p); + if (ret == GS_ERROR) + break; + recalculate_side_effects (*expr_p); *expr_p = fold_build2_loc (input_location, MEM_REF, TREE_TYPE (*expr_p), TREE_OPERAND (*expr_p, 0), @@ -6835,6 +6837,8 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, } ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p, is_gimple_mem_ref_addr, fb_rvalue); + if (ret == GS_ERROR) + break; recalculate_side_effects (*expr_p); ret = GS_ALL_DONE; break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e102d0301bf9..050e571e5ce9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-09-23 Richard Guenther + + PR middle-end/45750 + * gcc.dg/pr45750.c: New testcase. + 2010-09-23 Jakub Jelinek * gcc.dg/torture/stackalign/alloca-4.c: Remove -m32 from dg-options. diff --git a/gcc/testsuite/gcc.dg/pr45750.c b/gcc/testsuite/gcc.dg/pr45750.c new file mode 100644 index 000000000000..22c471b70700 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr45750.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +struct S +{ + int i; +}; + +int invalid[] = 0; /* { dg-error "invalid initializer" } */ + +void foo (void) +{ + if (((struct S *)undeclared)->i); /* { dg-error "undeclared" } */ +} + +/* { dg-message "reported only once" "" { target *-*-* } 13 } */