aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-04-14 17:31:44 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-19 14:05:31 +0000
commitbf0b180b42babb61b4e16388b88350d75aad3c27 (patch)
treece885fdfa478182d1bf1512e675abc1d29bc0264 /gcc
parente478e16e8a8a256c8c117f0bbe54a3078c086bc2 (diff)
downloadgcc-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.adb7
-rw-r--r--gcc/ada/exp_ch7.adb2
-rw-r--r--gcc/ada/sem_res.adb6
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