From a62561f71ab41e5ae50a48c98b9ea319eb3f646b Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Wed, 10 Sep 2008 08:20:03 +0000 Subject: [PATCH] Fix the zonking of HsWrappers HsWrappers are horribly inconsistent at the moment. I intended that WpLam, WpApp are for evidence abstraction/application WpTyLam, WpTyApp are for type abstraction/application But when we zonk (WpApp co), where co is a coercion variable, we get a *coercion* not a coercion *variable*. So for now I'm making it into a WpTyApp, which the desugarer handles perfectly well. (I'd forgotten to zonk it properly at all; that is the bug that this patch fixes.) --- compiler/typecheck/TcHsSyn.lhs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler/typecheck/TcHsSyn.lhs b/compiler/typecheck/TcHsSyn.lhs index b553453..fe9c808 100644 --- a/compiler/typecheck/TcHsSyn.lhs +++ b/compiler/typecheck/TcHsSyn.lhs @@ -607,8 +607,15 @@ 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)) } + 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 -- 1.7.10.4