aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
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 /gcc/ada
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
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/exp_disp.adb2
2 files changed, 8 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;