From: Ronan Desplanques <desplanq...@adacore.com> Before this patch, Process_Subtype looked at the parent of its argument to determine whether it was called in a context where it was OK for the subtype mark to refer to the incomplete view of a type. This patch adds a new formal so that it becomes the responsibility of the caller in order to make the code simpler overall.
The only change in the behavior of the compiler is that the messages emitted in some error situations with the -gnatf switch are slightly different. gcc/ada/ChangeLog: * sem_ch3.ads (Process_Subtype): New formal. * sem_ch3.adb (Process_Subtype): Likewise. (Analyze_Subtype_Declaration, Access_Type_Declaration): Use new formal. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/sem_ch3.adb | 42 ++++++++++++++++++++---------------------- gcc/ada/sem_ch3.ads | 11 ++++++----- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index fdf225efc30..823cc34e22b 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -1414,7 +1414,9 @@ package body Sem_Ch3 is end if; else - Setup_Access_Type (Desig_Typ => Process_Subtype (S, P, T, 'P')); + Setup_Access_Type + (Desig_Typ => + Process_Subtype (S, P, T, 'P', Incomplete_Type_OK => True)); end if; if not Error_Posted (T) then @@ -5775,7 +5777,9 @@ package body Sem_Ch3 is N, Id, 'P', - Excludes_Null => Null_Exclusion_Present (N)); + Excludes_Null => Null_Exclusion_Present (N), + Incomplete_Type_OK => + Ada_Version >= Ada_2005 or else Is_Itype (Id)); -- Class-wide equivalent types of records with unknown discriminants -- involve the generation of an itype which serves as the private view @@ -22523,11 +22527,12 @@ package body Sem_Ch3 is --------------------- function Process_Subtype - (S : Node_Id; - Related_Nod : Node_Id; - Related_Id : Entity_Id := Empty; - Suffix : Character := ' '; - Excludes_Null : Boolean := False) return Entity_Id + (S : Node_Id; + Related_Nod : Node_Id; + Related_Id : Entity_Id := Empty; + Suffix : Character := ' '; + Excludes_Null : Boolean := False; + Incomplete_Type_OK : Boolean := False) return Entity_Id is procedure Check_Incomplete (T : Node_Id); -- Called to verify that an incomplete type is not used prematurely @@ -22541,13 +22546,7 @@ package body Sem_Ch3 is -- Ada 2005 (AI-412): Incomplete subtypes are legal if Ekind (Root_Type (Entity (T))) = E_Incomplete_Type - and then - not (Ada_Version >= Ada_2005 - and then - (Nkind (Parent (T)) = N_Subtype_Declaration - or else (Nkind (Parent (T)) = N_Subtype_Indication - and then Nkind (Parent (Parent (T))) = - N_Subtype_Declaration))) + and then not Incomplete_Type_OK then Error_Msg_N ("invalid use of type before its full declaration", T); end if; @@ -22643,13 +22642,7 @@ package body Sem_Ch3 is else Find_Type (Subtype_Mark (S)); - if Nkind (Parent (S)) /= N_Access_To_Object_Definition - and then not - (Nkind (Parent (S)) = N_Subtype_Declaration - and then Is_Itype (Defining_Identifier (Parent (S)))) - then - Check_Incomplete (Subtype_Mark (S)); - end if; + Check_Incomplete (Subtype_Mark (S)); Subtype_Mark_Id := Entity (Subtype_Mark (S)); @@ -22707,7 +22700,12 @@ package body Sem_Ch3 is return Process_Subtype - (S, Related_Nod, Related_Id, Suffix, Excludes_Null); + (S, + Related_Nod, + Related_Id, + Suffix, + Excludes_Null, + Incomplete_Type_OK); end if; -- Remaining processing depends on type. Select on Base_Type kind to diff --git a/gcc/ada/sem_ch3.ads b/gcc/ada/sem_ch3.ads index d600d157e65..a97393d3cfe 100644 --- a/gcc/ada/sem_ch3.ads +++ b/gcc/ada/sem_ch3.ads @@ -301,11 +301,12 @@ package Sem_Ch3 is -- in this case the bounds are captured if necessary using this name. function Process_Subtype - (S : Node_Id; - Related_Nod : Node_Id; - Related_Id : Entity_Id := Empty; - Suffix : Character := ' '; - Excludes_Null : Boolean := False) return Entity_Id; + (S : Node_Id; + Related_Nod : Node_Id; + Related_Id : Entity_Id := Empty; + Suffix : Character := ' '; + Excludes_Null : Boolean := False; + Incomplete_Type_OK : Boolean := False) return Entity_Id; -- Process a subtype indication S and return corresponding entity. -- Related_Nod is the node where the potential generated implicit types -- will be inserted. The Related_Id and Suffix parameters are used to -- 2.43.0