No impact on compilation with GCC.
Tested on x86_64-pc-linux-gnu, committed on trunk
2019-07-09 Ed Schonberg <schonb...@adacore.com>
gcc/ada/
* sem_util.adb (Scope_Within_Or_Same): Handle properly task
bodies and protected bodies, so that local variables within have
their proper scopes after these constructs have been rewritten
during expansion. This patch resembles but is not identical to
the code in Scope_Within.
--- gcc/ada/sem_util.adb
+++ gcc/ada/sem_util.adb
@@ -24268,13 +24268,32 @@ package body Sem_Util is
(Inner : Entity_Id;
Outer : Entity_Id) return Boolean
is
- Curr : Entity_Id;
-
+ Curr : Entity_Id := Inner;
begin
- Curr := Inner;
+ -- Similar to the above, but check for scope identity first.
+
while Present (Curr) and then Curr /= Standard_Standard loop
if Curr = Outer then
return True;
+
+ elsif Ekind (Curr) = E_Task_Type
+ and then Outer = Task_Body_Procedure (Curr)
+ then
+ return True;
+
+ elsif Is_Subprogram (Curr)
+ and then Outer = Protected_Body_Subprogram (Curr)
+ then
+ return True;
+
+ elsif Is_Private_Type (Curr)
+ and then Present (Full_View (Curr))
+ then
+ if Full_View (Curr) = Outer then
+ return True;
+ else
+ return Scope_Within (Full_View (Curr), Outer);
+ end if;
end if;
Curr := Scope (Curr);