[Ada] Fix resolution of class-wide operations that are generic actuals
authorEd Schonberg <schonberg@adacore.com>
Tue, 31 Jul 2018 09:55:21 +0000 (09:55 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 31 Jul 2018 09:55:21 +0000 (09:55 +0000)
2018-07-31  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch4.adb (Traverse_Homonyms): Consider generic actuals that
may rename a matching class-wide operation only if the renaming
declaration for that actual is in an enclosing scope (i.e.
within the corrresponding instance).

From-SVN: r263090

gcc/ada/ChangeLog
gcc/ada/sem_ch4.adb

index 00432f6b1104e232bbf673483140cfad2447251c..ef1128ff2a73ddb4371073e89b4bbc686a75f192 100644 (file)
@@ -1,3 +1,10 @@
+2018-07-31  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch4.adb (Traverse_Homonyms): Consider generic actuals that
+       may rename a matching class-wide operation only if the renaming
+       declaration for that actual is in an enclosing scope (i.e.
+       within the corrresponding instance).
+
 2018-07-31  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * checks.adb, contracts.adb, exp_aggr.adb, exp_ch5.adb,
index 89af5676348c54b256bee57fec429d3d95765b89..5176175d434ee0ba4b80bf0d3f38c0845b739537 100644 (file)
@@ -8977,12 +8977,16 @@ package body Sem_Ch4 is
             --  to same. If in an instance, the operation can be considered
             --  even if hidden (it may be hidden because the instantiation
             --  is expanded after the containing package has been analyzed).
+            --  If the subprogram is a generic actual in an enclosing instance,
+            --  it appears as a renaming that is a candidate interpretation as
+            --  well.
 
             Hom := Current_Entity (Subprog);
             while Present (Hom) loop
                if Ekind_In (Hom, E_Procedure, E_Function)
                  and then Present (Renamed_Entity (Hom))
                  and then Is_Generic_Actual_Subprogram (Hom)
+                 and then In_Open_Scopes (Scope (Hom))
                then
                   Candidate := Renamed_Entity (Hom);
                else