diff options
author | Bob Duff <duff@adacore.com> | 2019-08-20 09:50:24 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-08-20 09:50:24 +0000 |
commit | d4e4e88a4c1b13bc480603ad96672ce079e32ffb (patch) | |
tree | d80df430cc29541eb81fd0f218dd73c10d28f927 /gcc/ada/exp_aggr.adb | |
parent | cf0e5ca723edbb63719ca075fce3f84eb8e43553 (diff) | |
download | gcc-d4e4e88a4c1b13bc480603ad96672ce079e32ffb.zip gcc-d4e4e88a4c1b13bc480603ad96672ce079e32ffb.tar.gz gcc-d4e4e88a4c1b13bc480603ad96672ce079e32ffb.tar.bz2 |
[Ada] Improve efficiency of aggregates with <>
The generated code has been improved so that aggregates with <> are more
efficient. No change in behavior; no test.
2019-08-20 Bob Duff <duff@adacore.com>
gcc/ada/
* exp_aggr.adb (Expand_Array_Aggregate): Use build-in-place in
the nonlimited case in STEP 4. This improves the efficiency of
things like (1 .. 1000 => <>). We still generate some code for
that, unfortunately, but it is much improved.
(Aggr_Assignment_OK_For_Backend): Return false if <> components
are present.
From-SVN: r274739
Diffstat (limited to 'gcc/ada/exp_aggr.adb')
-rw-r--r-- | gcc/ada/exp_aggr.adb | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index c3eba3c..7f11b41 100644 --- a/gcc/ada/exp_aggr.adb +++ b/gcc/ada/exp_aggr.adb @@ -5233,6 +5233,12 @@ package body Exp_Aggr is Value : Uint; begin + -- Back end doesn't know about <> + + if Has_Default_Init_Comps (N) then + return False; + end if; + -- Recurse as far as possible to find the innermost component type Ctyp := Etype (N); @@ -6292,9 +6298,7 @@ package body Exp_Aggr is -- previously excluded controlled components but this is an old -- oversight: the rules in 7.6 (17) are clear. - if (not Has_Default_Init_Comps (N) - or else Is_Limited_Type (Etype (N))) - and then Comes_From_Source (Parent_Node) + if Comes_From_Source (Parent_Node) and then Parent_Kind = N_Object_Declaration and then Present (Expression (Parent_Node)) and then not |