From: Eric Botcazou Date: Wed, 17 Feb 2016 09:08:09 +0000 (+0000) Subject: utils2.c (gnat_protect_expr): Make a SAVE_EXPR only for fat pointer or scalar types. X-Git-Tag: basepoints/gcc-7~905 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf17fe3f736580a65427cc9e0e814e3ffe6e7fe5;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index b2e9726a05f8..60ff79661022 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2016-02-17 Eric Botcazou + + * gcc-interface/utils2.c (gnat_protect_expr): Make a SAVE_EXPR only + for fat pointer or scalar types. + 2016-02-16 Eric Botcazou * 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 ba4a5dca3e89..44a05fb012d4 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 df83072ae350..397b40f4049d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-02-17 Eric Botcazou + + * gnat.dg/discr46.ad[sb]: New test. + 2016-02-16 Kelvin Nilsen PR Target/48344 diff --git a/gcc/testsuite/gnat.dg/discr46.adb b/gcc/testsuite/gnat.dg/discr46.adb new file mode 100644 index 000000000000..84ac91d413df --- /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 000000000000..18b0de13876c --- /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;