From 16089886c228cc1361ddc01ac3461017dc1072c3 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 2 Oct 2007 20:50:46 +0000 Subject: [PATCH] re PR middle-end/33617 (ICE for nonconstant callee-copied constructor arguments) gcc/ PR middle-end/33617 * expr.c (expand_expr_addr_expr_1): Pass CONSTRUCTORs to expand_expr. gcc/testsuite/ PR middle-end/33617 * gcc.c-torture/compile/pr33617.c: New test. From-SVN: r128965 --- gcc/ChangeLog | 6 ++++++ gcc/expr.c | 10 ++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr33617.c | 7 +++++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr33617.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1f28f7..bfa860c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-10-02 Richard Sandiford + + PR middle-end/33617 + * expr.c (expand_expr_addr_expr_1): Pass CONSTRUCTORs to + expand_expr. + 2007-10-02 David Daney * config/mips/mips.md (sync_compare_and_swap): Handle compare diff --git a/gcc/expr.c b/gcc/expr.c index 9d2a61a..6b7ba16 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6740,8 +6740,7 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode, /* ??? This should be considered a front-end bug. We should not be generating ADDR_EXPR of something that isn't an LVALUE. The only exception here is STRING_CST. */ - if (TREE_CODE (exp) == CONSTRUCTOR - || CONSTANT_CLASS_P (exp)) + if (CONSTANT_CLASS_P (exp)) return XEXP (expand_expr_constant (exp, 0, modifier), 0); /* Everything must be something allowed by is_gimple_addressable. */ @@ -6788,9 +6787,12 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode, default: /* If the object is a DECL, then expand it for its rtl. Don't bypass expand_expr, as that can have various side effects; LABEL_DECLs for - example, may not have their DECL_RTL set yet. Assume language - specific tree nodes can be expanded in some interesting way. */ + example, may not have their DECL_RTL set yet. Expand the rtl of + CONSTRUCTORs too, which should yield a memory reference for the + constructor's contents. Assume language specific tree nodes can + be expanded in some interesting way. */ if (DECL_P (exp) + || TREE_CODE (exp) == CONSTRUCTOR || TREE_CODE (exp) >= LAST_AND_UNUSED_TREE_CODE) { result = expand_expr (exp, target, tmode, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0fd8d88..65f0887 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-10-02 Richard Sandiford + + PR middle-end/33617 + * gcc.c-torture/compile/pr33617.c: New test. + 2007-10-02 Andreas Tobler * gcc.target/powerpc/stabs-attrib-vect-darwin.c: Change options to use diff --git a/gcc/testsuite/gcc.c-torture/compile/pr33617.c b/gcc/testsuite/gcc.c-torture/compile/pr33617.c new file mode 100644 index 0000000..0174fb6 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr33617.c @@ -0,0 +1,7 @@ +typedef float V8SF __attribute__ ((vector_size (32))); +void bar (V8SF); +void +foo (float x) +{ + bar ((V8SF) { x, x, x, x, x, x, x, x }); +} -- 2.7.4