https://gcc.gnu.org/g:6d93014989ba6a935309ff8ffb818c3b2a50c8af

commit r16-6610-g6d93014989ba6a935309ff8ffb818c3b2a50c8af
Author: Eric Botcazou <[email protected]>
Date:   Mon Nov 17 21:18:28 2025 +0100

    ada: Rename Find_Hook_Context function
    
    The hook moniker is an obsolete reference to the previous implementation of
    object finalization, which used hooks (and counters) to manage the objects.
    
    gcc/ada/ChangeLog:
    
            * exp_util.ads (Find_Hook_Context): Rename to...
            (Find_Master_Context): ...this and alphabetize.
            * exp_util.adb (Find_Master_Context): Rename to...
            (Find_Master_Context): ...this and alphabetize.
            * exp_ch4.adb (Insert_Conditional_Object_Declaration): Adjust to
            above renaming.
            (Process_Transients_In_Expression): Likewise.

Diff:
---
 gcc/ada/exp_ch4.adb  |  10 +-
 gcc/ada/exp_util.adb | 297 +++++++++++++++++++++++++--------------------------
 gcc/ada/exp_util.ads |  14 +--
 3 files changed, 159 insertions(+), 162 deletions(-)

diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index 1d167e01b8c3..28d7f5967774 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -13436,7 +13436,7 @@ package body Exp_Ch4 is
 
          --  The master is the innermost enclosing non-transient construct
 
-         Insert_Action (Find_Hook_Context (Expr), Master_Node_Decl);
+         Insert_Action (Find_Master_Context (Expr), Master_Node_Decl);
 
          --  Propagate the relaxed finalization semantics
 
@@ -14896,7 +14896,7 @@ package body Exp_Ch4 is
          Loc    : constant Source_Ptr := Sloc (Obj_Decl);
          Obj_Id : constant Entity_Id  := Defining_Identifier (Obj_Decl);
 
-         Hook_Context : constant Node_Id := Find_Hook_Context (Expr);
+         Master_Context : constant Node_Id := Find_Master_Context (Expr);
          --  The node after which to insert deferred finalization actions. This
          --  is usually the innermost enclosing non-transient construct.
 
@@ -14938,7 +14938,7 @@ package body Exp_Ch4 is
          --  enclosing non-transient construct.
 
          else
-            Fin_Context := Hook_Context;
+            Fin_Context := Master_Context;
          end if;
 
          --  Create the declaration of the Master_Node for the object and
@@ -14948,7 +14948,7 @@ package body Exp_Ch4 is
          Master_Node_Id := Make_Temporary (Loc, 'N');
          Master_Node_Decl :=
            Make_Master_Node_Declaration (Loc, Master_Node_Id, Obj_Id);
-         Insert_Action (Hook_Context, Master_Node_Decl);
+         Insert_Action (Master_Context, Master_Node_Decl);
 
          --  Generate the attachment of the object to the Master_Node
 
@@ -14968,7 +14968,7 @@ package body Exp_Ch4 is
 
          --  Finalize the object after the context has been evaluated
 
-         --  Note that the node returned by Find_Hook_Context above may be an
+         --  Note that the node returned by Find_Master_Context above may be an
          --  operator, which is not a list member. We must locate the proper
          --  node in the tree after which to insert the finalization call.
 
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index 4dc4b03da68d..f231dab21686 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -6771,6 +6771,153 @@ package body Exp_Util is
       return Last_Init;
    end Find_Last_Init;
 
