When checking legality of the iterated_component_association's
expression the index parameter must be in scope, even its range is null.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* exp_aggr.adb (Gen_Loop): Analyze copy of the expression in the
scope of the implicit loop with name of the index parameter
visible.
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb
--- a/gcc/ada/exp_aggr.adb
+++ b/gcc/ada/exp_aggr.adb
@@ -53,6 +53,7 @@ with Sem; use Sem;
with Sem_Aggr; use Sem_Aggr;
with Sem_Aux; use Sem_Aux;
with Sem_Ch3; use Sem_Ch3;
+with Sem_Ch8; use Sem_Ch8;
with Sem_Ch13; use Sem_Ch13;
with Sem_Eval; use Sem_Eval;
with Sem_Mech; use Sem_Mech;
@@ -1954,7 +1955,30 @@ package body Exp_Aggr is
Expander_Mode_Save_And_Set (False);
Tcopy := New_Copy_Tree (Expr);
Set_Parent (Tcopy, N);
- Analyze_And_Resolve (Tcopy, Component_Type (Etype (N)));
+
+ -- For iterated_component_association analyze and resolve
+ -- the expression with name of the index parameter visible.
+ -- To manipulate scopes, we use entity of the implicit loop.
+
+ if Is_Iterated_Component then
+ declare
+ Index_Parameter : constant Entity_Id :=
+ Defining_Identifier (Parent (Expr));
+ begin
+ Push_Scope (Scope (Index_Parameter));
+ Enter_Name (Index_Parameter);
+ Analyze_And_Resolve
+ (Tcopy, Component_Type (Etype (N)));
+ End_Scope;
+ end;
+
+ -- For ordinary component association, just analyze and
+ -- resolve the expression.
+
+ else
+ Analyze_And_Resolve (Tcopy, Component_Type (Etype (N)));
+ end if;
+
Expander_Mode_Restore;
end if;
end if;