]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix wrong initialization of library-level object by conditional expression
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 21 Feb 2025 09:03:22 +0000 (10:03 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Fri, 6 Jun 2025 14:44:45 +0000 (16:44 +0200)
At library level the object must be allocated statically and with its bounds
when its nominal subtype is an unconstrained array type.

gcc/ada/ChangeLog:

* exp_ch4.adb (Insert_Conditional_Object_Declaration): Make sure the
object is allocated properly by the code generator at library level.

gcc/ada/exp_ch4.adb

index eb9fb6bba5696c318619bd824fbca3034837c1a1..793e468a0a3c7b01fb18a0648f035b8e4eb869c5 100644 (file)
@@ -13292,10 +13292,12 @@ package body Exp_Ch4 is
       Obj_Decl : constant Node_Id :=
         Make_Object_Declaration (Loc,
           Defining_Identifier => Obj_Id,
-          Aliased_Present     => Aliased_Present (Decl),
+          Aliased_Present     => True,
           Constant_Present    => Constant_Present (Decl),
           Object_Definition   => New_Copy_Tree (Object_Definition (Decl)),
           Expression          => Relocate_Node (Expr));
+      --  We make the object unconditionally aliased to avoid dangling bound
+      --  issues when its nominal subtype is an unconstrained array type.
 
       Master_Node_Decl : Node_Id;
       Master_Node_Id   : Entity_Id;
@@ -13310,6 +13312,11 @@ 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));
+
       --  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
       --  it will be declared in the arm of a conditional statement and 2) we