https://gcc.gnu.org/g:52348fd6ebf092ca665f00f4b06bcaba115c72ff
commit r17-4574-g52348fd6ebf092ca665f00f4b06bcaba115c72ff Author: Eric Botcazou <[email protected]> Date: Tue Sep 22 20:19:23 2026 +0200 Ada: Small cleanup in freezing machinery The main part is the renaming of Freeze_Expr_Types to Freeze_Full_Expression and Freeze_Expr_Types_Before to Freeze_Full_Expression_Before to reflect the actual intent of the subprograms. gcc/ada/ * freeze.ads (Freeze_Entity): Move around. (Freeze_Before): Rename T parameter to E. (Freeze_Expression): Improve description. (Freeze_Expr_Types_Before): Rename to... (Freeze_Full_Expression_Before): ...this. * freeze.adb (Freeze_Expr_Types): Rename to... (Freeze_Full_Expression): ...this. (Freeze_Before): Rename T parameter to E and Pack variable to Scop. (Freeze_Entity): Adjust to above renaming. (Freeze_Expression): Likewise. (Freeze_Expr_Types_Before): Rename to... (Freeze_Full_Expression_Before): ...this. * contracts.adb (Analyze_Entry_Or_Subprogram_Contract): Adjust to above renaming. (Expand_Subprogram_Contract): Likewise. * sem_ch6.adb (Analyze_Expression_Function): Likewise. Diff: --- gcc/ada/contracts.adb | 4 ++-- gcc/ada/freeze.adb | 52 +++++++++++++++++++++++--------------------------- gcc/ada/freeze.ads | 53 +++++++++++++++++++++++++++------------------------ gcc/ada/sem_ch6.adb | 2 +- 4 files changed, 55 insertions(+), 56 deletions(-) diff --git a/gcc/ada/contracts.adb b/gcc/ada/contracts.adb index 0c75a24d3955..fb781fd6ac33 100644 --- a/gcc/ada/contracts.adb +++ b/gcc/ada/contracts.adb @@ -755,7 +755,7 @@ package body Contracts is if Freeze_Types and then Present (Corresponding_Aspect (Prag)) then - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => Bod, Expr => Expression @@ -3119,7 +3119,7 @@ package body Contracts is if Freeze_T and then Present (Corresponding_Aspect (Prag)) then - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => Body_Decl, Expr => Expression diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 4c516fe9667f..634010e452f1 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -149,14 +149,14 @@ package body Freeze is -- that if a foreign convention is specified, and no specific size -- is given, then the size must be at least Integer'Size. - procedure Freeze_Expr_Types + procedure Freeze_Full_Expression (Expr : Node_Id; N : Node_Id; Def_Id : Entity_Id; Result : in out List_Id; Before : Boolean := False; Typ : Entity_Id := Empty); - -- Same as Freeze_Expr_Types_Before if Before is True, but appends the + -- Same as Freeze_Full_Expression_Before if Before is True, but appends the -- resulting list of nodes to Result if Before is False, modifying Result -- from No_List if necessary. @@ -2746,16 +2746,12 @@ package body Freeze is procedure Freeze_Before (N : Node_Id; - T : Entity_Id; + E : Entity_Id; Do_Freeze_Profile : Boolean := True) is - -- Freeze T, then insert the generated Freeze nodes before the node N. - -- Flag Freeze_Profile is used when T is an overloadable entity, and - -- indicates whether its profile should be frozen at the same time. - Freeze_Nodes : constant List_Id := - Freeze_Entity (T, N, Do_Freeze_Profile); - Pack : constant Entity_Id := Scope (T); + Freeze_Entity (E, N, Do_Freeze_Profile); + Scop : constant Entity_Id := Scope (E); begin if Is_Non_Empty_List (Freeze_Nodes) then @@ -2766,12 +2762,12 @@ package body Freeze is -- which may include generated subprograms such as predicate -- functions, etc. - if Is_Type (T) and then From_Nested_Package (T) then - Push_Scope (Pack); - Install_Visible_Declarations (Pack); - Install_Private_Declarations (Pack); + if Is_Type (E) and then From_Nested_Package (E) then + Push_Scope (Scop); + Install_Visible_Declarations (Scop); + Install_Private_Declarations (Scop); Insert_Actions (N, Freeze_Nodes); - End_Package_Scope (Pack); + End_Package_Scope (Scop); else Insert_Actions (N, Freeze_Nodes); @@ -8274,7 +8270,7 @@ package body Freeze is if Is_Expression_Function (Subp) then Freeze_And_Append (Subp, N, Result, Do_Freeze_Profile => False); - Freeze_Expr_Types + Freeze_Full_Expression (Expr => Expression_Of_Expression_Function (Subp), N => N, Def_Id => Subp, @@ -9227,7 +9223,7 @@ package body Freeze is -- Freeze types in expression function (RM 13.14(10.1, 10.2, 10.3)) if Is_Expression_Function (Nam) then - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => P, Expr => Expression_Of_Expression_Function (Nam), Def_Id => Nam); @@ -9239,11 +9235,11 @@ package body Freeze is In_Spec_Expression := In_Spec_Exp; end Freeze_Expression; - ----------------------- - -- Freeze_Expr_Types -- - ----------------------- + ---------------------------- + -- Freeze_Full_Expression -- + ---------------------------- - procedure Freeze_Expr_Types + procedure Freeze_Full_Expression (Expr : Node_Id; N : Node_Id; Def_Id : Entity_Id; @@ -9526,7 +9522,7 @@ package body Freeze is procedure Freeze_References is new Traverse_Proc (Freeze_Type_Refs); - -- Start of processing for Freeze_Expr_Types + -- Start of processing for Freeze_Full_Expression begin -- Preanalyze a duplicate of the expression to have available the @@ -9577,13 +9573,13 @@ package body Freeze is else Freeze_References (Expr); end if; - end Freeze_Expr_Types; + end Freeze_Full_Expression; - ------------------------------ - -- Freeze_Expr_Types_Before -- - ------------------------------ + ----------------------------------- + -- Freeze_Full_Expression_Before -- + ----------------------------------- - procedure Freeze_Expr_Types_Before + procedure Freeze_Full_Expression_Before (N : Node_Id; Expr : Node_Id; Def_Id : Entity_Id; @@ -9592,14 +9588,14 @@ package body Freeze is Dummy : List_Id := No_List; begin - Freeze_Expr_Types + Freeze_Full_Expression (Expr => Expr, N => N, Def_Id => Def_Id, Result => Dummy, Before => True, Typ => Typ); - end Freeze_Expr_Types_Before; + end Freeze_Full_Expression_Before; ----------------------------- -- Freeze_Fixed_Point_Type -- diff --git a/gcc/ada/freeze.ads b/gcc/ada/freeze.ads index 995ff04187b4..7e5d31f92b14 100644 --- a/gcc/ada/freeze.ads +++ b/gcc/ada/freeze.ads @@ -96,7 +96,7 @@ package Freeze is -- Objects with dynamic address clauses -- - -- These have a delayed freeze. Gigi will generate code to evaluate + -- These have delayed freezing. Gigi will generate code to evaluate -- the initialization expression if present and store it in a temp. -- The actual object is created at the point of the freeze, and if -- necessary initialized by copying the value of this temporary. @@ -183,19 +183,6 @@ package Freeze is -- If Initialization_Statements (E) is an N_Compound_Statement, insert its -- actions at the appropriate point and clear the attribute. - function Freeze_Entity - (E : Entity_Id; - N : Node_Id; - Do_Freeze_Profile : Boolean := True) return List_Id; - -- Freeze an entity, and return Freeze nodes, to be inserted at the point - -- of call. N is a node whose source location corresponds to the freeze - -- point. This is used in placing warning messages in the situation where - -- it appears that a type has been frozen too early, e.g. when a primitive - -- operation is declared after the freezing point of its tagged type. - -- Returns No_List if no freeze nodes needed. Parameter Do_Freeze_Profile - -- is used when E is a subprogram, and determines whether the profile of - -- the subprogram should be frozen as well. - procedure Freeze_All (From : Entity_Id; After : in out Node_Id); -- Before a non-instance body, or at the end of a declarative part, -- freeze all entities therein that are not yet frozen. Calls itself @@ -212,28 +199,44 @@ package Freeze is procedure Freeze_Before (N : Node_Id; - T : Entity_Id; + E : Entity_Id; Do_Freeze_Profile : Boolean := True); - -- Freeze T then Insert the generated Freeze nodes before the node N. Flag - -- Do_Freeze_Profile is used when T is an overloadable entity and indicates - -- whether its profile should be frozen at the same time. + -- Freeze entity E and Insert the generated Freeze nodes before the node N. + -- The Flag Do_Freeze_Profile is used when T is an overloadable entity and + -- indicates whether its profile should be frozen at the same time. + + function Freeze_Entity + (E : Entity_Id; + N : Node_Id; + Do_Freeze_Profile : Boolean := True) return List_Id; + -- Freeze entity E, and return Freeze nodes, to be inserted at the point + -- of call. N is a node whose source location corresponds to the freeze + -- point. This is used in placing warning messages in the situation where + -- it appears that a type has been frozen too early, e.g. when a primitive + -- operation is declared after the freezing point of its tagged type. + -- Returns No_List if no freeze nodes needed. Parameter Do_Freeze_Profile + -- is used when E is a subprogram, and determines whether the profile of + -- the subprogram should be frozen as well. procedure Freeze_Expression (N : Node_Id); - -- Freezes the required entities when the Expression N causes freezing. + -- Freezes the required entities when subexpression N causes freezing. -- The node N here is either a subexpression node (a "real" expression) -- or a subtype mark, or a subtype indication. The latter two cases are -- not really expressions, but they can appear within expressions and - -- so need to be similarly treated. Freeze_Expression takes care of - -- determining the proper insertion point for generated freeze actions. + -- so need to be similarly treated. Freeze_Expression must be invoked + -- on every subexpression along the normal processing of an expression, + -- and will take care of determining the proper insertion point of the + -- generated freeze actions. - procedure Freeze_Expr_Types_Before + procedure Freeze_Full_Expression_Before (N : Node_Id; Expr : Node_Id; Def_Id : Entity_Id; Typ : Entity_Id := Empty); - -- This procedure freezes before N all the types referenced in Expr, - -- which is either the expression of the expression function Def_Id, - -- or the expression in a pre/post aspect that applies to Def_Id. + -- Freezes before N all the required entities when expression Expr causes + -- freezing, which is either the expression of the expression function + -- Def_Id, or the expression in a pre/post aspect that applies to Def_Id. + -- Freeze_Full_Expression_Before must be invoked once for an expression. -- If Typ is present, it is the type used to preanalyze and resolve a -- copy of Expr; if it is not, Expr is assumed to be already analyzed. diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index c4b09a227886..130cbcc7c976 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -443,7 +443,7 @@ package body Sem_Ch6 is -- with the function body. Ghost_Context_Checks_Disabled := True; - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => N, Expr => Expr, Def_Id => Def_Id,
