diff options
author | Richard Sandiford <rsandifo@nildram.co.uk> | 2007-10-02 20:50:46 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2007-10-02 20:50:46 +0000 |
commit | 16089886c228cc1361ddc01ac3461017dc1072c3 (patch) | |
tree | d8b5a02be72555573d7fccaf3de7108dc83914cd /gcc/expr.c | |
parent | 966b774d3ee4a815985f45e5357d4ebcc789c413 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -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, |