+2018-01-11 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch3.adb (Add_Internal_Interface_Entities): When checking the
+ legality of an inherited operation that may require overriding, ignore
+ primitive_wrappers that correspond to explicit operations that override
+ an interface primitive.
+ * exp_util.adb (Build_Class_Wide_Expression, Replace_Entity): If the
+ operation to which the class-wide expression applies is a protected op.
+ with a primitive_wrapper, verify that the updated inherited expression
+ does not contain an internal call to a protected function. This
+ completes the implementation of AI12-0166.
+
2018-01-11 Hristian Kirtchev <kirtchev@adacore.com>
* ali.adb: Document the remaining letters available for ALI lines.
if Present (New_E) then
Rewrite (N, New_Occurrence_Of (New_E, Sloc (N)));
+ -- Implement rule in AI12-0166: a precondition for a
+ -- protected operation cannot include an internal call to
+ -- a protected function of the type. In the case of an
+ -- inherited condition for an overriding operation, both the
+ -- operation and the function are given by primitive wrappers.
+
+ if Ekind (New_E) = E_Function
+ and then Is_Primitive_Wrapper (New_E)
+ and then Is_Primitive_Wrapper (Subp)
+ and then Scope (Subp) = Scope (New_E)
+ then
+ Error_Msg_Node_2 := Wrapped_Entity (Subp);
+ Error_Msg_NE
+ ("internal call to& cannot appear in inherited "
+ & "precondition of protected operation&",
+ N, Wrapped_Entity (New_E));
+ end if;
+
-- If the entity is an overridden primitive and we are not
-- in GNATprove mode, we must build a wrapper for the current
-- inherited operation. If the reference is the prefix of an
-- nonconforming preconditions in both an ancestor and
-- a progenitor operation.
+ -- If the operation is a primitive wrapper it is an explicit
+ -- (overriding) operqtion and all is fine.
+
if Present (Anc)
and then Has_Non_Trivial_Precondition (Anc)
and then Has_Non_Trivial_Precondition (Iface_Prim)
and then Nkind (Parent (Prim)) =
N_Procedure_Specification
and then Null_Present (Parent (Prim)))
+ or else Is_Primitive_Wrapper (Prim)
then
null;
- -- The inherited operation must be overridden
+ -- The operation is inherited and must be overridden.
elsif not Comes_From_Source (Prim) then
Error_Msg_NE