[Ada] Fix scopes for local variables in task/protected bodies
authorEd Schonberg <schonberg@adacore.com>
Tue, 9 Jul 2019 07:53:35 +0000 (07:53 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 9 Jul 2019 07:53:35 +0000 (07:53 +0000)
No impact on compilation with GCC.

2019-07-09  Ed Schonberg  <schonberg@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.

From-SVN: r273269

gcc/ada/ChangeLog
gcc/ada/sem_util.adb

index 1e109c2991dbc18240e0de1e37d293492e1f775e..c5fa67f17a6d1504290bb1e7f7a47d7520886f42 100644 (file)
@@ -1,3 +1,11 @@
+2019-07-09  Ed Schonberg  <schonberg@adacore.com>
+
+       * 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  <charlet@adacore.com>
 
        * gnat1drv.adb (Adjust_Global_Switches): Set
index 0d4ec9cebf1c4ae1daa636a6fc92d64676b261cd..7b7d04470c5905751cbe88f92e265f70d634665c 100644 (file)
@@ -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);