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);