X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcHsSyn.lhs;h=6120621095bca212bb537ea9cebdb91d9675f777;hb=8897e76874e10daa4dc695342e68b15e114a6de0;hp=fe9c808be86cf1d6c853debc0b0daecd3727386b;hpb=a62561f71ab41e5ae50a48c98b9ea319eb3f646b;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcHsSyn.lhs b/compiler/typecheck/TcHsSyn.lhs index fe9c808..6120621 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,7 +617,8 @@ 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 ) - return (env, WpTyLam tv) + do { tv' <- zonkTyVarBndr env tv + ; return (env, WpTyLam tv') } zonkCoFn env (WpApp v) | isTcTyVar v = do { co <- zonkTcTyVar v ; return (env, WpTyApp co) } @@ -754,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) @@ -811,7 +822,8 @@ zonk_pat env (AsPat (L loc v) pat) zonk_pat env (ViewPat expr pat ty) = do { expr' <- zonkLExpr env expr ; (env', pat') <- zonkPat env pat - ; return (env', ViewPat expr' pat' ty) } + ; ty' <- zonkTcTypeToType env ty + ; return (env', ViewPat expr' pat' ty') } zonk_pat env (ListPat pats ty) = do { ty' <- zonkTcTypeToType env ty @@ -1059,7 +1071,7 @@ mkArbitraryType warn tv , isLiftedTypeKind res -- Horrible hack to make less use = return (mkTyConApp tup_tc []) -- of mkAnyPrimTyCon | otherwise - = do { warn (getSrcSpan tv) msg + = do { _ <- warn (getSrcSpan tv) msg ; return (mkTyConApp (mkAnyPrimTyCon (getUnique tv) kind) []) } -- Same name as the tyvar, apart from making it start with a colon (sigh) -- I dread to think what will happen if this gets out into an