]> gcc.gnu.org Git - gcc.git/commitdiff
expr.c (store_field): Handle VOIDmode for calls that return values in multiple locations.
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 20 Jul 2014 20:30:23 +0000 (20:30 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 20 Jul 2014 20:30:23 +0000 (20:30 +0000)
* expr.c (store_field): Handle VOIDmode for calls that return values
in multiple locations.

From-SVN: r212877

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/pack20.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/pack20.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/pack20_pkg.ads [new file with mode: 0644]

index 52b84efb3a4c5a19ea961bd6e08a4edbb4a32a22..0e5a2985eeaa079142ecdb4863e1b31fd7861dd9 100644 (file)
@@ -1,3 +1,8 @@
+2014-07-20  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * expr.c (store_field): Handle VOIDmode for calls that return values
+       in multiple locations.
+
 2014-07-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * config/rs6000/altivec.md (unspec enum):  Fix typo in
index 4d2163f721b092e35fad464d71797aebaf0cb6e3..d8328eebfbf62e676420115ba6c3d110895e5615 100644 (file)
@@ -6581,7 +6581,7 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
        {
          HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
          rtx temp_target;
-         if (mode == BLKmode)
+         if (mode == BLKmode || mode == VOIDmode)
            mode = smallest_mode_for_size (size * BITS_PER_UNIT, MODE_INT);
          temp_target = gen_reg_rtx (mode);
          emit_group_store (temp_target, temp, TREE_TYPE (exp), size);
index 37772647ca1990582edbd9ada3da68a29b0a3961..3111c7394951dd36f373ad54cafbe2a0cd63b0df 100644 (file)
@@ -1,3 +1,8 @@
+2014-07-20  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/pack20.ad[sb]: New test.
+       * gnat.dg/pack20_pkg.ads: New helper.
+
 2014-07-20  Ian Lance Taylor  <iant@google.com>
 
        * go.test/go-test.exp (go-gc-tests): Support multiple files in one
diff --git a/gcc/testsuite/gnat.dg/pack20.adb b/gcc/testsuite/gnat.dg/pack20.adb
new file mode 100644 (file)
index 0000000..5ec3e93
--- /dev/null
@@ -0,0 +1,9 @@
+package body Pack20 is
+
+   procedure Proc (A : Rec) is
+      Local : Rec := A;
+   begin
+      Modify (Local.Fixed);
+   end;
+
+end Pack20;
diff --git a/gcc/testsuite/gnat.dg/pack20.ads b/gcc/testsuite/gnat.dg/pack20.ads
new file mode 100644 (file)
index 0000000..ddfb9d8
--- /dev/null
@@ -0,0 +1,15 @@
+-- { dg-do compile }
+
+with Pack20_Pkg; use Pack20_Pkg;
+
+package Pack20 is
+
+   type Rec is record
+      Simple_Type  : Integer;
+      Fixed        : String_Ptr;
+   end record;
+   pragma Pack (Rec);
+
+   procedure Proc (A : Rec);
+
+end Pack20;
diff --git a/gcc/testsuite/gnat.dg/pack20_pkg.ads b/gcc/testsuite/gnat.dg/pack20_pkg.ads
new file mode 100644 (file)
index 0000000..8f3c554
--- /dev/null
@@ -0,0 +1,7 @@
+package Pack20_Pkg is
+
+   type String_Ptr is access all String;
+
+   procedure Modify (Fixed : in out String_Ptr);
+
+end Pack20_Pkg;
This page took 0.133155 seconds and 5 git commands to generate.