aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2007-10-02 20:50:46 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2007-10-02 20:50:46 +0000
commit16089886c228cc1361ddc01ac3461017dc1072c3 (patch)
treed8b5a02be72555573d7fccaf3de7108dc83914cd
parent966b774d3ee4a815985f45e5357d4ebcc789c413 (diff)
downloadgcc-16089886c228cc1361ddc01ac3461017dc1072c3.zip
gcc-16089886c228cc1361ddc01ac3461017dc1072c3.tar.gz
gcc-16089886c228cc1361ddc01ac3461017dc1072c3.tar.bz2
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr33617.c7
4 files changed, 24 insertions, 4 deletions
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 <rsandifo@nildram.co.uk>
+
+ PR middle-end/33617
+ * expr.c (expand_expr_addr_expr_1): Pass CONSTRUCTORs to
+ expand_expr.
+
2007-10-02 David Daney <ddaney@avtrex.com>
* config/mips/mips.md (sync_compare_and_swap<mode>): 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 <rsandifo@nildram.co.uk>
+
+ PR middle-end/33617
+ * gcc.c-torture/compile/pr33617.c: New test.
+
2007-10-02 Andreas Tobler <a.tobler@schweiz.org>
* 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 });
+}