+2019-08-20 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_disp.adb (Build_Class_Wide_Check, Replace_Formals): When a
+ dispatching call tp a subprogram with a class-wide precondition
+ occurrs in the same declarative part as the ancestor subprogram
+ being called, the`expression for the precondition has not been
+ analyzed yet. Such a call may appear, e.g. in an expression
+ function. In that case, the replacement of formals by actuals in
+ the call cannot use the formal entities of the subprogram being
+ called, and the occurrence of the formals in the expression must
+ be located by name (Chars fields) as would be done at a later
+ freeze point, when the expression is resolved in the context of
+ the subprogram itself.
+
2019-08-20 Bob Duff <duff@adacore.com>
* sem_prag.adb (Persistent_BSS): If an initialization is present
-- corresponding actuals in the call, given that this check is
-- performed outside of the body of the subprogram.
+ -- If the dispatching call appears in the same scope as the
+ -- declaration of the dispatching subprogram (for example in
+ -- the expression of a local expression function) the prec.
+ -- has not been analyzed yet, in which case we use the Chars
+ -- field to recognize intended occurrences of the formals.
+
---------------------
-- Replace_Formals --
---------------------
function Replace_Formals (N : Node_Id) return Traverse_Result is
+ A : Node_Id;
+ F : Entity_Id;
begin
- if Is_Entity_Name (N)
- and then Present (Entity (N))
- and then Is_Formal (Entity (N))
- then
- declare
- A : Node_Id;
- F : Entity_Id;
+ if Is_Entity_Name (N) then
+ F := First_Formal (Subp);
+ A := First_Actual (Call_Node);
- begin
- F := First_Formal (Subp);
- A := First_Actual (Call_Node);
+ if Present (Entity (N))
+ and then Is_Formal (Entity (N))
+ then
while Present (F) loop
if F = Entity (N) then
Rewrite (N, New_Copy_Tree (A));
Next_Formal (F);
Next_Actual (A);
end loop;
- end;
+
+ -- If node is not analyzed, recognize occurrences of
+ -- a formal by name, as would be done when resolving
+ -- the aspect expression in the context of the subprogram.
+
+ elsif not Analyzed (N)
+ and then Nkind (N) = N_Identifier
+ and then No (Entity (N))
+ then
+ while Present (F) loop
+ if Chars (N) = Chars (F) then
+ Rewrite (N, New_Copy_Tree (A));
+ return Skip;
+ end if;
+
+ Next_Formal (F);
+ Next_Actual (A);
+ end loop;
+ end if;
end if;
return OK;
+2019-08-20 Ed Schonberg <schonberg@adacore.com>
+
+ * gnat.dg/tagged5.adb, gnat.dg/tagged5.ads: New testcase.
+
2019-08-20 Gary Dismukes <dismukes@adacore.com>
* gnat.dg/type_conv2.adb, gnat.dg/type_conv2.ads: New testcase.