Commit 9880061b by Hristian Kirtchev Committed by Pierre-Marie de Rodat

[Ada] Crash on deallocating component with discriminated task

This patch modifies the generation of task deallocation code to examine
the underlying type for task components.

2019-07-05  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

	* exp_ch7.adb (Cleanup_Record): Use the underlying type when
	checking for components with tasks.

gcc/testsuite/

	* gnat.dg/task3.adb, gnat.dg/task3.ads, gnat.dg/task3_pkg1.ads,
	gnat.dg/task3_pkg2.ads: New testcase.

From-SVN: r273121
parent d90eeca1
2019-07-05 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch7.adb (Cleanup_Record): Use the underlying type when
checking for components with tasks.
2019-07-05 Arnaud Charlet <charlet@adacore.com> 2019-07-05 Arnaud Charlet <charlet@adacore.com>
* libgnarl/s-osinte__linux.ads: Link with -lrt before -lpthread. * libgnarl/s-osinte__linux.ads: Link with -lrt before -lpthread.
......
...@@ -3893,11 +3893,12 @@ package body Exp_Ch7 is ...@@ -3893,11 +3893,12 @@ package body Exp_Ch7 is
Typ : Entity_Id) return List_Id Typ : Entity_Id) return List_Id
is is
Loc : constant Source_Ptr := Sloc (N); Loc : constant Source_Ptr := Sloc (N);
Tsk : Node_Id;
Comp : Entity_Id;
Stmts : constant List_Id := New_List; Stmts : constant List_Id := New_List;
U_Typ : constant Entity_Id := Underlying_Type (Typ); U_Typ : constant Entity_Id := Underlying_Type (Typ);
Comp : Entity_Id;
Tsk : Node_Id;
begin begin
if Has_Discriminants (U_Typ) if Has_Discriminants (U_Typ)
and then Nkind (Parent (U_Typ)) = N_Full_Type_Declaration and then Nkind (Parent (U_Typ)) = N_Full_Type_Declaration
...@@ -3918,7 +3919,7 @@ package body Exp_Ch7 is ...@@ -3918,7 +3919,7 @@ package body Exp_Ch7 is
return New_List (Make_Null_Statement (Loc)); return New_List (Make_Null_Statement (Loc));
end if; end if;
Comp := First_Component (Typ); Comp := First_Component (U_Typ);
while Present (Comp) loop while Present (Comp) loop
if Has_Task (Etype (Comp)) if Has_Task (Etype (Comp))
or else Has_Simple_Protected_Object (Etype (Comp)) or else Has_Simple_Protected_Object (Etype (Comp))
...@@ -3937,8 +3938,8 @@ package body Exp_Ch7 is ...@@ -3937,8 +3938,8 @@ package body Exp_Ch7 is
elsif Is_Record_Type (Etype (Comp)) then elsif Is_Record_Type (Etype (Comp)) then
-- Recurse, by generating the prefix of the argument to -- Recurse, by generating the prefix of the argument to the
-- the eventual cleanup call. -- eventual cleanup call.
Append_List_To (Stmts, Cleanup_Record (N, Tsk, Etype (Comp))); Append_List_To (Stmts, Cleanup_Record (N, Tsk, Etype (Comp)));
......
2019-07-05 Hristian Kirtchev <kirtchev@adacore.com>
* gnat.dg/task3.adb, gnat.dg/task3.ads, gnat.dg/task3_pkg1.ads,
gnat.dg/task3_pkg2.ads: New testcase.
2019-07-05 Javier Miranda <miranda@adacore.com> 2019-07-05 Javier Miranda <miranda@adacore.com>
* gnat.dg/access6.adb: New testcase. * gnat.dg/access6.adb: New testcase.
......
-- { dg-do compile }
with Ada.Unchecked_Deallocation;
package body Task3 is
procedure Destroy (Obj : in out Child_Wrapper) is
procedure Free is new Ada.Unchecked_Deallocation (Child, Child_Ptr);
begin
Free (Obj.Ptr);
end Destroy;
end Task3;
with Task3_Pkg2; use Task3_Pkg2;
package Task3 is
type Child is new Root with null record;
type Child_Ptr is access Child;
type Child_Wrapper is record
Ptr : Child_Ptr := null;
end record;
procedure Destroy (Obj : in out Child_Wrapper);
end Task3;
package Task3_Pkg1 is
type Task_Wrapper (Discr : Integer) is tagged limited private;
private
task type Task_Typ (Discr : Integer) is
end Task_Typ;
type Task_Wrapper (Discr : Integer) is tagged limited record
Tsk : Task_Typ (Discr);
end record;
end Task3_Pkg1;
with Task3_Pkg1; use Task3_Pkg1;
package Task3_Pkg2 is
type Root (Discr : Integer) is tagged limited record
Wrap : Task_Wrapper (Discr);
end record;
end Task3_Pkg2;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment