From: Eric Botcazou <ebotca...@adacore.com>

The previous fix was not robust enough in the presence of transient scopes.

gcc/ada/ChangeLog:

        * exp_ch4.adb (Insert_Conditional_Object_Declaration): Deal with a
        transient scope being created around the declaration.
        * freeze.adb (Freeze_Entity): Do not call Freeze_Static_Object for
        a renaming declaration.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/exp_ch4.adb | 14 ++++++++++++--
 gcc/ada/freeze.adb  |  3 ++-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index 1c2a8763711..0cf5643ebe4 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -13321,9 +13321,19 @@ package body Exp_Ch4 is
       Insert_Action (Expr, Obj_Decl);
 
       --  The object can never be local to an elaboration routine at library
-      --  level since we will take 'Unrestricted_Access of it.
+      --  level since we will take 'Unrestricted_Access of it. Beware that
+      --  Is_Library_Level_Entity always returns False when called from within
+      --  a transient scope, but the associated block will not be materialized
+      --  when the transient scope is finally closed in the case of an object
+      --  declaration (see Exp.Ch7.Wrap_Transient_Declaration).
 
-      Set_Is_Statically_Allocated (Obj_Id, Is_Library_Level_Entity (Obj_Id));
+      if Scope (Obj_Id) = Current_Scope and then Scope_Is_Transient then
+         Set_Is_Statically_Allocated
+           (Obj_Id, Is_Library_Level_Entity (Scope (Obj_Id)));
+      else
+         Set_Is_Statically_Allocated
+           (Obj_Id, Is_Library_Level_Entity (Obj_Id));
+      end if;
 
       --  If the object needs finalization, we need to insert its Master_Node
       --  manually because 1) the machinery in Exp_Ch7 will not pick it since
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index ce9a9742274..076d4eead6b 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -6870,9 +6870,10 @@ package body Freeze is
                end if;
             end if;
 
-            --  Static objects require special handling
+            --  Statically allocated objects require special handling
 
             if (Ekind (E) = E_Constant or else Ekind (E) = E_Variable)
+              and then No (Renamed_Object (E))
               and then Is_Statically_Allocated (E)
             then
                Freeze_Static_Object (E);
-- 
2.43.0

Reply via email to