Fix Trac #2597 (first bug): correct type checking for empty list
[ghc-hetmet.git] / compiler / typecheck / TcHsSyn.lhs
index e6e95b3..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
@@ -1045,10 +1052,10 @@ mkArbitraryType :: (SrcSpan -> SDoc -> TcRnIf g l a)    -- How to complain
 -- 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