From 3e62561d5ffbb07fa97a4dddfd729fceb7cfce75 Mon Sep 17 00:00:00 2001 From: Javier Miranda Date: Sun, 26 Mar 2023 11:45:50 +0000 Subject: [PATCH] ada: Crash on function returning allocated object containing tasks The frontend crashes when a function returns an object of a limited type that may have task components, has discriminants, and the object is created with an allocator. gcc/ada/ * exp_ch4.adb (Expand_N_Allocator): If an allocator with constraints is called in the return statement of a function returning a general access type, then propagate to the itype the master of the general access type (since it is the master associated with the returned object). --- gcc/ada/exp_ch4.adb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index f894da58888..5c9c6686c01 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -4991,6 +4991,25 @@ package body Exp_Ch4 is Expand_N_Full_Type_Declaration (Parent (Base_Type (PtrT))); + -- When the allocator has a subtype indication then a + -- constraint is present and an itype has been added by + -- Analyze_Allocator as the subtype of this allocator. + + -- If an allocator with constraints is called in the + -- return statement of a function returning a general + -- access type, then propagate to the itype the master + -- of the general access type (since it is the master + -- associated with the returned object). + + elsif Is_Itype (PtrT) + and then Ekind (Current_Scope) = E_Function + and then Ekind (Etype (Current_Scope)) + = E_General_Access_Type + and then In_Return_Value (N) + then + Set_Master_Id (PtrT, + Master_Id (Etype (Current_Scope))); + -- The only other possibility is an itype. For this -- case, the master must exist in the context. This is -- the case when the allocator initializes an access -- 2.11.4.GIT