From: Ed Schonberg Date: Tue, 17 Jul 2018 08:06:55 +0000 (+0000) Subject: [Ada] Fix Enclosing_Subprogram for protected entries and task entries X-Git-Tag: basepoints/gcc-10~5297 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3567ca3f6be029d5a68722b675df74c2c6945854;p=thirdparty%2Fgcc.git [Ada] Fix Enclosing_Subprogram for protected entries and task entries 2018-07-17 Ed Schonberg gcc/ada/ * sem_util.adb (Enclosing_Subprogram): Protected entries and task entries must be treated separately: task entries are within the enclosing subprogram of the task type, while protected entries are transformed into the corresponding Protected_Body_Subprogram, which is the enclosing_subprogram of any subprogram declared within the entry body. From-SVN: r262778 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 82045196cbc2..4f747f22b759 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,12 @@ +2018-07-17 Ed Schonberg + + * sem_util.adb (Enclosing_Subprogram): Protected entries and task + entries must be treated separately: task entries are within the + enclosing subprogram of the task type, while protected entries are + transformed into the corresponding Protected_Body_Subprogram, which is + the enclosing_subprogram of any subprogram declared within the entry + body. + 2018-07-17 Hristian Kirtchev * doc/gnat_ugn/building_executable_programs_with_gnat.rst: Add missing diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index bc44cd35dccc..31d5c1748d93 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -6906,10 +6906,25 @@ package body Sem_Util is elsif Ekind (Dynamic_Scope) = E_Subprogram_Body then return Corresponding_Spec (Parent (Parent (Dynamic_Scope))); - elsif Ekind_In (Dynamic_Scope, E_Block, E_Return_Statement, E_Entry) - then + elsif Ekind_In (Dynamic_Scope, E_Block, E_Return_Statement) then return Enclosing_Subprogram (Dynamic_Scope); + elsif Ekind (Dynamic_Scope) = E_Entry then + + -- For a task entry, return the enclosing subprogram of the + -- task itself. + + if Ekind (Scope (Dynamic_Scope)) = E_Task_Type then + return Enclosing_Subprogram (Dynamic_Scope); + + -- A protected entry is rewritten as a protected procedure + -- which is the desired enclosing subprogram. This is relevant + -- when unnesting a procedure local to an entry body + + else + return Protected_Body_Subprogram (Dynamic_Scope); + end if; + elsif Ekind (Dynamic_Scope) = E_Task_Type then return Get_Task_Body_Procedure (Dynamic_Scope);