aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2023-12-08 18:27:18 +0000
committerMarc Poulhiès <poulhies@adacore.com>2024-01-09 14:13:31 +0100
commit8f987210930e53e6f729d0a84a5fe682aeb74b19 (patch)
treef29ca7ca94b5b0cadc23b9c53d4796acbff4a8b0 /gcc/ada
parentda75ce88bde06bfcef2d454054f43ed430d96b00 (diff)
downloadgcc-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/ada')
-rw-r--r--gcc/ada/sem_ch6.adb1
-rw-r--r--gcc/ada/sem_ch9.adb26
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).