diff options
author | Justin Squirek <squirek@adacore.com> | 2022-09-06 14:35:53 +0000 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2022-09-12 10:16:53 +0200 |
commit | 60bb81e0db60f1a0f6be8ece24a05052aba21b20 (patch) | |
tree | aa74670f941b3553b5fc7b1ced86c0856cf2d4e1 | |
parent | bd548d67e7141c29d4a7b81ca893402bc2ef100a (diff) | |
download | gcc-60bb81e0db60f1a0f6be8ece24a05052aba21b20.zip gcc-60bb81e0db60f1a0f6be8ece24a05052aba21b20.tar.gz gcc-60bb81e0db60f1a0f6be8ece24a05052aba21b20.tar.bz2 |
[Ada] Storage_Error raised analyzing type with call in its range constraint
This patch corrects a problem in the compiler whereby the determination of
scope levels during the generation of accessibility checks for function calls
within range constraints leads to a compiler crash due to the type not being
fully analyzed at the point in which its scope depth must be obtained.
gcc/ada/
* sem_util.adb
(Innermost_Master_Scope_Depth): Detect and handle case where scope
depth is not set on an enclosing scope.
-rw-r--r-- | gcc/ada/sem_util.adb | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 8c64ac3..b0babeb 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -316,8 +316,20 @@ package body Sem_Util is -- Ignore transient scopes made during expansion if Comes_From_Source (Node_Par) then - return - Scope_Depth (Encl_Scop) + Master_Lvl_Modifier; + -- Note that in some rare cases the scope depth may not be + -- set, for example, when we are in the middle of analyzing + -- a type and the enclosing scope is said type. So, instead, + -- continue to move up the parent chain since the scope + -- depth of the type's parent is the same as that of the + -- type. + + if not Scope_Depth_Set (Encl_Scop) then + pragma Assert (Nkind (Parent (Encl_Scop)) + = N_Full_Type_Declaration); + else + return + Scope_Depth (Encl_Scop) + Master_Lvl_Modifier; + end if; end if; -- For a return statement within a function, return |