aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Poulhiès <poulhies@adacore.com>2023-04-11 09:46:33 +0200
committerMarc Poulhiès <poulhies@adacore.com>2023-06-13 09:31:45 +0200
commit659aeb219401210220a521eccd6ad95620841245 (patch)
treeb3ef39925d5a720939ab08be68a46ddd4ecda54c
parent5225a2b2ecd8e876f7a879f70bb74d563ab953cd (diff)
downloadgcc-659aeb219401210220a521eccd6ad95620841245.zip
gcc-659aeb219401210220a521eccd6ad95620841245.tar.gz
gcc-659aeb219401210220a521eccd6ad95620841245.tar.bz2
ada: Fix iterated component initialization
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 <schonberg@adacore.com>
-rw-r--r--gcc/ada/sem_aggr.adb11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb
index 3b2d034..843606a 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);