Fix the zonking of HsWrappers
authorsimonpj@microsoft.com <unknown>
Wed, 10 Sep 2008 08:20:03 +0000 (08:20 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 10 Sep 2008 08:20:03 +0000 (08:20 +0000)
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

index b553453..fe9c808 100644 (file)
@@ -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