aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHristian Kirtchev <kirtchev@adacore.com>2019-07-05 07:03:15 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-05 07:03:15 +0000
commit9880061b346330e7c986016bdec75f38659f8793 (patch)
treeb1d51f2c7107ba6b077bb2d6db13ef83c56c8568
parentd90eeca129a12d2236f8625d8ea5c93826bb526f (diff)
downloadgcc-9880061b346330e7c986016bdec75f38659f8793.zip
gcc-9880061b346330e7c986016bdec75f38659f8793.tar.gz
gcc-9880061b346330e7c986016bdec75f38659f8793.tar.bz2
[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
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/exp_ch7.adb11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/task3.adb11
-rw-r--r--gcc/testsuite/gnat.dg/task3.ads12
-rw-r--r--gcc/testsuite/gnat.dg/task3_pkg1.ads11
-rw-r--r--gcc/testsuite/gnat.dg/task3_pkg2.ads7
7 files changed, 57 insertions, 5 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index fed5a15..6da90f2 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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.
diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb
index 1e17b19..4526af6 100644
--- a/gcc/ada/exp_ch7.adb
+++ b/gcc/ada/exp_ch7.adb
@@ -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)));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 08d8695..cdf0b40 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..a73c2dc
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/task3.adb
@@ -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
index 0000000..324d894
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/task3.ads
@@ -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
index 0000000..cc41be0
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/task3_pkg1.ads
@@ -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
index 0000000..aee5c73
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/task3_pkg2.ads
@@ -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;