aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Baird <baird@adacore.com>2022-01-14 14:10:25 -0800
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-10 08:19:21 +0000
commita445a8692c43d14c494e1edf505ee4f33cb98bb6 (patch)
treefe3033771bba214d53211df1687fdc2a57388706
parent3d9e2004fe4e15b133bd8472c4bf46cbff809583 (diff)
downloadgcc-a445a8692c43d14c494e1edf505ee4f33cb98bb6.zip
gcc-a445a8692c43d14c494e1edf505ee4f33cb98bb6.tar.gz
gcc-a445a8692c43d14c494e1edf505ee4f33cb98bb6.tar.bz2
[Ada] Failure compiling "for ... of" loop over a slice
In some cases involving a "for ... of" loop (not to be confused with the more common "for ... in" loop) iterating over a slice, compilation would fail with an internal compiler error. gcc/ada/ * sem_util.adb (Get_Actual_Subtype): If a new subtype is built, do not freeze it if Expander_Active is False. The idea here is to avoid generating an unwanted Freeze_Node for a subtype that has been conjured up solely for purposes of preanalysis.
-rw-r--r--gcc/ada/sem_util.adb26
1 files changed, 18 insertions, 8 deletions
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index d76b5d9..c58b63d 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -10724,14 +10724,24 @@ package body Sem_Util is
Set_Is_Itype (Atyp);
Analyze (Decl, Suppress => All_Checks);
Set_Associated_Node_For_Itype (Atyp, N);
- Set_Has_Delayed_Freeze (Atyp, False);
-
- -- We need to freeze the actual subtype immediately. This is
- -- needed, because otherwise this Itype will not get frozen
- -- at all, and it is always safe to freeze on creation because
- -- any associated types must be frozen at this point.
-
- Freeze_Itype (Atyp, N);
+ if Expander_Active then
+ Set_Has_Delayed_Freeze (Atyp, False);
+
+ -- We need to freeze the actual subtype immediately. This is
+ -- needed because otherwise this Itype will not get frozen
+ -- at all; it is always safe to freeze on creation because
+ -- any associated types must be frozen at this point.
+
+ -- On the other hand, if we are performing preanalysis on
+ -- a conjured-up copy of a name (see calls to
+ -- Preanalyze_Range in sem_ch5.adb) then we don't want
+ -- to freeze Atyp, now or ever. In this case, the tree
+ -- we eventually pass to the back end should contain no
+ -- references to Atyp (and a freeze node would contain
+ -- such a reference). That's why Expander_Active is tested.
+
+ Freeze_Itype (Atyp, N);
+ end if;
return Atyp;
-- Otherwise we did not build a declaration, so return original