When a task type has a partial view, the procedure created for a
selective accept statement within the task was not being passed an
activation record actual (despite having such a formal), and also
certain variables addressed up-level were not being stored within the
activation record.  This was because the utility functions that check
that one scope is contained within another were not accounting for the
possibility of private types implemented by task types. This is fixed by
looking at the underlying base type within those utility functions.

Tested on x86_64-pc-linux-gnu, committed on trunk

2019-12-13  Gary Dismukes  <dismu...@adacore.com>

gcc/ada/

        * sem_util.adb (Scope_Within): For the case of checking for a
        task type procedure, check the Implementation_Base_Type of Curr.
        (Scope_Within_Or_Same): For the case of checking for a task type
        procedure, check the Implementation_Base_Type of Curr.
--- gcc/ada/sem_util.adb
+++ gcc/ada/sem_util.adb
@@ -24721,8 +24721,9 @@ package body Sem_Util is
          --  A selective accept body appears within a task type, but the
          --  enclosing subprogram is the procedure of the task body.
 
-         elsif Ekind (Curr) = E_Task_Type
-           and then Outer = Task_Body_Procedure (Curr)
+         elsif Ekind (Implementation_Base_Type (Curr)) = E_Task_Type
+           and then
+             Outer = Task_Body_Procedure (Implementation_Base_Type (Curr))
          then
             return True;
 
@@ -24763,8 +24764,9 @@ package body Sem_Util is
          if Curr = Outer then
             return True;
 
-         elsif Ekind (Curr) = E_Task_Type
-           and then Outer = Task_Body_Procedure (Curr)
+         elsif Ekind (Implementation_Base_Type (Curr)) = E_Task_Type
+           and then
+             Outer = Task_Body_Procedure (Implementation_Base_Type (Curr))
          then
             return True;
 

Reply via email to