Catcall Test Proposal
This article describes an implementation made by Eiffel Software in October 2007 for a solution of the CATCALL issue. It is a variation on an already discussed solution.
A Type declaration can be preceded by the keyword
frozen, that is to say:
a: frozen A
An actual generic parameter can be preceded by the keyword
variant, that is to say:
a: LIST [variant A]
New conformance rules
When the actual generic parameters are preceded by
variant then the existing conformance rules apply, otherwise it has to be the same type.
New validity rules
- The target of a call involving a covariantly redefined routine should either be marked
frozenor else the call has to be valid for all descendant types of the target type.
- If one of the formal arguments of a call involves a formal generic parameter, the corresponding actual should not be marked
The tricky part in the above is the check for the validity of a covariant call for all the descendant types of the target. The issue is when a descendant type is generic and the new formal generic parameter has no corresponding type in the ancestor. For example:
class A f (a: ANY) do end end class B [G] inherit A redefine f end feature f (a: STRING) do end end class TEST feature make is local a: A do a.f ("My String") end end end
In our case, we assume the descendant type to be instantiated with its constraint, in the above case
B [ANY]. This only works with a single constraint; in the case of multiple constraints, our compiler will simply report a potential catcall due to a compiler limitation.