diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f1930632fed..313a5efa165 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2019-08-19 Ed Schonberg + + * sem_ch6.adb (Check_Synchronized_Overriding): Complete + predicate that applies legality check in 9.4 (11.9/2): if an + inherited subprogram is implemented by a protected procedure or + entry, its first paarameter must be out, in_out or + access_to_varible. + 2019-08-19 Javier Miranda PR ada/65696 diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index e176535dec6..fb50ec79989 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -7034,6 +7034,11 @@ package body Sem_Ch6 is In_Scope : Boolean; Typ : Entity_Id; + function Is_Valid_Formal (F : Entity_Id) return Boolean; + -- Predicate for legality rule in 9.4 (11.9/2): If an inherited + -- subprogram is implemented by a protected procedure or entry, + -- its first parameter must be out, in out, or access-to-variable. + function Matches_Prefixed_View_Profile (Prim_Params : List_Id; Iface_Params : List_Id) return Boolean; @@ -7042,6 +7047,19 @@ package body Sem_Ch6 is -- Iface_Params. Also determine if the type of first parameter of -- Iface_Params is an implemented interface. + ---------------------- + -- Is_Valid_Formal -- + ---------------------- + + function Is_Valid_Formal (F : Entity_Id) return Boolean is + begin + return + Ekind_In (F, E_In_Out_Parameter, E_Out_Parameter) + or else + (Nkind (Parameter_Type (Parent (F))) = N_Access_Definition + and then not Constant_Present (Parameter_Type (Parent (F)))); + end Is_Valid_Formal; + ----------------------------------- -- Matches_Prefixed_View_Profile -- ----------------------------------- @@ -7295,10 +7313,7 @@ package body Sem_Ch6 is if Ekind_In (Candidate, E_Entry, E_Procedure) and then Is_Protected_Type (Typ) - and then Ekind (Formal) /= E_In_Out_Parameter - and then Ekind (Formal) /= E_Out_Parameter - and then Nkind (Parameter_Type (Parent (Formal))) /= - N_Access_Definition + and then not Is_Valid_Formal (Formal) then null;