aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Squirek <squirek@adacore.com>2022-09-06 14:35:53 +0000
committerMarc Poulhiès <poulhies@adacore.com>2022-09-12 10:16:53 +0200
commit60bb81e0db60f1a0f6be8ece24a05052aba21b20 (patch)
treeaa74670f941b3553b5fc7b1ced86c0856cf2d4e1
parentbd548d67e7141c29d4a7b81ca893402bc2ef100a (diff)
downloadgcc-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.adb16
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