X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcHsSyn.lhs;h=fa54a630defe4568537e3ea480c0d475351f9d62;hb=389cca214f33a29646e08d57e3dca862140007b2;hp=b5534531e617dbb30d64440fc5ba7d6f40719d1e;hpb=bb7ffa1642e2110e26e1243c42a8a24adafa985d;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcHsSyn.lhs b/compiler/typecheck/TcHsSyn.lhs index b553453..fa54a63 100644 --- a/compiler/typecheck/TcHsSyn.lhs +++ b/compiler/typecheck/TcHsSyn.lhs @@ -35,7 +35,6 @@ import Id import TcRnMonad import PrelNames -import Type import TcType import TcMType import TysPrim @@ -251,11 +250,22 @@ zonkDictBndrs :: ZonkEnv -> [Var] -> TcM [Var] zonkDictBndrs env ids = mappM (zonkDictBndr env) ids zonkDictBndr :: ZonkEnv -> Var -> TcM Var -zonkDictBndr env var | isTyVar var = return var +zonkDictBndr env var | isTyVar var = zonkTyVarBndr env var | otherwise = zonkIdBndr env var zonkTopBndrs :: [TcId] -> TcM [Id] zonkTopBndrs ids = zonkIdBndrs emptyZonkEnv ids + +-- Zonk the kind of a non-TC tyvar in case it is a coercion variable (their +-- kind contains types). +-- +zonkTyVarBndr :: ZonkEnv -> TyVar -> TcM TyVar +zonkTyVarBndr env tv + | isCoVar tv + = do { kind <- zonkTcTypeToType env (tyVarKind tv) + ; return $ setTyVarKind tv kind + } + | otherwise = return tv \end{code} @@ -607,8 +617,16 @@ zonkCoFn env (WpLam id) = do { id' <- zonkDictBndr env id ; 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)) } + do { tv' <- zonkTyVarBndr env tv + ; 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 @@ -747,9 +765,9 @@ zonkRecFields env (HsRecFields flds dd) ; return (HsRecFields flds' dd) } where zonk_rbind fld - = do { new_expr <- zonkLExpr env (hsRecFieldArg fld) - ; return (fld { hsRecFieldArg = new_expr }) } - -- Field selectors have declared types; hence no zonking + = do { new_id <- wrapLocM (zonkIdBndr env) (hsRecFieldId fld) + ; new_expr <- zonkLExpr env (hsRecFieldArg fld) + ; return (fld { hsRecFieldId = new_id, hsRecFieldArg = new_expr }) } ------------------------------------------------------------------------- mapIPNameTc :: (a -> TcM b) -> IPName a -> TcM (IPName b)