Improve error messages from type-checking data constructors
[ghc-hetmet.git] / compiler / typecheck / TcArrows.lhs
index c575808..538eaa7 100644 (file)
@@ -31,6 +31,7 @@ import TcGadt
 import TcPat
 import TcUnify
 import TcRnMonad
+import Coercion
 import Inst
 import Name
 import TysWiredIn
@@ -41,6 +42,8 @@ import Type
 import SrcLoc
 import Outputable
 import Util
+
+import Control.Monad
 \end{code}
 
 %************************************************************************
@@ -52,16 +55,18 @@ import Util
 \begin{code}
 tcProc :: InPat Name -> LHsCmdTop Name         -- proc pat -> expr
        -> BoxyRhoType                          -- Expected type of whole proc expression
-       -> TcM (OutPat TcId, LHsCmdTop TcId)
+       -> TcM (OutPat TcId, LHsCmdTop TcId, CoercionI)
 
 tcProc pat cmd exp_ty
   = newArrowScope $
-    do { (exp_ty1, res_ty) <- boxySplitAppTy exp_ty 
-       ; (arr_ty, arg_ty)  <- boxySplitAppTy exp_ty1
+    do { ((exp_ty1, res_ty), coi) <- boxySplitAppTy exp_ty 
+       ; ((arr_ty, arg_ty), coi1) <- boxySplitAppTy exp_ty1
        ; let cmd_env = CmdEnv { cmd_arr = arr_ty }
-       ; (pat', cmd') <- tcLamPat pat arg_ty (emptyRefinement, res_ty) $
+       ; (pat', cmd') <- tcProcPat pat arg_ty (emptyRefinement, res_ty) $
                          tcCmdTop cmd_env cmd []
-       ; return (pat', cmd') }
+        ; let res_coi = mkTransCoI coi (mkAppTyCoI exp_ty1 coi1 res_ty IdCo)
+       ; return (pat', cmd', res_coi) 
+        }
 \end{code}
 
 
@@ -125,12 +130,11 @@ tc_cmd env (HsLet binds (L body_loc body)) res_ty
        ; return (HsLet binds' (L body_loc body')) }
 
 tc_cmd env in_cmd@(HsCase scrut matches) (stk, res_ty)
-  = addErrCtxt (cmdCtxt in_cmd)                $
-    addErrCtxt (caseScrutCtxt scrut)   (
-      tcInferRho scrut 
-    )                                                  `thenM` \ (scrut', scrut_ty) ->
-    tcMatchesCase match_ctxt scrut_ty matches res_ty   `thenM` \ matches' ->
-    returnM (HsCase scrut' matches')
+  = addErrCtxt (cmdCtxt in_cmd) $ do
+      (scrut', scrut_ty) <- addErrCtxt (caseScrutCtxt scrut) $
+                              tcInferRho scrut 
+      matches' <- tcMatchesCase match_ctxt scrut_ty matches res_ty
+      return (HsCase scrut' matches')
   where
     match_ctxt = MC { mc_what = CaseAlt,
                       mc_body = mc_body }
@@ -203,7 +207,7 @@ tc_cmd env cmd@(HsLam (MatchGroup [L mtch_loc (match@(Match pats maybe_rhs_sig g
   where
     n_pats     = length pats
     stk'       = drop n_pats cmd_stk
-    match_ctxt = LambdaExpr    -- Maybe KappaExpr?
+    match_ctxt = (LambdaExpr :: HsMatchContext Name)   -- Maybe KappaExpr?
     pg_ctxt    = PatGuard match_ctxt
 
     tc_grhss (GRHSs grhss binds) res_ty
@@ -269,7 +273,7 @@ tc_cmd env cmd@(HsArrForm expr fixity cmd_args) (cmd_stk, res_ty)
                -- the s1..sm and check each cmd
        ; cmds' <- mapM (tc_cmd w_tv) cmds_w_tys
 
-       ; returnM (HsArrForm (noLoc $ HsWrap (WpTyLam w_tv) 
+       ; return (HsArrForm (noLoc $ HsWrap (WpTyLam w_tv) 
                                               (unLoc $ mkHsDictLet inst_binds expr')) 
                             fixity cmds')
        }