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;