re PR middle-end/65409 (ICE in store_field)
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 16 Mar 2015 10:26:28 +0000 (10:26 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 16 Mar 2015 10:26:28 +0000 (10:26 +0000)
PR middle-end/65409
* expr.c (store_field): Do not do a direct block copy if the source is
a PARALLEL with BLKmode.

From-SVN: r221453

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr65049.C [new file with mode: 0644]

index 1348db5a01f8b9c87634806d001c9c5127adae39..b17168e87746c5dc2776b8a0c9b4785c6a96ac27 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/65409
+       * expr.c (store_field): Do not do a direct block copy if the source is
+       a PARALLEL with BLKmode.
+
 2015-03-16  Tom de Vries  <tom@codesourcery.com>
 
        PR middle-end/65414
index 89ca12945ff8fdb230caaa6d62a5631dea0d7a12..dc13a14f4e7860a08612d855e2b84804dda5ab7e 100644 (file)
@@ -6645,11 +6645,12 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
          && mode != TYPE_MODE (TREE_TYPE (exp)))
        temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
 
-      /* If the modes of TEMP and TARGET are both BLKmode, both
-        must be in memory and BITPOS must be aligned on a byte
-        boundary.  If so, we simply do a block copy.  Likewise
-        for a BLKmode-like TARGET.  */
-      if (GET_MODE (temp) == BLKmode
+      /* If TEMP is not a PARALLEL (see below) and its mode and that of TARGET
+        are both BLKmode, both must be in memory and BITPOS must be aligned
+        on a byte boundary.  If so, we simply do a block copy.  Likewise for
+        a BLKmode-like TARGET.  */
+      if (GET_CODE (temp) != PARALLEL
+         && GET_MODE (temp) == BLKmode
          && (GET_MODE (target) == BLKmode
              || (MEM_P (target)
                  && GET_MODE_CLASS (GET_MODE (target)) == MODE_INT
index 96f81d107caae380524f9201e93ff38e35992112..edfdf6bd28f19fde8e318998cbaa97b9422679b1 100644 (file)
@@ -1,3 +1,7 @@
+2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * testsuite/g++.dg/pr65049.C: New test.
+
 2015-03-16  Tom de Vries  <tom@codesourcery.com>
 
        * gcc.target/i386/fuse-caller-save-rec.c: Add PR64895 xfail on scans.
diff --git a/gcc/testsuite/g++.dg/pr65049.C b/gcc/testsuite/g++.dg/pr65049.C
new file mode 100644 (file)
index 0000000..7ced500
--- /dev/null
@@ -0,0 +1,19 @@
+// PR middle-end/65409
+// Reported by Ignacy Gawedzki <bugs@qult.net>
+
+struct Foo
+{
+  Foo() {}
+  int  a;
+  int  b;
+  char c;
+};
+
+Foo copy_foo(Foo);
+
+struct Bar : Foo
+{
+  Bar(Foo t) : Foo(copy_foo(t)) {}
+};
+
+Bar a = Foo();