diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-11-11 16:48:39 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-11-11 16:48:39 +0100 |
commit | 1004f0c5c83b9cffe17adbaabf935db8ab290911 (patch) | |
tree | 07c7168ba1f0b818b361c11b91ce9c3c290414d3 /gcc/expr.c | |
parent | 86de8875db3ff4e3f1ae43f164e026cea6094444 (diff) | |
download | gcc-1004f0c5c83b9cffe17adbaabf935db8ab290911.zip gcc-1004f0c5c83b9cffe17adbaabf935db8ab290911.tar.gz gcc-1004f0c5c83b9cffe17adbaabf935db8ab290911.tar.bz2 |
re PR middle-end/46388 (ICE in int_mode_for_mode, at stor-layout.c:493)
PR middle-end/46388
* expr.c (expand_assignment): If to_rtx is a VOIDmode MEM, use
BLKmode mode for it.
(expand_expr_real_1): Similarly for op0.
* gcc.c-torture/compile/pr46388.c: New test.
From-SVN: r166603
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 30 |
1 files changed, 20 insertions, 10 deletions
@@ -4260,11 +4260,16 @@ expand_assignment (tree to, tree from, bool nontemporal) to_rtx = expand_normal (tem); /* If the bitfield is volatile, we want to access it in the - field's mode, not the computed mode. */ - if (volatilep - && GET_CODE (to_rtx) == MEM - && flag_strict_volatile_bitfields > 0) - to_rtx = adjust_address (to_rtx, mode1, 0); + field's mode, not the computed mode. + If a MEM has VOIDmode (external with incomplete type), + use BLKmode for it instead. */ + if (MEM_P (to_rtx)) + { + if (volatilep && flag_strict_volatile_bitfields > 0) + to_rtx = adjust_address (to_rtx, mode1, 0); + else if (GET_MODE (to_rtx) == VOIDmode) + to_rtx = adjust_address (to_rtx, BLKmode, 0); + } if (offset != 0) { @@ -9013,11 +9018,16 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, /* If the bitfield is volatile, we want to access it in the - field's mode, not the computed mode. */ - if (volatilep - && GET_CODE (op0) == MEM - && flag_strict_volatile_bitfields > 0) - op0 = adjust_address (op0, mode1, 0); + field's mode, not the computed mode. + If a MEM has VOIDmode (external with incomplete type), + use BLKmode for it instead. */ + if (MEM_P (op0)) + { + if (volatilep && flag_strict_volatile_bitfields > 0) + op0 = adjust_address (op0, mode1, 0); + else if (GET_MODE (op0) == VOIDmode) + op0 = adjust_address (op0, BLKmode, 0); + } mode2 = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0); |