https://gcc.gnu.org/g:3ca2ce5071ef54a848c339fe2d34d88ad994a72b

commit r16-1378-g3ca2ce5071ef54a848c339fe2d34d88ad994a72b
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Tue Mar 25 18:23:50 2025 +0100

    ada: Fix wrong initialization of library-level object by conditional 
expression
    
    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.

Diff:
---
 gcc/ada/exp_ch4.adb | 16 +++++++++++++---
 gcc/ada/freeze.adb  |  3 ++-
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index 1c2a87637111..0cf5643ebe47 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.
-
-      Set_Is_Statically_Allocated (Obj_Id, Is_Library_Level_Entity (Obj_Id));
+      --  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).
+
+      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 ce9a97422746..076d4eead6b9 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);

Reply via email to