]> git.ipfire.org Git - thirdparty/gcc.git/commit
[Ada] Spurious error on nested instantiation
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 13 Aug 2019 08:07:18 +0000 (08:07 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 13 Aug 2019 08:07:18 +0000 (08:07 +0000)
commit258325dddf752c578f1da15f63577090b1db2de5
treeca59335f2e7442884a652520b533a5e973a44d5c
parent2e8362bc219d6e900756128450c365dd31045a7b
[Ada] Spurious error on nested instantiation

This fixes a spurious error given by the compiler for a call to a
subprogram which is the formal subprogram parameter of a generic
package, if the generic package is instantiated in the body of an
enclosing generic package with two formal types and two formal
subprogram parameter homonyms taking them, and this instantiation takes
one the two formal types as actual, and the enclosing generic package is
instantiated on the same actual type with a single actual subprogram
parameter, and the aforementioned call is overloaded.

In this case, the renaming generated for the actual subprogram parameter
in the nested instantiation is ambiguous and must be disambiguated using
the corresponding formal parameter of the enclosing instantiation,
otherwise a (sub)type mismatch is created and later subprogram
disambiguation is not really possible.

2019-08-13  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* sem_ch4.adb (Analyze_One_Call): Remove bypass for type
mismatch in nested instantiations.
* sem_ch8.adb (Find_Nearer_Entity): New function.
(Find_Renamed_Entity): Use it to disambiguate the candidates for
the renaming generated for an instantiation when it is
ambiguous.

gcc/testsuite/

* gnat.dg/generic_inst9.adb, gnat.dg/generic_inst9.ads,
gnat.dg/generic_inst9_pkg1-operator.ads,
gnat.dg/generic_inst9_pkg1.ads, gnat.dg/generic_inst9_pkg2.adb,
gnat.dg/generic_inst9_pkg2.ads: New testcase.

From-SVN: r274343
gcc/ada/ChangeLog
gcc/ada/sem_ch4.adb
gcc/ada/sem_ch8.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/generic_inst9.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/generic_inst9.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/generic_inst9_pkg1-operator.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/generic_inst9_pkg1.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/generic_inst9_pkg2.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/generic_inst9_pkg2.ads [new file with mode: 0644]