PR middle-end/65409
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Mar 2015 10:26:28 +0000 (10:26 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Mar 2015 10:26:28 +0000 (10:26 +0000)
* expr.c (store_field): Do not do a direct block copy if the source is
a PARALLEL with BLKmode.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221453 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 1348db5..b17168e 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 89ca129..dc13a14 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 96f81d1..edfdf6b 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();