[Ada] Finalization of uninitialized object with build in place call

gcc/ada/

	* exp_ch6.adb (Make_Build_In_Place_Call_In_Object_Declaration):
	Call Set_BIP_Initialization_Call systematically.
	* exp_ch7.adb (Process_Transient_In_Scope): Take
	BIP_Initialization_Call into account to decide where to insert
	the Hook.
This commit is contained in:
Arnaud Charlet 2020-06-28 06:24:26 -04:00 committed by Pierre-Marie de Rodat
parent b87042ccc5
commit 7e8e3cb479
2 changed files with 13 additions and 5 deletions

View File

@ -9593,7 +9593,7 @@ package body Exp_Ch6 is
-- which prompted the generation of the transient block. To resolve
-- this scenario, store the build-in-place call.
if Scope_Is_Transient and then Node_To_Be_Wrapped = Obj_Decl then
if Scope_Is_Transient then
Set_BIP_Initialization_Call (Obj_Def_Id, Res_Decl);
end if;

View File

@ -5668,10 +5668,18 @@ package body Exp_Ch7 is
-- <or>
-- Hook := Obj_Id'Unrestricted_Access;
if Ekind (Obj_Id) in E_Constant | E_Variable
and then Present (Last_Aggregate_Assignment (Obj_Id))
then
Hook_Insert := Last_Aggregate_Assignment (Obj_Id);
-- Similarly if we have a build in place call: we must
-- initialize Hook only after the call has happened, otherwise
-- Obj_Id will not be initialized yet.
if Ekind (Obj_Id) in E_Constant | E_Variable then
if Present (Last_Aggregate_Assignment (Obj_Id)) then
Hook_Insert := Last_Aggregate_Assignment (Obj_Id);
elsif Present (BIP_Initialization_Call (Obj_Id)) then
Hook_Insert := BIP_Initialization_Call (Obj_Id);
else
Hook_Insert := Obj_Decl;
end if;
-- Otherwise the hook seizes the related object immediately