From: Eric Botcazou <[email protected]>
The special mechanism used to "deinitialize" an object in the presence of
a pragma Import works in conjunction with an address clause, but not with
an address aspect. This tweaks the expansion so as to plug this loophole.
gcc/ada/ChangeLog:
* einfo.ads (Initialization_Statements): Adjust description.
* exp_ch3.adb (Default_Initialize_Object): Use the special mechanism
of Initialization_Statements, if need be, instead of inserting the
initialization statements directly into the freeze actions.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/einfo.ads | 4 ++--
gcc/ada/exp_ch3.adb | 20 ++++++++++++--------
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads
index 960f39004ab..ea563109418 100644
--- a/gcc/ada/einfo.ads
+++ b/gcc/ada/einfo.ads
@@ -2344,8 +2344,8 @@ package Einfo is
-- call wrapper if available.
-- Initialization_Statements
--- Defined in constants and variables. For a composite object coming from
--- source and initialized with an aggregate or a call expanded in place,
+-- Defined in constants and variables. For composite objects coming from
+-- source and (default-)initialized with an aggregate or a function call,
-- points to a compound statement containing the assignment(s). This is
-- used for a couple of purposes: 1) to defer the initialization to the
-- freeze point if an address clause or a delayed aspect is present for
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index ed3061cc71a..3b823b6fa41 100644
--- a/gcc/ada/exp_ch3.adb
+++ b/gcc/ada/exp_ch3.adb
@@ -7504,6 +7504,8 @@ package body Exp_Ch3 is
-------------------------------
procedure Default_Initialize_Object (After : Node_Id) is
+ Marker : constant Node_Id := Next (After);
+
Init_Expr : Node_Id;
Init_Stmts : List_Id;
@@ -7557,16 +7559,18 @@ package body Exp_Ch3 is
Init_Stmts := Build_Default_Initialization (N, Typ, Def_Id);
end if;
- -- Insert the whole initialization sequence into the tree. If the
- -- object has a delayed freeze, as will be the case when it has
- -- aspect specifications, the initialization sequence is part of
- -- the freeze actions.
+ -- Insert the whole initialization sequence into the tree. Park the
+ -- generated statements if the declaration requires it and is not the
+ -- node that is wrapped in a transient scope.
if Present (Init_Stmts) then
- if Has_Delayed_Freeze (Def_Id) then
- Append_Freeze_Actions (Def_Id, Init_Stmts);
- else
- Insert_Actions_After (After, Init_Stmts);
+ Insert_Actions_After (After, Init_Stmts);
+
+ if not Special_Ret_Obj
+ and then Needs_Initialization_Statements (N)
+ and then not (Scope_Is_Transient and then N = Node_To_Be_Wrapped)
+ then
+ Move_To_Initialization_Statements (N, Marker);
end if;
end if;
end Default_Initialize_Object;
--
2.53.0