diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index fcbc82f561048c010754d5b87a7044fd831929e8..d8895d648d4c0470ccbcc49a283059f8eabd2d08 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -5549,6 +5549,7 @@ package body Exp_Ch4 is
               Make_Object_Declaration (Loc,
                 Defining_Identifier => Cnn,
                 Object_Definition   => New_Occurrence_Of (Ptr_Typ, Loc));
+            Set_No_Initialization (Decl);
 
             --  Generate:
             --    if Cond then
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index e411f32a51918ab475d12e6c6551328721c2ae57..103d59e4deba6347fc4b9119476babb51ed5cf88 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -8234,11 +8234,6 @@ package body Exp_Util is
       Obj_Id  : constant Entity_Id := Defining_Identifier (Decl);
       Obj_Typ : constant Entity_Id := Base_Type (Etype (Obj_Id));
 
-      function Initialized_By_Access (Trans_Id : Entity_Id) return Boolean;
-      --  Determine whether transient object Trans_Id is initialized either
-      --  by a function call which returns an access type or simply renames
-      --  another pointer.
-
       function Initialized_By_Aliased_BIP_Func_Call
         (Trans_Id : Entity_Id) return Boolean;
       --  Determine whether transient object Trans_Id is initialized by a
@@ -8247,6 +8242,11 @@ package body Exp_Util is
       --  This case creates an aliasing between the returned value and the
       --  value denoted by BIPaccess.
 
+      function Initialized_By_Reference (Trans_Id : Entity_Id) return Boolean;
+      --  Determine whether transient object Trans_Id is initialized by a
+      --  reference to another object. This is the only case where we can
+      --  possibly finalize a transient object through an access value.
+
       function Is_Aliased
         (Trans_Id   : Entity_Id;
          First_Stmt : Node_Id) return Boolean;
@@ -8254,9 +8254,6 @@ package body Exp_Util is
       --  aliased through 'reference in the statement list starting from
       --  First_Stmt.
 
-      function Is_Allocated (Trans_Id : Entity_Id) return Boolean;
-      --  Determine whether transient object Trans_Id is allocated on the heap
-
       function Is_Indexed_Container
         (Trans_Id   : Entity_Id;
          First_Stmt : Node_Id) return Boolean;
@@ -8275,20 +8272,6 @@ package body Exp_Util is
       --  Return True if N is directly part of a build-in-place return
       --  statement.
 
-      ---------------------------
-      -- Initialized_By_Access --
-      ---------------------------
-
-      function Initialized_By_Access (Trans_Id : Entity_Id) return Boolean is
-         Expr : constant Node_Id := Expression (Parent (Trans_Id));
-
-      begin
-         return
-           Present (Expr)
-             and then Nkind (Expr) /= N_Reference
-             and then Is_Access_Type (Etype (Expr));
-      end Initialized_By_Access;
-
       ------------------------------------------
       -- Initialized_By_Aliased_BIP_Func_Call --
       ------------------------------------------
@@ -8386,6 +8369,18 @@ package body Exp_Util is
          return False;
       end Initialized_By_Aliased_BIP_Func_Call;
 
+      ------------------------------
+      -- Initialized_By_Reference --
+      ------------------------------
+
+      function Initialized_By_Reference (Trans_Id : Entity_Id) return Boolean
+      is
+         Expr : constant Node_Id := Expression (Parent (Trans_Id));
+
+      begin
+         return Present (Expr) and then Nkind (Expr) = N_Reference;
+      end Initialized_By_Reference;
+
       ----------------
       -- Is_Aliased --
       ----------------
@@ -8533,19 +8528,6 @@ package body Exp_Util is
          end if;
       end Is_Aliased;
 
-      ------------------
-      -- Is_Allocated --
-      ------------------
-
-      function Is_Allocated (Trans_Id : Entity_Id) return Boolean is
-         Expr : constant Node_Id := Expression (Parent (Trans_Id));
-      begin
-         return
-           Is_Access_Type (Etype (Trans_Id))
-             and then Present (Expr)
-             and then Nkind (Expr) = N_Allocator;
-      end Is_Allocated;
-
       --------------------------
       -- Is_Indexed_Container --
       --------------------------
@@ -8773,17 +8755,11 @@ package body Exp_Util is
 
           and then not Is_Aliased (Obj_Id, Decl)
 
-          --  Do not consider transient objects allocated on the heap since
-          --  they are attached to a finalization collection.
-
-          and then not Is_Allocated (Obj_Id)
-
-          --  If the transient object is a pointer, check that it is not
-          --  initialized by a function that returns a pointer or acts as a
-          --  renaming of another pointer.
+          --  If the transient object is of an access type, check that it is
+          --  initialized by a reference to another object.
 
-          and then not
-            (Is_Access_Type (Obj_Typ) and then Initialized_By_Access (Obj_Id))
+          and then (not Is_Access_Type (Obj_Typ)
+                     or else Initialized_By_Reference (Obj_Id))
 
           --  Do not consider transient objects which act as indirect aliases
           --  of build-in-place function results.