summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2022-10-15 16:29:38 +0000
committerMarc Poulhiès <poulhies@adacore.com>2022-11-08 09:34:57 +0100
commitb9d8ad7175359f7a6dfd803fcc3b3f619301e734 (patch)
treee6786afc2351eb1994c6e569d32305fffed1067a
parent59dd07ef2534c00f0144431bf54d8219ebb91218 (diff)
ada: Missing master of task causing assertion failure
gcc/ada/ * exp_ch9.adb (Build_Master_Entity): Handle missing case: when the context of the master is a BIP function whose result type has tasks.
-rw-r--r--gcc/ada/exp_ch9.adb37
1 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
index decf61782af..70ede15901e 100644
--- a/gcc/ada/exp_ch9.adb
+++ b/gcc/ada/exp_ch9.adb
@@ -3207,10 +3207,45 @@ package body Exp_Ch9 is
Find_Enclosing_Context (Par, Context, Context_Id, Decls);
end if;
+ -- When the enclosing context is a BIP function whose result type has
+ -- tasks, the function has an extra formal that is the master of the
+ -- tasks to be created by its returned object (that is, when its
+ -- enclosing context is a return statement). However, if the body of
+ -- the function creates tasks before its return statements, such tasks
+ -- need their own master.
+
+ if Has_Master_Entity (Context_Id)
+ and then Ekind (Context_Id) = E_Function
+ and then Is_Build_In_Place_Function (Context_Id)
+ and then Needs_BIP_Task_Actuals (Context_Id)
+ then
+ -- No need to add it again if previously added
+
+ declare
+ Master_Present : Boolean;
+
+ begin
+ -- Handle transient scopes
+
+ if Context_Id /= Current_Scope then
+ Push_Scope (Context_Id);
+ Master_Present :=
+ Present (Current_Entity_In_Scope (Name_uMaster));
+ Pop_Scope;
+ else
+ Master_Present :=
+ Present (Current_Entity_In_Scope (Name_uMaster));
+ end if;
+
+ if Master_Present then
+ return;
+ end if;
+ end;
+
-- Nothing to do if the context already has a master; internally built
-- finalizers don't need a master.
- if Has_Master_Entity (Context_Id)
+ elsif Has_Master_Entity (Context_Id)
or else Is_Finalizer (Context_Id)
then
return;