Note [Cloning for type variable binders]
Sometimes we must clone the Name of a type variable binder (written in
the source program); and sometimes we must not. This is controlled by
the sm_clone field of SkolemMode.
In some cases it doesn't matter whether or not we clone. Perhaps
it'd be better to use MustClone/MayClone/MustNotClone.
When we /must not/ clone
* In the binders of a type signature (tcOuterTKBndrs)
f :: forall a{27}. blah
f = rhs
Then 'a' scopes over 'rhs'. When we kind-check the signature (tcHsSigType),
we must get the type (forall a{27}. blah) for the Id f, because
we bring that type variable into scope when we typecheck 'rhs'.
* In the binders of a data family instance (bindOuterFamEqnTKBndrs)
data instance
forall p q. D (p,q) = D1 p | D2 q
We kind-check the LHS in tcDataFamInstHeader, and then separately
(in tcDataFamInstDecl) bring p,q into scope before looking at the
the constructor decls.
* bindExplicitTKBndrs_Q_Tv/bindImplicitTKBndrs_Q_Tv do not clone
We take advantage of this in kcInferDeclHeader:
all_tv_prs = mkTyVarNamePairs (scoped_kvs ++ tc_tvs)
If we cloned, we'd need to take a bit more care here; not hard.
* bindExplicitTKBndrs_Q_Skol, bindExplicitTKBndrs_Skol, do not clone.
There is no need, I think.
The payoff here is that avoiding gratuitous cloning means that we can
almost always take the fast path in swizzleTcTyConBndrs.
When we /must/ clone.
* bindOuterSigTKBndrs_Tv, bindExplicitTKBndrs_Tv do cloning
This for a narrow and tricky reason which, alas, I couldn't find a
simpler way round. #16221 is the poster child:
data SameKind :: k -> k -> *
data T a = forall k2 (b :: k2). MkT (SameKind a b) !Int
When kind-checking T, we give (a :: kappa1). Then:
- In kcConDecl we make a TyVarTv unification variable kappa2 for k2
(as described in Note [Using TyVarTvs for kind-checking GADTs],
even though this example is an existential)
- So we get (b :: kappa2) via bindExplicitTKBndrs_Tv
- We end up unifying kappa1 := kappa2, because of the (SameKind a b)
Now we generalise over kappa2. But if kappa2's Name is precisely k2
(i.e. we did not clone) we'll end up giving T the utterly final kind
T :: forall k2. k2 -> *
Nothing directly wrong with that but when we typecheck the data constructor
we have k2 in scope; but then it's brought into scope /again/ when we find
the forall k2. This is chaotic, and we end up giving it the type
MkT :: forall k2 (a :: k2) k2 (b :: k2).
SameKind @k2 a b -> Int -> T @{k2} a
which is bogus -- because of the shadowing of k2, we can't
apply T to the kind or a!
And there no reason /not/ to clone the Name when making a unification
variable. So that's what we do. References 1
- Using TyVarTvs for kind-checking GADTs GHC.Tc.TyCl
Referenced by 12
- GHC.Tc.Gen.HsType call site ×10
- Checking partial type signatures GHC.Tc.Gen.HsType
- GHC.Tc.TyCl call site