From: Gary Dismukes <dismu...@adacore.com> The compiler crashes on a container aggregate with more than one iterated_element_association given by a loop_parameter_specification. In such a case, the tree contains N_Iterated_Component_Association nodes rather than N_Iterated_Element_Association nodes, and the code for handling those needs to obtain the bounds from the Discrete_Choices field of each N_Iterated_Component_Association rather than assuming that the association has a normal list of choices.
gcc/ada/ * sem_aggr.adb (Resolve_Container_Aggregate): In the case where Comp is an N_Iterated_Component_Association, pick up Discrete_Choices rather than Choices. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/sem_aggr.adb | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index d3f9a773191..bc03a079f5a 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -3575,7 +3575,23 @@ package body Sem_Aggr is end if; end if; else - Choice := First (Choices (Comp)); + + -- If Nkind is N_Iterated_Component_Association, + -- this corresponds to an iterator_specification + -- with a loop_parameter_specification, and we + -- have to pick up Discrete_Choices. In this case + -- there will be just one "choice", which will + -- typically be a range. + + if Nkind (Comp) = N_Iterated_Component_Association + then + Choice := First (Discrete_Choices (Comp)); + + -- Case where there's a list of choices + + else + Choice := First (Choices (Comp)); + end if; while Present (Choice) loop Get_Index_Bounds (Choice, Lo, Hi); -- 2.42.0