A construct of the form Obj.F (X => Expr) is parsed as a function call because of the parameter association, before the prefix is analyzed and the construct possibly rewritten as a call to F with controlling argument Obj. In a generic context, if such a call appears in a precondition, and given the delay in its elaboration, it may be copied before analysis. In that case, there is no entity attached to the prefix.
The following must compile and execute quietly: gnatmake -q -gnat12a main main --- with Gen2; procedure Main is type Things is (This, That); package IP is new Gen2 (A => Things); begin null; end main; --- with Gen1; generic type A is(<>); package Gen2 is package P is new Gen1 (A => A); end Gen2; --- generic type A is(<>); package Gen1 is type T is abstract tagged private; function F(X:in out T'class; Y: Integer) return boolean; procedure Proc(X:in out T'class; Y:Integer) with pre=>X.F(Y=>1); private type T is abstract tagged record Z:A; end record; end Gen1; --- package body Gen1 is function F(X:in out T'class; Y: Integer) return boolean is begin return True; end; procedure Proc(X:in out T'class; Y:Integer) is begin null; end; end Gen1; Tested on x86_64-pc-linux-gnu, committed on trunk 2013-07-05 Ed Schonberg <schonb...@adacore.com> * sem_ch12.adb (Copy_Generic_Node): Check that name in function call is a valid entity name before preserving entity in generic copy.
Index: sem_ch12.adb =================================================================== --- sem_ch12.adb (revision 200688) +++ sem_ch12.adb (working copy) @@ -6577,7 +6577,13 @@ Set_Entity (New_N, Entity (Assoc)); Check_Private_View (N); - elsif Nkind (Assoc) = N_Function_Call then + -- The name in the call may be a selected component if the + -- call has not been analyzed yet, as may be the case for + -- pre/post conditions in a generic unit. + + elsif Nkind (Assoc) = N_Function_Call + and then Is_Entity_Name (Name (Assoc)) + then Set_Entity (New_N, Entity (Name (Assoc))); elsif Nkind_In (Assoc, N_Defining_Identifier,