diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2023-01-30 00:05:42 +0100 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-05-16 10:30:58 +0200 |
commit | 5fa02009e49c5f6d8a187db4cb87405b3ef43b88 (patch) | |
tree | 943a2249b8784b0c13b50a64a622c61c6df76aaa | |
parent | ae334957c7dbbf3db6b612cd6f5fe058877abac4 (diff) | |
download | gcc-5fa02009e49c5f6d8a187db4cb87405b3ef43b88.tar.gz |
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.
-rw-r--r-- | gcc/ada/freeze.adb | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 86622003b97..f54ae0503a1 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; |