diff options
Diffstat (limited to 'gcc/ada/sem_ch3.adb')
-rw-r--r-- | gcc/ada/sem_ch3.adb | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 1e3b78ccf2f..9dc39028033 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -2818,19 +2818,23 @@ package body Sem_Ch3 is if Present (L) then Context := Parent (L); - -- Analyze the contracts of packages and their bodies + -- Certain contract annocations have forward visibility semantics and + -- must be analyzed after all declarative items have been processed. + -- This timing ensures that entities referenced by such contracts are + -- visible. - if Nkind (Context) = N_Package_Specification - and then L = Visible_Declarations (Context) - then - Analyze_Package_Contract (Defining_Entity (Context)); + -- Analyze the contract of an immediately enclosing package spec or + -- body first because other contracts may depend on its information. - elsif Nkind (Context) = N_Package_Body then + if Nkind (Context) = N_Package_Body then Analyze_Package_Body_Contract (Defining_Entity (Context)); + + elsif Nkind (Context) = N_Package_Specification then + Analyze_Package_Contract (Defining_Entity (Context)); end if; - -- Analyze the contracts of various constructs now due to the delayed - -- visibility needs of their aspects and pragmas. + -- Analyze the contracts of various constructs in the declarative + -- list. Analyze_Contracts (L); @@ -2848,13 +2852,13 @@ package body Sem_Ch3 is Remove_Visible_Refinements (Corresponding_Spec (Context)); Remove_Partial_Visible_Refinements (Corresponding_Spec (Context)); - elsif Nkind (Context) = N_Package_Declaration then + elsif Nkind (Context) = N_Package_Specification then -- Partial state refinements are visible up to the end of the -- package spec declarations. Hide the partial state refinements -- from visibility to restore the original state conditions. - Remove_Partial_Visible_Refinements (Corresponding_Spec (Context)); + Remove_Partial_Visible_Refinements (Defining_Entity (Context)); end if; -- Verify that all abstract states found in any package declared in @@ -6639,7 +6643,7 @@ package body Sem_Ch3 is Tdef : constant Node_Id := Type_Definition (N); Indic : constant Node_Id := Subtype_Indication (Tdef); Parent_Base : constant Entity_Id := Base_Type (Parent_Type); - Implicit_Base : Entity_Id; + Implicit_Base : Entity_Id := Empty; New_Indic : Node_Id; procedure Make_Implicit_Base; @@ -6751,7 +6755,7 @@ package body Sem_Ch3 is N_Subtype_Indication; D_Constraint : Node_Id; - New_Constraint : Elist_Id; + New_Constraint : Elist_Id := No_Elist; Old_Disc : Entity_Id; New_Disc : Entity_Id; New_N : Node_Id; |