aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2019-07-08 08:13:20 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-08 08:13:20 +0000
commit4a0e6ac18f731f41f7ddfa05c370186cd32bef52 (patch)
tree35a93152f966dad625f9964c1d9d8ff0c426597f
parent23eb3cb2b4fb900398461410c6c31294fc77cfc6 (diff)
downloadgcc-4a0e6ac18f731f41f7ddfa05c370186cd32bef52.zip
gcc-4a0e6ac18f731f41f7ddfa05c370186cd32bef52.tar.gz
gcc-4a0e6ac18f731f41f7ddfa05c370186cd32bef52.tar.bz2
[Ada] Crash in interface derivation with null primitive
The frontend crashes processing the derivation of a tagged type whose ultimate ancestor is an interface type I1 that has a null primitive, implements another interface I2 derived from I2, and does not override the null primitive. 2019-07-08 Javier Miranda <miranda@adacore.com> gcc/ada/ * exp_disp.adb (Register_Primitive): When registering a primitive in the secondary dispatch table, handle primitive inherited through several levels of type derivation (required to properly handle inherited 'null' primitive). gcc/testsuite/ * gnat.dg/interface9.adb, gnat.dg/interface9_root-child.ads, gnat.dg/interface9_root.ads: New testcase. From-SVN: r273204
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/exp_disp.adb2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/interface9.adb10
-rw-r--r--gcc/testsuite/gnat.dg/interface9_root-child.ads7
-rw-r--r--gcc/testsuite/gnat.dg/interface9_root.ads10
6 files changed, 40 insertions, 1 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 72cb892..969e933 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,10 @@
+2019-07-08 Javier Miranda <miranda@adacore.com>
+
+ * exp_disp.adb (Register_Primitive): When registering a
+ primitive in the secondary dispatch table, handle primitive
+ inherited through several levels of type derivation (required to
+ properly handle inherited 'null' primitive).
+
2019-07-08 Bob Duff <duff@adacore.com>
* doc/gnat_ugn/gnat_utility_programs.rst: Document handling of
diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb
index 1b21234..a659594 100644
--- a/gcc/ada/exp_disp.adb
+++ b/gcc/ada/exp_disp.adb
@@ -7637,7 +7637,7 @@ package body Exp_Disp is
Unchecked_Convert_To (RTE (RE_Prim_Ptr),
Make_Attribute_Reference (Loc,
Prefix =>
- New_Occurrence_Of (Alias (Prim), Loc),
+ New_Occurrence_Of (Ultimate_Alias (Prim), Loc),
Attribute_Name => Name_Unrestricted_Access))));
end if;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 94ad86f..14d127f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-07-08 Javier Miranda <miranda@adacore.com>
+
+ * gnat.dg/interface9.adb, gnat.dg/interface9_root-child.ads,
+ gnat.dg/interface9_root.ads: New testcase.
+
2019-07-08 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/predicate9.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/interface9.adb b/gcc/testsuite/gnat.dg/interface9.adb
new file mode 100644
index 0000000..ec46e20
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/interface9.adb
@@ -0,0 +1,10 @@
+-- { dg-do compile }
+
+with Interface9_Root.Child;
+procedure Interface9 is
+ package R is new Interface9_Root (Real => Float);
+ package RC is new R.Child;
+
+begin
+ null;
+end Interface9;
diff --git a/gcc/testsuite/gnat.dg/interface9_root-child.ads b/gcc/testsuite/gnat.dg/interface9_root-child.ads
new file mode 100644
index 0000000..0440ddb
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/interface9_root-child.ads
@@ -0,0 +1,7 @@
+generic
+package Interface9_Root.Child is
+ type Base_Type is abstract new Base_Interface with null record;
+
+ type Derived_Type is abstract new Base_Type and Derived_Interface
+ with null record; -- Test
+end Interface9_Root.Child;
diff --git a/gcc/testsuite/gnat.dg/interface9_root.ads b/gcc/testsuite/gnat.dg/interface9_root.ads
new file mode 100644
index 0000000..2e64e5b
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/interface9_root.ads
@@ -0,0 +1,10 @@
+generic
+ type Real is digits <>;
+package Interface9_Root is
+ type Base_Interface is limited interface;
+
+ procedure Primitive1 (B : in out Base_Interface) is abstract;
+ procedure Primitive2 (B : in out Base_Interface) is null;
+
+ type Derived_Interface is limited interface and Base_Interface;
+end Interface9_Root;