diff options
author | Javier Miranda <miranda@adacore.com> | 2019-07-08 08:13:20 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-08 08:13:20 +0000 |
commit | 4a0e6ac18f731f41f7ddfa05c370186cd32bef52 (patch) | |
tree | 35a93152f966dad625f9964c1d9d8ff0c426597f /gcc | |
parent | 23eb3cb2b4fb900398461410c6c31294fc77cfc6 (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/ada/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ada/exp_disp.adb | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/interface9.adb | 10 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/interface9_root-child.ads | 7 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/interface9_root.ads | 10 |
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; |