From bf0b180b42babb61b4e16388b88350d75aad3c27 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 14 Apr 2022 17:31:44 +0200 Subject: [PATCH] [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. --- gcc/ada/exp_ch6.adb | 7 ++++--- gcc/ada/exp_ch7.adb | 2 +- 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 deb514e188d..44d198798c6 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 2d58f3bb4b6..bb6712d823d 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 060fcfc5508..930980eafed 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 -- 2.47.2