aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2016-02-17 09:08:09 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2016-02-17 09:08:09 +0000
commitbf17fe3f736580a65427cc9e0e814e3ffe6e7fe5 (patch)
treedf70e4758110251ef340a136d8439f15b3847d6c /gcc
parent244901a5721d5bf5597ac71117e50b190337da44 (diff)
downloadgcc-bf17fe3f736580a65427cc9e0e814e3ffe6e7fe5.zip
gcc-bf17fe3f736580a65427cc9e0e814e3ffe6e7fe5.tar.gz
gcc-bf17fe3f736580a65427cc9e0e814e3ffe6e7fe5.tar.bz2
utils2.c (gnat_protect_expr): Make a SAVE_EXPR only for fat pointer or scalar types.
* gcc-interface/utils2.c (gnat_protect_expr): Make a SAVE_EXPR only for fat pointer or scalar types. From-SVN: r233484
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/utils2.c9
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/discr46.adb14
-rw-r--r--gcc/testsuite/gnat.dg/discr46.ads24
5 files changed, 51 insertions, 5 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index b2e9726..60ff796 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/utils2.c (gnat_protect_expr): Make a SAVE_EXPR only
+ for fat pointer or scalar types.
+
2016-02-16 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/gigi.h (maybe_debug_type): New inline function.
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c
index ba4a5dca..44a05fb 100644
--- a/gcc/ada/gcc-interface/utils2.c
+++ b/gcc/ada/gcc-interface/utils2.c
@@ -2559,12 +2559,11 @@ gnat_protect_expr (tree exp)
return build3 (code, type, gnat_protect_expr (TREE_OPERAND (exp, 0)),
TREE_OPERAND (exp, 1), TREE_OPERAND (exp, 2));
- /* If this is a fat pointer or something that can be placed in a register,
- just make a SAVE_EXPR. Likewise for a CALL_EXPR as large objects are
- returned via invisible reference in most ABIs so the temporary will
- directly be filled by the callee. */
+ /* If this is a fat pointer or a scalar, just make a SAVE_EXPR. Likewise
+ for a CALL_EXPR as large objects are returned via invisible reference
+ in most ABIs so the temporary will directly be filled by the callee. */
if (TYPE_IS_FAT_POINTER_P (type)
- || TYPE_MODE (type) != BLKmode
+ || !AGGREGATE_TYPE_P (type)
|| code == CALL_EXPR)
return save_expr (exp);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index df83072..397b40f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-02-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/discr46.ad[sb]: New test.
+
2016-02-16 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR Target/48344
diff --git a/gcc/testsuite/gnat.dg/discr46.adb b/gcc/testsuite/gnat.dg/discr46.adb
new file mode 100644
index 0000000..84ac91d
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/discr46.adb
@@ -0,0 +1,14 @@
+-- { dg-do compile }
+
+package body Discr46 is
+
+ function F (Id : Enum) return Integer is
+ Node : Integer := 0;
+ begin
+ if A (Id).R.D = True then
+ Node := A (Id).R.T;
+ end if;
+ return Node;
+ end;
+
+end Discr46;
diff --git a/gcc/testsuite/gnat.dg/discr46.ads b/gcc/testsuite/gnat.dg/discr46.ads
new file mode 100644
index 0000000..18b0de1
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/discr46.ads
@@ -0,0 +1,24 @@
+package Discr46 is
+
+ type Enum is (One, Two, Three);
+ for Enum use (One => 1, Two => 2, Three => 3);
+
+ type Rec1 (D : Boolean := False) is record
+ case D is
+ when False => null;
+ when True => T : Integer;
+ end case;
+ end record;
+
+ type Rec2 is record
+ R : Rec1;
+ C : Character;
+ end record;
+
+ type Arr is array (Enum) of Rec2;
+
+ A : Arr;
+
+ function F (Id : Enum) return Integer;
+
+end Discr46;