[Ada] Spurious error on nested instantiation

Programming / Compilers / GCC - pmderodat [138bc75d-0d04-0410-961f-82ee72b054a4] - 13 August 2019 08:07 EDT

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

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.

db3b1a4760b [Ada] Spurious error on nested instantiation
gcc/ada/ChangeLog | 9 ++
gcc/ada/sem_ch4.adb | 53 --------
gcc/ada/sem_ch8.adb | 142 +++++++++++++++++++--
gcc/testsuite/ChangeLog | 7 +
gcc/testsuite/gnat.dg/generic_inst9.adb | 5 +
gcc/testsuite/gnat.dg/generic_inst9.ads | 11 ++
.../gnat.dg/generic_inst9_pkg1-operator.ads | 10 ++
gcc/testsuite/gnat.dg/generic_inst9_pkg1.ads | 12 ++
gcc/testsuite/gnat.dg/generic_inst9_pkg2.adb | 9 ++
gcc/testsuite/gnat.dg/generic_inst9_pkg2.ads | 17 +++
10 files changed, 210 insertions(+), 65 deletions(-)

Upstream: gcc.gnu.org


  • Share