Description
UPDATE
Variance inference is complete.
What is still missing is:
- applying results of variance inference to type parameters -- this is an expressiveness issue
- applying results of variance inference to trait matching (treatment of subtyping in trait matching is unsound #5781) -- this is a soundness issue
ORIGINAL
Today, we treat all type parameters as invariant, but infer variance for region parameters. We can use that same code which infers the variance for region parameters to infer the suitable variance for type parameters if we like.
Alternatively, if we decide that inference here is too magical, we could require explicit declaration of variance. In that case, i'd favor covariance as the default, and the possibility to write struct Foo<mut T>
to indicate an invariant type parameter T
(which can appear in mutable locations). This seems more intuitive than the usual +
and -
. We probably don't need a notation for contravariance, but in that case perhaps fn T
(to indicate a type parameter that appears only in function arguments, far and away the most common place to have a contravariant type parameter).
Still, I think I favor inference. It's inline with what we do for regions and I think it will basically match up with user expectations.