https://gcc.gnu.org/g:a252022d9a1f285e471d8b3b37fe645244919ab5

commit r15-474-ga252022d9a1f285e471d8b3b37fe645244919ab5
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Fri Feb 16 10:30:17 2024 +0100

    ada: Fix small inaccuracy in previous change
    
    The call to Build_Allocate_Deallocate_Proc must occur before the special
    accessibility check for class-wide allocation is generated, because this
    check comes with cleanup code.
    
    gcc/ada/
    
            * exp_ch4.adb (Expand_Allocator_Expression): Move the first call to
            Build_Allocate_Deallocate_Proc up to before the accessibility check.

Diff:
---
 gcc/ada/exp_ch4.adb | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index b1f7593de2ac..762e75616a7f 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -960,12 +960,18 @@ package body Exp_Ch4 is
             end if;
          end if;
 
+         --  This needs to done before generating the accessibility check below
+         --  because the check comes with cleanup code that invokes Free on the
+         --  temporary and, therefore, expects the object to be attached to its
+         --  finalization collection if it is controlled.
+
+         Build_Allocate_Deallocate_Proc (Declaration_Node (Temp), Mark => N);
+
          --  Note: the accessibility check must be inserted after the call to
          --  [Deep_]Adjust to ensure proper completion of the assignment.
 
          Apply_Accessibility_Check_For_Allocator (N, Exp, Temp);
 
-         Build_Allocate_Deallocate_Proc (Declaration_Node (Temp), Mark => N);
          Rewrite (N, New_Occurrence_Of (Temp, Loc));
          Analyze_And_Resolve (N, PtrT);

Reply via email to