When resolving a prefixed call with class-wide actuals, we iterate over the class-wide operations of all ancestors of the controlling type. If the context is a function call any overloading is resolved by context. if the context is a procedure call there must be only one candidate interpretation, and functions must be excluded from the list of candidates.
The following must compile quietly: --- with P; procedure Test is A : P.T; begin if A.X then A.X; end if; end Test; --- package P is type T is tagged null record; function X (Self : T'Class) return Boolean; procedure X (Self : T'Class); end P; Tested on x86_64-pc-linux-gnu, committed on trunk 2011-08-04 Ed Schonberg <schonb...@adacore.com> * sem_ch4.adb (Try_Class_Wide_Operation): if the context is a procedure call, ignore functions.
Index: sem_ch4.adb =================================================================== --- sem_ch4.adb (revision 177353) +++ sem_ch4.adb (working copy) @@ -6866,6 +6866,16 @@ (Designated_Type (Etype (First_Formal (Hom)))) = Cls_Type)) then + -- If the context is a procedure call, ignore functions + -- in the name of the call. + + if Ekind (Hom) = E_Function + and then Nkind (Parent (N)) = N_Procedure_Call_Statement + and then N = Name (Parent (N)) + then + goto Next_Hom; + end if; + Set_Etype (Call_Node, Any_Type); Set_Is_Overloaded (Call_Node, False); Success := False; @@ -6907,7 +6917,8 @@ end if; end if; - Hom := Homonym (Hom); + <<Next_Hom>> + Hom := Homonym (Hom); end loop; end Traverse_Homonyms;