diff options
author | Steve Baird <baird@adacore.com> | 2022-01-14 14:10:25 -0800 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2022-05-10 08:19:21 +0000 |
commit | a445a8692c43d14c494e1edf505ee4f33cb98bb6 (patch) | |
tree | fe3033771bba214d53211df1687fdc2a57388706 | |
parent | 3d9e2004fe4e15b133bd8472c4bf46cbff809583 (diff) | |
download | gcc-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.adb | 26 |
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 |