From: Eric Botcazou <ebotca...@adacore.com> This aligns finalization collections with finalization masters when it comes to propagating an exception raised by the finalization of a specific object, by always propagating Program_Error instead of the aforementioned exception.
gcc/ada/ * libgnat/s-finpri.adb (Raise_From_Controlled_Operation): New declaration of imported procedure moved from... (Finalize_Master): ...there. (Finalize): Call Raise_From_Controlled_Operation instead of Reraise_Occurrence to propagate the exception, if any. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/libgnat/s-finpri.adb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gcc/ada/libgnat/s-finpri.adb b/gcc/ada/libgnat/s-finpri.adb index bd70e582de3..89f5f2952e4 100644 --- a/gcc/ada/libgnat/s-finpri.adb +++ b/gcc/ada/libgnat/s-finpri.adb @@ -37,6 +37,10 @@ with System.Soft_Links; use System.Soft_Links; package body System.Finalization_Primitives is + procedure Raise_From_Controlled_Operation (X : Exception_Occurrence); + pragma Import (Ada, Raise_From_Controlled_Operation, + "__gnat_raise_from_controlled_operation"); + function To_Collection_Node_Ptr is new Ada.Unchecked_Conversion (Address, Collection_Node_Ptr); @@ -297,7 +301,7 @@ package body System.Finalization_Primitives is -- If one of the finalization actions raised an exception, reraise it if Finalization_Exception_Raised then - Reraise_Occurrence (Exc_Occur); + Raise_From_Controlled_Operation (Exc_Occur); end if; end Finalize; @@ -306,12 +310,8 @@ package body System.Finalization_Primitives is --------------------- procedure Finalize_Master (Master : in out Finalization_Master) is - procedure Raise_From_Controlled_Operation (X : Exception_Occurrence); - pragma Import (Ada, Raise_From_Controlled_Operation, - "__gnat_raise_from_controlled_operation"); - - Finalization_Exception_Raised : Boolean := False; Exc_Occur : Exception_Occurrence; + Finalization_Exception_Raised : Boolean := False; Node : Master_Node_Ptr; begin -- 2.43.2