diff options
author | Javier Miranda <miranda@adacore.com> | 2023-12-08 18:27:18 +0000 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2024-01-09 14:13:31 +0100 |
commit | 8f987210930e53e6f729d0a84a5fe682aeb74b19 (patch) | |
tree | f29ca7ca94b5b0cadc23b9c53d4796acbff4a8b0 /gcc | |
parent | da75ce88bde06bfcef2d454054f43ed430d96b00 (diff) | |
download | gcc-8f987210930e53e6f729d0a84a5fe682aeb74b19.zip gcc-8f987210930e53e6f729d0a84a5fe682aeb74b19.tar.gz gcc-8f987210930e53e6f729d0a84a5fe682aeb74b19.tar.bz2 |
ada: Cannot requeue to a procedure implemented by an entry
Add missing support for RM 9.5.4(5.6/4): the target of a requeue
statement may be a procedure when its name denotes a renaming of
an entry.
gcc/ada/
* sem_ch6.adb (Analyze_Subprogram_Specification): Do not replace
the type of the formals with its corresponding record in
init-procs.
* sem_ch9.adb (Analyze_Requeue): Add missing support to requeue to
a procedure that denotes a renaming of an entry.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/sem_ch6.adb | 1 | ||||
-rw-r--r-- | gcc/ada/sem_ch9.adb | 26 |
2 files changed, 27 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index bdfe446..8a7dfef 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -5373,6 +5373,7 @@ package body Sem_Ch6 is if Ada_Version >= Ada_2005 and then not Is_Invariant_Procedure_Or_Body (Designator) + and then not Is_Init_Proc (Designator) then declare Formal : Entity_Id; diff --git a/gcc/ada/sem_ch9.adb b/gcc/ada/sem_ch9.adb index 365887c..8e6ba4c 100644 --- a/gcc/ada/sem_ch9.adb +++ b/gcc/ada/sem_ch9.adb @@ -2438,6 +2438,32 @@ package body Sem_Ch9 is Entry_Name := Selector_Name (Entry_Name); end if; + -- Ada 2012 (9.5.4(5.6/4): "If the target is a procedure, the name + -- shall denote a renaming of an entry or ...". We support this + -- language rule replacing the target procedure with the renamed + -- entry. Thus, reanalyzing the resulting requeue statement we + -- reuse all the Ada 2005 machinery to perform the analysis. + + if Nkind (Entry_Name) in N_Has_Entity then + declare + Target_E : constant Entity_Id := Entity (Entry_Name); + + begin + if Ada_Version >= Ada_2012 + and then Ekind (Target_E) = E_Procedure + and then Convention (Target_E) = Convention_Entry + and then Nkind (Original_Node (Parent (Parent (Target_E)))) + = N_Subprogram_Renaming_Declaration + then + Set_Name (N, + New_Copy_Tree + (Name (Original_Node (Parent (Parent (Target_E)))))); + Analyze_Requeue (N); + return; + end if; + end; + end if; + -- If an explicit target object is given then we have to check the -- restrictions of 9.5.4(6). |