The call to Resolve_Aggr_Expr may leave references to temporary entities used to check for the construct legality and meant to be removed.
Using Preanalyze_And_Resolve correctly guarantees that there is no visible occurrence of such entities. gcc/ada/ * sem_aggr.adb (Resolve_Iterated_Component_Association): Call Preanalyze_And_Resolve instead of Resolve_Aggr_Expr except for aggregate. Co-authored-by: Ed Schonberg <schonb...@adacore.com> Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/sem_aggr.adb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index 3b2d0347b41..843606ab4a1 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -1862,9 +1862,14 @@ package body Sem_Aggr is Expr := Expression (N); - Expander_Mode_Save_And_Set (False); - Dummy := Resolve_Aggr_Expr (Expr, Single_Elmt => False); - Expander_Mode_Restore; + if Nkind (Expr) = N_Aggregate then + -- If the expression is an aggregate, this is a multidimensional + -- aggregate where the component type must be propagated downward. + + Dummy := Resolve_Aggr_Expr (Expr, Single_Elmt => False); + else + Preanalyze_And_Resolve (Expr, Component_Typ); + end if; if Operating_Mode /= Check_Semantics then Remove_References (Expr); -- 2.40.0