Error_Msg_N
("expect anonymous access type in object renaming", N);
end if;
+
else
declare
- I : Interp_Index;
- It : Interp;
- Typ : Entity_Id := Empty;
+ I : Interp_Index;
+ It : Interp;
+ Typ : Entity_Id := Empty;
+ Seen : Boolean := False;
begin
Get_First_Interp (Nam, I, It);
while Present (It.Typ) loop
- if No (Typ) then
- if Ekind (It.Typ) = Ekind (T)
- and then Covers (T, It.Typ)
+
+ -- Renaming is ambiguous if more than one candidate
+ -- interpretation is type-conformant with the context.
+
+ if Ekind (It.Typ) = Ekind (T) then
+ if Ekind (T) = E_Anonymous_Access_Subprogram_Type
+ and then Type_Conformant
+ (Designated_Type (T), Designated_Type (It.Typ))
+ then
+ if not Seen then
+ Seen := True;
+ else
+ Error_Msg_N
+ ("ambiguous expression in renaming", Nam);
+ end if;
+
+ elsif Ekind (T) = E_Anonymous_Access_Type
+ and then Covers
+ (Designated_Type (T), Designated_Type (It.Typ))
then
+ if not Seen then
+ Seen := True;
+ else
+ Error_Msg_N
+ ("ambiguous expression in renaming", Nam);
+ end if;
+ end if;
+
+ if Covers (T, It.Typ) then
Typ := It.Typ;
Set_Etype (Nam, Typ);
Set_Is_Overloaded (Nam, False);
end if;
- else
- Error_Msg_N ("ambiguous expression in renaming", N);
end if;
Get_Next_Interp (I, It);
elsif Nkind (N) = N_Range then
return It1;
+ -- Implement AI05-105: A renaming declaration with an access
+ -- definition must resolve to an anonymous access type. This
+ -- is a resolution rule and can be used to disambiguate.
+
+ elsif Nkind (Parent (N)) = N_Object_Renaming_Declaration
+ and then Present (Access_Definition (Parent (N)))
+ then
+ if Ekind (It1.Typ) = E_Anonymous_Access_Type
+ or else Ekind (It1.Typ) = E_Anonymous_Access_Subprogram_Type
+ then
+ if Ekind (It2.Typ) = Ekind (It1.Typ) then
+
+ -- True ambiguity
+
+ return No_Interp;
+ else
+ return It1;
+ end if;
+
+ elsif Ekind (It2.Typ) = E_Anonymous_Access_Type
+ or else Ekind (It2.Typ) = E_Anonymous_Access_Subprogram_Type
+ then
+ return It2;
+
+ else
+
+ -- No legal interpretation.
+
+ return No_Interp;
+ end if;
+
-- If two user defined-subprograms are visible, it is a true ambiguity,
-- unless one of them is an entry and the context is a conditional or
-- timed entry call, or unless we are within an instance and this is