aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-11-11 16:48:39 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-11-11 16:48:39 +0100
commit1004f0c5c83b9cffe17adbaabf935db8ab290911 (patch)
tree07c7168ba1f0b818b361c11b91ce9c3c290414d3
parent86de8875db3ff4e3f1ae43f164e026cea6094444 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/expr.c30
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr46388.c14
4 files changed, 46 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1d686e9..1888e2f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-11-11 Jakub Jelinek <jakub@redhat.com>
+
+ 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.
+
2010-11-11 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* doc/sourcebuild.texi (LTO Testing, dg-suppress-ld-options):
diff --git a/gcc/expr.c b/gcc/expr.c
index cb73f01..d2aefd5 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 26b24d3..7828567 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/46388
+ * gcc.c-torture/compile/pr46388.c: New test.
+
2010-11-11 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* lib/lto.exp (lto-get-options-main): Support optional target
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr46388.c b/gcc/testsuite/gcc.c-torture/compile/pr46388.c
new file mode 100644
index 0000000..74f60bb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr46388.c
@@ -0,0 +1,14 @@
+/* PR middle-end/46388 */
+
+struct S;
+struct T
+{
+ struct S *t;
+};
+extern struct S s, u;
+
+void
+foo (void)
+{
+ ((struct T *) &u)->t = &s;
+}