From: Eric Botcazou Date: Sun, 29 Jan 2023 23:05:42 +0000 (+0100) Subject: ada: Fix crash on iterated component in expression function X-Git-Tag: basepoints/gcc-15~9238 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5fa02009e49c5f6d8a187db4cb87405b3ef43b88;p=thirdparty%2Fgcc.git ada: Fix crash on iterated component in expression function The problem is that the freeze node generated for the type of a static subexpression present in the expression function is incorrectly placed inside instead of outside the function. gcc/ada/ * freeze.adb (Freeze_Expression): When the freezing is to be done outside the current scope, skip any scope that is an internal loop. --- diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 86622003b97a..f54ae0503a19 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -8712,17 +8712,19 @@ package body Freeze is -- The current scope may be that of a constrained component of -- an enclosing record declaration, or of a loop of an enclosing - -- quantified expression, which is above the current scope in the - -- scope stack. Indeed in the context of a quantified expression, - -- a scope is created and pushed above the current scope in order - -- to emulate the loop-like behavior of the quantified expression. + -- quantified expression or aggregate with an iterated component + -- in Ada 2022, which is above the current scope in the scope + -- stack. Indeed in the context of a quantified expression or + -- an aggregate with an iterated component, an internal scope is + -- created and pushed above the current scope in order to emulate + -- the loop-like behavior of the construct. -- If the expression is within a top-level pragma, as for a pre- -- condition on a library-level subprogram, nothing to do. if not Is_Compilation_Unit (Current_Scope) and then (Is_Record_Type (Scope (Current_Scope)) - or else Nkind (Parent (Current_Scope)) = - N_Quantified_Expression) + or else (Ekind (Current_Scope) = E_Loop + and then Is_Internal (Current_Scope))) then Pos := Pos - 1; end if;