+2018-07-17 Ed Schonberg <schonberg@adacore.com>
+
+ * 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 <kirtchev@adacore.com>
* doc/gnat_ugn/building_executable_programs_with_gnat.rst: Add missing
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);