This patch corrects an error in the resolution of selected components when the
prefix is overloaded and none of the interpretations matches the context.

Compiling resolve_func_deref_comp.adb must yield:

resolve_func_deref_comp.adb:14:18:
      no interpretation matches type access to "T" defined at line 12
resolve_func_deref_comp.adb:14:18:
      expected type must be a general access type

--
procedure Resolve_Func_Deref_Comp is
   type T is null record;
   type Acc_T is access T;
   type Rec is record
      T_Comp : Acc_T;
   end record;
   type Acc_Rec is access all Rec;
   function F return Integer is (0);
   function F return Acc_Rec is (null);
begin
   declare
      Some_T : access T;
   begin
      Some_T := F.T_Comp;
   end;
end Resolve_Func_Deref_Comp;

Tested on x86_64-pc-linux-gnu, committed on trunk

2014-06-11  Ed Schonberg  <schonb...@adacore.com>

        * sem_res.adb (Resolve_Selected_Component): Handle properly a
        selected component whose prefix is overloaded, when none of the
        interpretations matches the expected type.

Index: sem_res.adb
===================================================================
--- sem_res.adb (revision 211445)
+++ sem_res.adb (working copy)
@@ -9159,7 +9159,7 @@
                Comp := First_Entity (T);
                while Present (Comp) loop
                   if Chars (Comp) = Chars (S)
-                    and then Covers (Etype (Comp), Typ)
+                    and then Covers (Typ, Etype (Comp))
                   then
                      if not Found then
                         Found := True;
@@ -9213,6 +9213,9 @@
             Get_Next_Interp (I, It);
          end loop Search;
 
+         --  There must be a legal interpreations at this point.
+
+         pragma Assert (Found);
          Resolve (P, It1.Typ);
          Set_Etype (N, Typ);
          Set_Entity_With_Checks (S, Comp1);
@@ -9240,6 +9243,7 @@
       if Is_Access_Type (Etype (P)) then
          T := Designated_Type (Etype (P));
          Check_Fully_Declared_Prefix (T, P);
+
       else
          T := Etype (P);
       end if;

Reply via email to