From: Ed Schonberg Date: Tue, 9 Jul 2019 07:53:35 +0000 (+0000) Subject: [Ada] Fix scopes for local variables in task/protected bodies X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=93ba65d54c7d4e5f3dc4612c642a585dc274344e;p=gcc.git [Ada] Fix scopes for local variables in task/protected bodies No impact on compilation with GCC. 2019-07-09 Ed Schonberg 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. From-SVN: r273269 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 1e109c2991d..c5fa67f17a6 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2019-07-09 Ed Schonberg + + * 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. + 2019-07-09 Arnaud Charlet * gnat1drv.adb (Adjust_Global_Switches): Set diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 0d4ec9cebf1..7b7d04470c5 100644 --- a/gcc/ada/sem_util.adb +++ b/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);