[Ada] Wrong equality on untagged private type
authorJavier Miranda <miranda@adacore.com>
Tue, 29 May 2018 09:42:34 +0000 (09:42 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 29 May 2018 09:42:34 +0000 (09:42 +0000)
commit656412552b7c8d29090dfec239f51aa33f760c77
tree54a8540e8eba293025f539857abb35e53efb4271
parent999acab61b42c6641f7be13aa6a6452587106d43
[Ada] Wrong equality on untagged private type

When a private type declaration T1 is completed with a derivation of an
untagged private type that overrides the predefined equality primitive, and the
full view of T2 is a derivation of another private type T2 whose full view is a
tagged type, the compiler may generate code that references the wrong equality
primitive when processing comparisons of objects of type T1.

2018-05-29  Javier Miranda  <miranda@adacore.com>

gcc/ada/

* exp_ch4.adb (Expand_N_Op_Eq, Expand_Composite_Equality): Use the new
subprogram Inherits_From_Tagged_Full_View to identify more reliably
untagged private types completed with a derivation of an untagged
private whose full view is a tagged type.
* sem_util.ads, sem_util.adb (Inherits_From_Tagged_Full_View): New
subprogram.
(Collect_Primitive_Operations): Handle untagged private types completed
with a derivation of an untagged private type whose full view is a
tagged type. In such case, collecting the list of primitives we may
find two equality primitives: one associated with the untagged private
and another associated with the ultimate tagged type (and we must
remove from the returned list this latter one).

gcc/testsuite/

* gnat.dg/equal2.adb: New testcase.

From-SVN: r260886
gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb
gcc/ada/sem_util.adb
gcc/ada/sem_util.ads
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/equal2.adb [new file with mode: 0644]