From: Steve Baird Date: Fri, 14 Jan 2022 22:10:25 +0000 (-0800) Subject: [Ada] Failure compiling "for ... of" loop over a slice X-Git-Tag: basepoints/gcc-14~6981 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a445a8692c43d14c494e1edf505ee4f33cb98bb6;p=thirdparty%2Fgcc.git [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. --- diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index d76b5d93511..c58b63db924 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