diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2022-04-14 17:31:44 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2022-05-19 14:05:31 +0000 |
commit | bf0b180b42babb61b4e16388b88350d75aad3c27 (patch) | |
tree | ce885fdfa478182d1bf1512e675abc1d29bc0264 /gcc | |
parent | e478e16e8a8a256c8c117f0bbe54a3078c086bc2 (diff) | |
download | gcc-bf0b180b42babb61b4e16388b88350d75aad3c27.zip gcc-bf0b180b42babb61b4e16388b88350d75aad3c27.tar.gz gcc-bf0b180b42babb61b4e16388b88350d75aad3c27.tar.bz2 |
[Ada] Fix spurious violations of No_Secondary_Stack restriction
Now that finalization and return on the secondary stack are decoupled, the
transient scopes created because of the former need not necessarily manage
the secondary stack and trigger a violation of the associated restriction.
gcc/ada/
* exp_ch7.adb (Wrap_Transient_Declaration): Propagate Uses_Sec_Stack
to enclosing function if it does not return on the secondary stack.
* exp_ch6.adb (Expand_Call_Helper): Call Establish_Transient_Scope
with Manage_Sec_Stack set to True only when necessary.
* sem_res.adb (Resolve_Call): Likewise.
(Resolve_Entry_Call): Likewise.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/exp_ch6.adb | 7 | ||||
-rw-r--r-- | gcc/ada/exp_ch7.adb | 2 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 6 |
3 files changed, 9 insertions, 6 deletions
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index deb514e..44d1987 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -4927,10 +4927,11 @@ package body Exp_Ch6 is and then (Ekind (Current_Scope) /= E_Loop or else Nkind (Parent (Call_Node)) /= N_Function_Call - or else not Is_Build_In_Place_Function_Call - (Parent (Call_Node))) + or else not + Is_Build_In_Place_Function_Call (Parent (Call_Node))) then - Establish_Transient_Scope (Call_Node, Manage_Sec_Stack => True); + Establish_Transient_Scope + (Call_Node, Returns_On_Secondary_Stack (Etype (Subp))); end if; end if; end Expand_Call_Helper; diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb index 2d58f3b..bb6712d 100644 --- a/gcc/ada/exp_ch7.adb +++ b/gcc/ada/exp_ch7.adb @@ -10336,7 +10336,7 @@ package body Exp_Ch7 is -- reclamation is done by the caller. if Ekind (Curr_S) = E_Function - and then Requires_Transient_Scope (Etype (Curr_S)) + and then Returns_On_Secondary_Stack (Etype (Curr_S)) then null; diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 060fcfc..930980e 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -6955,7 +6955,8 @@ package body Sem_Res is and then Requires_Transient_Scope (Etype (Nam)) and then not Is_Ignored_Ghost_Entity (Nam) then - Establish_Transient_Scope (N, Manage_Sec_Stack => True); + Establish_Transient_Scope + (N, Returns_On_Secondary_Stack (Etype (Nam))); -- If the call appears within the bounds of a loop, it will be -- rewritten and reanalyzed, nothing left to do here. @@ -8535,7 +8536,8 @@ package body Sem_Res is elsif Expander_Active and then Requires_Transient_Scope (Etype (Nam)) then - Establish_Transient_Scope (N, Manage_Sec_Stack => True); + Establish_Transient_Scope + (N, Returns_On_Secondary_Stack (Etype (Nam))); end if; -- Now we know that this is not a call to a function that returns an |