+   -------------------------
+   -- Find_Master_Context --
+   -------------------------
+
+   function Find_Master_Context (N : Node_Id) return Node_Id is
+      Par : Node_Id;
+      Top : Node_Id;
+
+      Wrapped_Node : Node_Id;
+      --  Note: if we are in a transient scope, we want to reuse it as the
+      --  context for inserting actions, if possible. But if N is itself
+      --  part of the stored actions of the current transient scope, then
+      --  we need to insert at the appropriate (inner) location in the list.
+
+   begin
+      --  When the node is inside a case/if expression, the lifetime of any
+      --  temporary controlled object is extended. Find a suitable insertion
+      --  node by locating the topmost case or if expressions.
+
+      if Within_Conditional_Expression (N) then
+         Par := N;
+         Top := N;
+         while Present (Par) loop
+            if Nkind (Original_Node (Par)) in N_Case_Expression
+                                            | N_If_Expression
+            then
+               Top := Par;
+
+            elsif Nkind (Par) in N_Case_Statement
+                               | N_If_Statement
+              and then From_Conditional_Expression (Par)
+            then
+               Top := Par;
+
+            --  Prevent the search from going too far
+
+            elsif Is_Body_Or_Package_Declaration (Par) then
+               exit;
+            end if;
+
+            Par := Parent (Par);
+         end loop;
+
+         --  The topmost case or if expression is now recovered, but it may
+         --  still not be the correct place to add generated code. Climb to
+         --  find a parent that is part of a declarative or statement list,
+         --  and is not a list of actuals in a call.
+
+         Par := Top;
+         while Present (Par) loop
+            if Is_List_Member (Par)
+              and then Nkind (Par) not in N_Component_Association
+                                        | N_Discriminant_Association
+                                        | N_Parameter_Association
+                                        | N_Pragma_Argument_Association
+                                        | N_Aggregate
+                                        | N_Delta_Aggregate
+                                        | N_Extension_Aggregate
+                                        | N_Elsif_Part
+              and then Nkind (Parent (Par)) not in N_Function_Call
+                                                 | N_Procedure_Call_Statement
+                                                 | N_Entry_Call_Statement
+                                                 | N_Aggregate
+                                                 | N_Delta_Aggregate
+                                                 | N_Extension_Aggregate
+            then
+               return Par;
+
+            --  Prevent the search from going too far
+
+            elsif Is_Body_Or_Package_Declaration (Par) then
+               exit;
+            end if;
+
+            Par := Parent (Par);
+         end loop;
+
+         return Par;
+
+      else
+         Par := N;
+         while Present (Par) loop
+
+            --  Keep climbing past various operators
+
+            if Nkind (Parent (Par)) in N_Op
+              or else Nkind (Parent (Par)) in N_And_Then | N_Or_Else
+            then
+               Par := Parent (Par);
+            else
+               exit;
+            end if;
+         end loop;
+
+         Top := Par;
+
+         --  The node may be located in a pragma in which case return the
+         --  pragma itself:
+
+         --    pragma Precondition (... and then Ctrl_Func_Call ...);
+
+         --  Similar case occurs when the node is related to an object
+         --  declaration or assignment:
+
+         --    Obj [: Some_Typ] := ... and then Ctrl_Func_Call ...;
+
+         --  Another case to consider is when the node is part of a return
+         --  statement:
+
+         --    return ... and then Ctrl_Func_Call ...;
+
+         --  Another case is when the node acts as a formal in a procedure
+         --  call statement:
+
+         --    Proc (... and then Ctrl_Func_Call ...);
+
+         if Scope_Is_Transient then
+            Wrapped_Node := Node_To_Be_Wrapped;
+         else
+            Wrapped_Node := Empty;
+         end if;
+
+         while Present (Par) loop
+            if Par = Wrapped_Node
+              or else Nkind (Par) in N_Assignment_Statement
+                                   | N_Object_Declaration
+                                   | N_Pragma
+                                   | N_Procedure_Call_Statement
+                                   | N_Simple_Return_Statement
+            then
+               return Par;
+
+            --  Prevent the search from going too far
+
+            elsif Is_Body_Or_Package_Declaration (Par) then
+               exit;
+            end if;
+
+            Par := Parent (Par);
+         end loop;
+
+         --  Return the topmost short circuit operator
+
+         return Top;
+      end if;
+   end Find_Master_Context;
+
    ---------------------------
    -- Find_Optional_Prim_Op --
    ---------------------------
@@ -6977,156 +7124,6 @@ package body Exp_Util is
       end if;
    end Find_Storage_Op;
 
