From ce081284bde18cf554ac7c10166581c8c667a6b7 Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Wed, 29 Mar 2023 13:57:35 -0400 Subject: [PATCH] ada: Corrections to premature-references rules This patch corrects the implementation of RM-8.3(17), which says that a record extension is self-hidden until "record". Previously, such premature references could cause a compiler crash. gcc/ada/ * sem_ch3.adb (Build_Derived_Record_Type): Temporarily set the state of the Derived_Type to "self-hidden" while processing constraints and discriminants of a record extension. --- gcc/ada/sem_ch3.adb | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index ff52e05324c..634b1cb4a38 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -9206,10 +9206,14 @@ package body Sem_Ch3 is then -- First, we must analyze the constraint (see comment in point 5.) -- The constraint may come from the subtype indication of the full - -- declaration. + -- declaration. Temporarily set the state of the Derived_Type to + -- "self-hidden" (see RM-8.3(17)). if Constraint_Present then + pragma Assert (Is_Not_Self_Hidden (Derived_Type)); + Set_Is_Not_Self_Hidden (Derived_Type, False); New_Discrs := Build_Discriminant_Constraints (Parent_Type, Indic); + Set_Is_Not_Self_Hidden (Derived_Type); -- If there is no explicit constraint, there might be one that is -- inherited from a constrained parent type. In that case verify that @@ -9507,11 +9511,19 @@ package body Sem_Ch3 is if Discriminant_Specs then Set_Has_Unknown_Discriminants (Derived_Type, False); - -- The following call initializes fields Has_Discriminants and - -- Discriminant_Constraint, unless we are processing the completion - -- of a private type declaration. + -- The following call to Check_Or_Process_Discriminants initializes + -- fields Has_Discriminants and Discriminant_Constraint, unless we + -- are processing the completion of a private type declaration. + -- Temporarily set the state of the Derived_Type to "self-hidden" + -- (see RM-8.3(17)), unless it is already the case. - Check_Or_Process_Discriminants (N, Derived_Type); + if Is_Not_Self_Hidden (Derived_Type) then + Set_Is_Not_Self_Hidden (Derived_Type, False); + Check_Or_Process_Discriminants (N, Derived_Type); + Set_Is_Not_Self_Hidden (Derived_Type); + else + Check_Or_Process_Discriminants (N, Derived_Type); + end if; -- For untagged types, the constraint on the Parent_Type must be -- present and is used to rename the discriminants. -- 2.11.4.GIT