; let env1 = extendZonkEnv1 env id'
; return (env1, WpLam id') }
zonkCoFn env (WpTyLam tv) = ASSERT( isImmutableTyVar tv )
- do { return (env, WpTyLam tv) }
-zonkCoFn env (WpApp id) = do { return (env, WpApp (zonkIdOcc env id)) }
+ return (env, WpTyLam tv)
+zonkCoFn env (WpApp v)
+ | isTcTyVar v = do { co <- zonkTcTyVar v
+ ; return (env, WpTyApp co) }
+ -- Yuk! A mutable coercion variable is a TcTyVar
+ -- not a CoVar, so don't use isCoVar!
+ -- Yuk! A WpApp can't hold the zonked type,
+ -- so we switch to WpTyApp
+ | otherwise = return (env, WpApp (zonkIdOcc env v))
zonkCoFn env (WpTyApp ty) = do { ty' <- zonkTcTypeToType env ty
; return (env, WpTyApp ty') }
zonkCoFn env (WpLet bs) = do { (env1, bs') <- zonkRecMonoBinds env bs
-- to use when generating a warning
mkArbitraryType warn tv
| liftedTypeKind `isSubKind` kind -- The vastly common case
- = return anyPrimTy
- | eqKind kind (tyConKind anyPrimTyCon1) -- *->*
+ = return anyPrimTy
+ | eqKind kind (tyConKind anyPrimTyCon1) -- @*->*@
= return (mkTyConApp anyPrimTyCon1 []) -- No tuples this size
- | all isLiftedTypeKind args -- *-> ... ->*->*
+ | all isLiftedTypeKind args -- @*-> ... ->*->*@
, isLiftedTypeKind res -- Horrible hack to make less use
= return (mkTyConApp tup_tc []) -- of mkAnyPrimTyCon
| otherwise