-   -----------------------
-   -- Find_Hook_Context --
-   -----------------------
-
-   function Find_Hook_Context (N : Node_Id) return Node_Id is
-      Par : Node_Id;
-      Top : Node_Id;
-
-      Wrapped_Node : Node_Id;
-      --  Note: if we are in a transient scope, we want to reuse it as
-      --  the context for actions insertion, if possible. But if N is itself
-      --  part of the stored actions for the current transient scope,
-      --  then we need to insert at the appropriate (inner) location in
-      --  the not as an action on Node_To_Be_Wrapped.
-
-      In_Cond_Expr : constant Boolean := Within_Conditional_Expression (N);
-
-   begin
-      --  When the node is inside a case/if expression, the lifetime of any
-      --  temporary controlled object is extended. Find a suitable insertion
-      --  node by locating the topmost case or if expressions.
-
-      if In_Cond_Expr then
-         Par := N;
-         Top := N;
-         while Present (Par) loop
-            if Nkind (Original_Node (Par)) in N_Case_Expression
-                                            | N_If_Expression
-            then
-               Top := Par;
-
-            elsif Nkind (Par) in N_Case_Statement
-                               | N_If_Statement
-              and then From_Conditional_Expression (Par)
-            then
-               Top := Par;
-
-            --  Prevent the search from going too far
-
-            elsif Is_Body_Or_Package_Declaration (Par) then
-               exit;
-            end if;
-
-            Par := Parent (Par);
-         end loop;
-
-         --  The topmost case or if expression is now recovered, but it may
-         --  still not be the correct place to add generated code. Climb to
-         --  find a parent that is part of a declarative or statement list,
-         --  and is not a list of actuals in a call.
-
-         Par := Top;
-         while Present (Par) loop
-            if Is_List_Member (Par)
-              and then Nkind (Par) not in N_Component_Association
-                                        | N_Discriminant_Association
-                                        | N_Parameter_Association
-                                        | N_Pragma_Argument_Association
-                                        | N_Aggregate
-                                        | N_Delta_Aggregate
-                                        | N_Extension_Aggregate
-                                        | N_Elsif_Part
-              and then Nkind (Parent (Par)) not in N_Function_Call
-                                                 | N_Procedure_Call_Statement
-                                                 | N_Entry_Call_Statement
-                                                 | N_Aggregate
-                                                 | N_Delta_Aggregate
-                                                 | N_Extension_Aggregate
-            then
-               return Par;
-
-            --  Prevent the search from going too far
-
-            elsif Is_Body_Or_Package_Declaration (Par) then
-               exit;
-            end if;
-
-            Par := Parent (Par);
-         end loop;
-
-         return Par;
-
-      else
-         Par := N;
-         while Present (Par) loop
-
-            --  Keep climbing past various operators
-
-            if Nkind (Parent (Par)) in N_Op
-              or else Nkind (Parent (Par)) in N_And_Then | N_Or_Else
-            then
-               Par := Parent (Par);
-            else
-               exit;
-            end if;
-         end loop;
-
-         Top := Par;
-
-         --  The node may be located in a pragma in which case return the
-         --  pragma itself:
-
-         --    pragma Precondition (... and then Ctrl_Func_Call ...);
-
-         --  Similar case occurs when the node is related to an object
-         --  declaration or assignment:
-
-         --    Obj [: Some_Typ] := ... and then Ctrl_Func_Call ...;
-
-         --  Another case to consider is when the node is part of a return
-         --  statement:
-
-         --    return ... and then Ctrl_Func_Call ...;
-
-         --  Another case is when the node acts as a formal in a procedure
-         --  call statement:
-
-         --    Proc (... and then Ctrl_Func_Call ...);
-
-         if Scope_Is_Transient then
-            Wrapped_Node := Node_To_Be_Wrapped;
-         else
-            Wrapped_Node := Empty;
-         end if;
-
-         while Present (Par) loop
-            if Par = Wrapped_Node
-              or else Nkind (Par) in N_Assignment_Statement
-                                   | N_Object_Declaration
-                                   | N_Pragma
-                                   | N_Procedure_Call_Statement
-                                   | N_Simple_Return_Statement
-            then
-               return Par;
-
-            --  Prevent the search from going too far
-
-            elsif Is_Body_Or_Package_Declaration (Par) then
-               exit;
-            end if;
-
-            Par := Parent (Par);
-         end loop;
-
-         --  Return the topmost short circuit operator
-
-         return Top;
-      end if;
-   end Find_Hook_Context;
-
    -----------------------------------------
    -- Flag_Interface_Pointer_Displacement --
    -----------------------------------------
diff --git a/gcc/ada/exp_util.ads b/gcc/ada/exp_util.ads
index c866acd76b8f..318225abd69d 100644
--- a/gcc/ada/exp_util.ads
+++ b/gcc/ada/exp_util.ads
@@ -644,6 +644,13 @@ package Exp_Util is
    --  Same as Find_Prim_Op but for the three controlled primitive operations,
    --  and returns Empty if not found.
 
+   function Find_Master_Context (N : Node_Id) return Node_Id;
+   --  Determine a suitable node on which to attach actions related to N that
+   --  need to be performed immediately after the execution of N is complete.
+   --  In general this is the topmost expression or statement of which N is a
+   --  subexpression, but note that object declarations may be returned here,
+   --  although they are not master constructs in the language.
+
    function Find_Optional_Prim_Op
      (T : Entity_Id; Name : Name_Id) return Entity_Id;
    function Find_Optional_Prim_Op
@@ -673,13 +680,6 @@ package Exp_Util is
    --  indicating that the operation is defaulted in the aspect (can occur in
    --  the case where the storage-model address type is System.Address).
 
-   function Find_Hook_Context (N : Node_Id) return Node_Id;
-   --  Determine a suitable node on which to attach actions related to N that
-   --  need to be elaborated unconditionally. In general this is the topmost
-   --  expression of which N is a subexpression, which in turn may or may not
-   --  be evaluated, for example if N is the right operand of a short circuit
-   --  operator.
-
    procedure Flag_Interface_Pointer_Displacement (N : Node_Id);
    --  If N is an N_Type_Conversion node then flag N to indicate that this
    --  type conversion was internally added to force the displacement of the

Reply via email to