aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Poulhiès <poulhies@adacore.com>2022-02-18 16:35:06 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-13 08:04:42 +0000
commite3584606f5cb9bfc717a19e96731bc35ea11a40e (patch)
tree3084c5cada38a85596080780ac2683c9f2ce7b3e /gcc
parent4c9a8183b3469f50c9418a2309e56b37cbac9f9f (diff)
downloadgcc-e3584606f5cb9bfc717a19e96731bc35ea11a40e.zip
gcc-e3584606f5cb9bfc717a19e96731bc35ea11a40e.tar.gz
gcc-e3584606f5cb9bfc717a19e96731bc35ea11a40e.tar.bz2
[Ada] Fix iterated component association for array aggregate
Create a scope for the Ada 2022 iterated component association loops. In the case of elements needing finalization, the late expansion would crash on references to the loop variable within the loop body. gcc/ada/ * exp_aggr.adb (Gen_Loop): Create scope for loop variable of iterated components.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/exp_aggr.adb24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb
index 939d091..72f6555 100644
--- a/gcc/ada/exp_aggr.adb
+++ b/gcc/ada/exp_aggr.adb
@@ -1916,6 +1916,8 @@ package body Exp_Aggr is
Is_Iterated_Component : constant Boolean :=
Parent_Kind (Expr) = N_Iterated_Component_Association;
+ Ent : Entity_Id;
+
L_J : Node_Id;
L_L : Node_Id;
@@ -2025,10 +2027,28 @@ package body Exp_Aggr is
-- Otherwise construct the loop, starting with the loop index L_J
if Is_Iterated_Component then
+
+ -- Create a new scope for the loop variable so that the
+ -- following Gen_Assign (that ends up calling
+ -- Preanalyze_And_Resolve) can correctly find it.
+
+ Ent := New_Internal_Entity (E_Loop,
+ Current_Scope, Loc, 'L');
+ Set_Etype (Ent, Standard_Void_Type);
+ Set_Parent (Ent, Parent (Parent (Expr)));
+ Push_Scope (Ent);
+
L_J :=
Make_Defining_Identifier (Loc,
Chars => (Chars (Defining_Identifier (Parent (Expr)))));
+ Enter_Name (L_J);
+
+ -- The Etype will be set by a later Analyze call.
+ Set_Etype (L_J, Any_Type);
+
+ Mutate_Ekind (L_J, E_Variable);
+ Set_Scope (L_J, Ent);
else
L_J := Make_Temporary (Loc, 'J', L);
end if;
@@ -2083,6 +2103,10 @@ package body Exp_Aggr is
Iteration_Scheme => L_Iteration_Scheme,
Statements => L_Body));
+ if Is_Iterated_Component then
+ End_Scope;
+ end if;
+
-- A small optimization: if the aggregate is initialized with a box
-- and the component type has no initialization procedure, remove the
-- useless empty loop.