From 6236cd3d4f8e77d8a3c1ed59a01ced46394bcee4 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 20 Feb 2026 20:46:30 +0100 Subject: [PATCH] Ada: Fix finalization glitch for pools with subpools Finalize_Pool calls Finalize_And_Deallocate on every subpool handle, but the parameter is declared with In Out mode, so the call ends up writing back the updated value into the node that was just deallocated. gcc/ada/ * libgnat/s-stposu.adb (Finalize_Pool): Pass a local copy of the handle in the call to Finalize_And_Deallocate. --- gcc/ada/libgnat/s-stposu.adb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/gcc/ada/libgnat/s-stposu.adb b/gcc/ada/libgnat/s-stposu.adb index a77ddb77467e..5c28f0e36e70 100644 --- a/gcc/ada/libgnat/s-stposu.adb +++ b/gcc/ada/libgnat/s-stposu.adb @@ -398,6 +398,7 @@ package body System.Storage_Pools.Subpools is procedure Finalize_Pool (Pool : in out Root_Storage_Pool_With_Subpools) is Curr_Ptr : SP_Node_Ptr; Ex_Occur : Exception_Occurrence; + Handle : Subpool_Handle; Raised : Boolean := False; function Is_Empty_List (L : not null SP_Node_Ptr) return Boolean; @@ -432,16 +433,13 @@ package body System.Storage_Pools.Subpools is while not Is_Empty_List (Pool.Subpools'Unchecked_Access) loop Curr_Ptr := Pool.Subpools.Next; - -- Perform the following actions: - - -- 1) Finalize all objects chained on the subpool's collection - -- 2) Remove the subpool from the owner's list of subpools - -- 3) Deallocate the doubly linked list node associated with the - -- subpool. - -- 4) Call Deallocate_Subpool + -- Finalize and deallocate the subpool. Beware that the node pointed + -- to by Curr_Ptr will be deallocated so may not be passed as actual + -- in the call, since the formal parameter is In Out. begin - Finalize_And_Deallocate (Curr_Ptr.Subpool); + Handle := Curr_Ptr.Subpool; + Finalize_And_Deallocate (Handle); exception when Fin_Occur : others =>