[Ada] Fix spurious violations of No_Secondary_Stack restriction
Commit Message
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.
Tested on x86_64-pc-linux-gnu, committed on trunk
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.
@@ -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;
@@ -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;
@@ -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