Inline implication constraints
[ghc-hetmet.git] / compiler / typecheck / TcHsSyn.lhs
index 23cc0fe..ec93e84 100644 (file)
@@ -9,6 +9,13 @@ This module is an extension of @HsSyn@ syntax, for use in the type
 checker.
 
 \begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 module TcHsSyn (
        mkHsConApp, mkHsDictLet, mkHsApp,
        hsLitType, hsLPatType, hsPatType, 
@@ -78,12 +85,13 @@ hsPatType (BangPat pat)                 = hsLPatType pat
 hsPatType (LazyPat pat)                    = hsLPatType pat
 hsPatType (LitPat lit)             = hsLitType lit
 hsPatType (AsPat var pat)          = idType (unLoc var)
+hsPatType (ViewPat expr pat ty)     = ty
 hsPatType (ListPat _ ty)           = mkListTy ty
 hsPatType (PArrPat _ ty)           = mkPArrTy ty
 hsPatType (TuplePat pats box ty)    = ty
 hsPatType (ConPatOut{ pat_ty = ty })= ty
 hsPatType (SigPatOut pat ty)       = ty
-hsPatType (NPat lit _ _ ty)        = ty
+hsPatType (NPat lit _ _)           = overLitType lit
 hsPatType (NPlusKPat id _ _ _)      = idType (unLoc id)
 hsPatType (CoPat _ _ ty)           = ty
 
@@ -186,6 +194,13 @@ zonkIdBndr env id
 zonkIdBndrs :: ZonkEnv -> [TcId] -> TcM [Id]
 zonkIdBndrs env ids = mappM (zonkIdBndr env) ids
 
+zonkDictBndrs :: ZonkEnv -> [Var] -> TcM [Var]
+-- "Dictionary" binders can be coercion variables or dictionary variables
+zonkDictBndrs env ids = mappM (zonkDictBndr env) ids
+
+zonkDictBndr env var | isTyVar var = return var
+                    | otherwise   = zonkIdBndr env var
+
 zonkTopBndrs :: [TcId] -> TcM [Id]
 zonkTopBndrs ids = zonkIdBndrs emptyZonkEnv ids
 \end{code}
@@ -279,7 +294,7 @@ zonk_bind env bind@(FunBind { fun_id = var, fun_matches = ms, fun_co_fn = co_fn
 zonk_bind env (AbsBinds { abs_tvs = tyvars, abs_dicts = dicts, 
                          abs_exports = exports, abs_binds = val_binds })
   = ASSERT( all isImmutableTyVar tyvars )
-    zonkIdBndrs env dicts              `thenM` \ new_dicts ->
+    zonkDictBndrs env dicts                    `thenM` \ new_dicts ->
     fixM (\ ~(new_val_binds, _) ->
        let
          env1 = extendZonkEnv env new_dicts
@@ -528,7 +543,8 @@ zonk_cmd_top env (HsCmdTop cmd stack_tys ty ids)
 
 -------------------------------------------------------------------------
 zonkCoFn :: ZonkEnv -> HsWrapper -> TcM (ZonkEnv, HsWrapper)
-zonkCoFn env WpHole = return (env, WpHole)
+zonkCoFn env WpHole   = return (env, WpHole)
+zonkCoFn env WpInline = return (env, WpInline)
 zonkCoFn env (WpCompose c1 c2) = do { (env1, c1') <- zonkCoFn env c1
                                    ; (env2, c2') <- zonkCoFn env1 c2
                                    ; return (env2, WpCompose c1' c2') }
@@ -554,12 +570,17 @@ zonkDo env do_or_lc      = do_or_lc
 
 -------------------------------------------------------------------------
 zonkOverLit :: ZonkEnv -> HsOverLit TcId -> TcM (HsOverLit Id)
-zonkOverLit env (HsIntegral i e)
-  = do { e' <- zonkExpr env e; return (HsIntegral i e') }
-zonkOverLit env (HsFractional r e)
-  = do { e' <- zonkExpr env e; return (HsFractional r e') }
-zonkOverLit env (HsIsString s e)
-  = do { e' <- zonkExpr env e; return (HsIsString s e') }
+zonkOverLit env ol = 
+    let 
+        zonkedStuff = do ty' <- zonkTcTypeToType env (overLitType ol)
+                         e' <- zonkExpr env (overLitExpr ol)
+                         return (e', ty')
+        ru f (x, y) = return (f x y)
+    in
+      case ol of 
+        (HsIntegral i _ _)   -> ru (HsIntegral i) =<< zonkedStuff
+        (HsFractional r _ _) -> ru (HsFractional r) =<< zonkedStuff
+        (HsIsString s _ _)   -> ru (HsIsString s) =<< zonkedStuff
 
 -------------------------------------------------------------------------
 zonkArithSeq :: ZonkEnv -> ArithSeqInfo TcId -> TcM (ArithSeqInfo Id)
@@ -698,6 +719,11 @@ zonk_pat env (AsPat (L loc v) pat)
        ; (env', pat') <- zonkPat (extendZonkEnv1 env v') pat
        ; return (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) }
+
 zonk_pat env (ListPat pats ty)
   = do { ty' <- zonkTcTypeToType env ty
        ; (env', pats') <- zonkPats env pats
@@ -730,15 +756,14 @@ zonk_pat env (SigPatOut pat ty)
        ; (env', pat') <- zonkPat env pat
        ; return (env', SigPatOut pat' ty') }
 
-zonk_pat env (NPat lit mb_neg eq_expr ty)
+zonk_pat env (NPat lit mb_neg eq_expr)
   = do { lit' <- zonkOverLit env lit
        ; mb_neg' <- case mb_neg of
                        Nothing  -> return Nothing
                        Just neg -> do { neg' <- zonkExpr env neg
                                       ; return (Just neg') }
        ; eq_expr' <- zonkExpr env eq_expr
-       ; ty' <- zonkTcTypeToType env ty
-       ; return (env, NPat lit' mb_neg' eq_expr' ty') }
+       ; return (env, NPat lit' mb_neg' eq_expr') }
 
 zonk_pat env (NPlusKPat (L loc n) lit e1 e2)
   = do { n' <- zonkIdBndr env n