Note [Promotion in signatures]
If an unsolved metavariable in a signature is not generalized (because we're not generalizing the construct -- e.g., pattern sig -- or because the metavars are constrained -- see kindGeneralizeSome) we need to promote to maintain (WantedInv) of Note [TcLevel invariants] in GHC.Tc.Utils.TcType. Note that promotion is identical in effect to generalizing and the reinstantiating with a fresh metavariable at the current level. So in some sense, we generalize *all* variables, but then re-instantiate some of them. Here is an example of why we must promote: foo (x :: forall a. a -> Proxy b) = ... In the pattern signature, `b` is unbound, and will thus be brought into scope. We do not know its kind: it will be assigned kappa[2]. Note that kappa is at TcLevel 2, because it is invented under a forall. (A priori, the kind kappa might depend on `a`, so kappa rightly has a higher TcLevel than the surrounding context.) This kappa cannot be solved for while checking the pattern signature (which is not kind-generalized). When we are checking the *body* of foo, though, we need to unify the type of x with the argument type of bar. At this point, the ambient TcLevel is 1, and spotting a metavariable with level 2 would violate the (WantedInv) invariant of Note [TcLevel invariants]. So, instead of kind-generalizing, we promote the metavariable to level 1. This is all done in kindGeneralizeNone.
References 1
- TcLevel invariants GHC.Tc.Utils.TcType
Referenced by 2
- Kind generalisation GHC.Tc.Gen.HsType
- GHC.Tc.Gen.HsType call site