[Ada] Crash on deallocating component with discriminated task
authorHristian Kirtchev <kirtchev@adacore.com>
Fri, 5 Jul 2019 07:03:15 +0000 (07:03 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 5 Jul 2019 07:03:15 +0000 (07:03 +0000)
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

gcc/ada/ChangeLog
gcc/ada/exp_ch7.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/task3.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/task3.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/task3_pkg1.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/task3_pkg2.ads [new file with mode: 0644]

index fed5a15..6da90f2 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        * libgnarl/s-osinte__linux.ads: Link with -lrt before -lpthread.
index 1e17b19..4526af6 100644 (file)
@@ -3893,11 +3893,12 @@ package body Exp_Ch7 is
       Typ  : Entity_Id) return List_Id
    is
       Loc   : constant Source_Ptr := Sloc (N);
-      Tsk   : Node_Id;
-      Comp  : Entity_Id;
       Stmts : constant List_Id    := New_List;
       U_Typ : constant Entity_Id  := Underlying_Type (Typ);
 
+      Comp : Entity_Id;
+      Tsk  : Node_Id;
+
    begin
       if Has_Discriminants (U_Typ)
         and then Nkind (Parent (U_Typ)) = N_Full_Type_Declaration
@@ -3918,7 +3919,7 @@ package body Exp_Ch7 is
          return New_List (Make_Null_Statement (Loc));
       end if;
 
-      Comp := First_Component (Typ);
+      Comp := First_Component (U_Typ);
       while Present (Comp) loop
          if Has_Task (Etype (Comp))
            or else Has_Simple_Protected_Object (Etype (Comp))
@@ -3937,8 +3938,8 @@ package body Exp_Ch7 is
 
             elsif Is_Record_Type (Etype (Comp)) then
 
-               --  Recurse, by generating the prefix of the argument to
-               --  the eventual cleanup call.
+               --  Recurse, by generating the prefix of the argument to the
+               --  eventual cleanup call.
 
                Append_List_To (Stmts, Cleanup_Record (N, Tsk, Etype (Comp)));
 
index 08d8695..cdf0b40 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        * gnat.dg/access6.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/task3.adb b/gcc/testsuite/gnat.dg/task3.adb
new file mode 100644 (file)
index 0000000..a73c2dc
--- /dev/null
@@ -0,0 +1,11 @@
+--  { 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;
diff --git a/gcc/testsuite/gnat.dg/task3.ads b/gcc/testsuite/gnat.dg/task3.ads
new file mode 100644 (file)
index 0000000..324d894
--- /dev/null
@@ -0,0 +1,12 @@
+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;
diff --git a/gcc/testsuite/gnat.dg/task3_pkg1.ads b/gcc/testsuite/gnat.dg/task3_pkg1.ads
new file mode 100644 (file)
index 0000000..cc41be0
--- /dev/null
@@ -0,0 +1,11 @@
+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;
diff --git a/gcc/testsuite/gnat.dg/task3_pkg2.ads b/gcc/testsuite/gnat.dg/task3_pkg2.ads
new file mode 100644 (file)
index 0000000..aee5c73
--- /dev/null
@@ -0,0 +1,7 @@
+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;