public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-3777] ada: Missing master of task causing assertion failure
@ 2022-11-08 8:40 Marc Poulhi?s
0 siblings, 0 replies; only message in thread
From: Marc Poulhi?s @ 2022-11-08 8:40 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:b9d8ad7175359f7a6dfd803fcc3b3f619301e734
commit r13-3777-gb9d8ad7175359f7a6dfd803fcc3b3f619301e734
Author: Javier Miranda <miranda@adacore.com>
Date: Sat Oct 15 16:29:38 2022 +0000
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.
Diff:
---
gcc/ada/exp_ch9.adb | 37 ++++++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
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;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-11-08 8:40 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-08 8:40 [gcc r13-3777] ada: Missing master of task causing assertion failure Marc Poulhi?s
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).