[COMMITTED] ada: Crash on function returning allocated object containing tasks

Message ID 20230526073655.2069914-1-poulhies@adacore.com
State Committed
Commit 3e62561d5ffbb07fa97a4dddfd729fceb7cfce75
Headers
Series [COMMITTED] ada: Crash on function returning allocated object containing tasks |

Commit Message

Marc Poulhiès May 26, 2023, 7:36 a.m. UTC
  From: Javier Miranda <miranda@adacore.com>

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).

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/exp_ch4.adb | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
  

Patch

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