From a445a8692c43d14c494e1edf505ee4f33cb98bb6 Mon Sep 17 00:00:00 2001 From: Steve Baird Date: Fri, 14 Jan 2022 14:10:25 -0800 Subject: [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. --- gcc/ada/sem_util.adb | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'gcc/ada') 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 -- cgit v1.1