*** compiler/typecheck/TcMatches.lhs	2010-11-08 17:39:22.000000000 -0500
--- compiler/typecheck/TcMatches.lhs	2010-11-05 15:57:18.958067000 -0400
***************
*** 12,18 ****
  		   tcDoStmt, tcMDoStmt, tcGuardStmt
         ) where
  
! import {-# SOURCE #-}	TcExpr( tcSyntaxOp, tcInferRhoNC, 
                                  tcMonoExpr, tcMonoExprNC, tcPolyExpr )
  
  import HsSyn
--- 12,18 ----
  		   tcDoStmt, tcMDoStmt, tcGuardStmt
         ) where
  
! import {-# SOURCE #-}	TcExpr( tcSyntaxOp, tcInferRhoNC, tcCheckId,
                                  tcMonoExpr, tcMonoExprNC, tcPolyExpr )
  
  import HsSyn
***************
*** 24,37 ****
  import TcType
  import TcBinds
  import TcUnify
- import TcSimplify
  import Name
  import TysWiredIn
  import PrelNames
  import Id
  import TyCon
  import TysPrim
  import Outputable
  import Util
  import SrcLoc
  import FastString
--- 24,38 ----
  import TcType
  import TcBinds
  import TcUnify
  import Name
  import TysWiredIn
  import PrelNames
  import Id
  import TyCon
  import TysPrim
+ import Coercion		( mkSymCoercion )
  import Outputable
+ import BasicTypes	( Arity )
  import Util
  import SrcLoc
  import FastString
***************
*** 52,63 ****
  is used in error messages.  It checks that all the equations have the
  same number of arguments before using @tcMatches@ to do the work.
  
  \begin{code}
  tcMatchesFun :: Name -> Bool
  	     -> MatchGroup Name
! 	     -> BoxyRhoType 		-- Expected type of function
! 	     -> TcM (HsWrapper, MatchGroup TcId)	-- Returns type of body
! 
  tcMatchesFun fun_name inf matches exp_ty
    = do	{  -- Check that they all have the same no of arguments
  	   -- Location is in the monad, set the caller so that 
--- 53,69 ----
  is used in error messages.  It checks that all the equations have the
  same number of arguments before using @tcMatches@ to do the work.
  
+ Note [Polymorphic expected type for tcMatchesFun]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ tcMatchesFun may be given a *sigma* (polymorphic) type
+ so it must be prepared to use tcGen to skolemise it.
+ See Note [sig_tau may be polymorphic] in TcPat.
+ 
  \begin{code}
  tcMatchesFun :: Name -> Bool
  	     -> MatchGroup Name
! 	     -> TcSigmaType			   -- Expected type of function
! 	     -> TcM (HsWrapper, MatchGroup TcId)   -- Returns type of body
  tcMatchesFun fun_name inf matches exp_ty
    = do	{  -- Check that they all have the same no of arguments
  	   -- Location is in the monad, set the caller so that 
***************
*** 68,87 ****
            traceTc (text "tcMatchesFun" <+> (ppr fun_name $$ ppr exp_ty))
  	; checkArgs fun_name matches
  
! 	-- ToDo: Don't use "expected" stuff if there ain't a type signature
! 	-- because inconsistency between branches
! 	-- may show up as something wrong with the (non-existent) type signature
! 
! 		-- This is one of two places places we call subFunTys
! 		-- The point is that if expected_y is a "hole", we want 
! 		-- to make pat_tys and rhs_ty as "holes" too.
! 	; subFunTys doc n_pats exp_ty (Just (FunSigCtxt fun_name)) $ \ pat_tys rhs_ty -> 
! 	  tcMatches match_ctxt pat_tys rhs_ty matches
! 	}
    where
!     doc = ptext (sLit "The equation(s) for") <+> quotes (ppr fun_name)
! 	  <+> ptext (sLit "have") <+> speakNOf n_pats (ptext (sLit "argument"))
!     n_pats = matchGroupArity matches
      match_ctxt = MC { mc_what = FunRhs fun_name inf, mc_body = tcBody }
  \end{code}
  
--- 74,89 ----
            traceTc (text "tcMatchesFun" <+> (ppr fun_name $$ ppr exp_ty))
  	; checkArgs fun_name matches
  
! 	; (wrap_gen, (wrap_fun, group)) 
!             <- tcGen (SigSkol (FunSigCtxt fun_name)) exp_ty $ \ _ exp_rho ->
! 	          -- Note [Polymorphic expected type for tcMatchesFun]
!                matchFunTys herald arity exp_rho $ \ pat_tys rhs_ty -> 
! 	       tcMatches match_ctxt pat_tys rhs_ty matches 
!         ; return (wrap_gen <.> wrap_fun, group) }
    where
!     arity = matchGroupArity matches
!     herald = ptext (sLit "The equation(s) for")
!              <+> quotes (ppr fun_name) <+> ptext (sLit "have")
      match_ctxt = MC { mc_what = FunRhs fun_name inf, mc_body = tcBody }
  \end{code}
  
***************
*** 92,113 ****
  tcMatchesCase :: TcMatchCtxt		-- Case context
  	      -> TcRhoType		-- Type of scrutinee
  	      -> MatchGroup Name	-- The case alternatives
! 	      -> BoxyRhoType 		-- Type of whole case expressions
  	      -> TcM (MatchGroup TcId)	-- Translated alternatives
  
  tcMatchesCase ctxt scrut_ty matches res_ty
!   | isEmptyMatchGroup matches
!   =	  -- Allow empty case expressions
!     do {  -- Make sure we follow the invariant that res_ty is filled in
!           res_ty' <- refineBoxToTau res_ty
!        ;  return (MatchGroup [] (mkFunTys [scrut_ty] res_ty')) }
  
    | otherwise
    = tcMatches ctxt [scrut_ty] res_ty matches
  
! tcMatchLambda :: MatchGroup Name -> BoxyRhoType -> TcM (HsWrapper, MatchGroup TcId)
  tcMatchLambda match res_ty 
!   = subFunTys doc n_pats res_ty Nothing	$ \ pat_tys rhs_ty ->
      tcMatches match_ctxt pat_tys rhs_ty match
    where
      n_pats = matchGroupArity match
--- 94,112 ----
  tcMatchesCase :: TcMatchCtxt		-- Case context
  	      -> TcRhoType		-- Type of scrutinee
  	      -> MatchGroup Name	-- The case alternatives
! 	      -> TcRhoType 		-- Type of whole case expressions
  	      -> TcM (MatchGroup TcId)	-- Translated alternatives
  
  tcMatchesCase ctxt scrut_ty matches res_ty
!   | isEmptyMatchGroup matches   -- Allow empty case expressions
!   = return (MatchGroup [] (mkFunTys [scrut_ty] res_ty)) 
  
    | otherwise
    = tcMatches ctxt [scrut_ty] res_ty matches
  
! tcMatchLambda :: MatchGroup Name -> TcRhoType -> TcM (HsWrapper, MatchGroup TcId)
  tcMatchLambda match res_ty 
!   = matchFunTys doc n_pats res_ty  $ \ pat_tys rhs_ty ->
      tcMatches match_ctxt pat_tys rhs_ty match
    where
      n_pats = matchGroupArity match
***************
*** 123,129 ****
  @tcGRHSsPat@ typechecks @[GRHSs]@ that occur in a @PatMonoBind@.
  
  \begin{code}
! tcGRHSsPat :: GRHSs Name -> BoxyRhoType -> TcM (GRHSs TcId)
  -- Used for pattern bindings
  tcGRHSsPat grhss res_ty = tcGRHSs match_ctxt grhss res_ty
    where
--- 122,128 ----
  @tcGRHSsPat@ typechecks @[GRHSs]@ that occur in a @PatMonoBind@.
  
  \begin{code}
! tcGRHSsPat :: GRHSs Name -> TcRhoType -> TcM (GRHSs TcId)
  -- Used for pattern bindings
  tcGRHSsPat grhss res_ty = tcGRHSs match_ctxt grhss res_ty
    where
***************
*** 132,137 ****
  \end{code}
  
  
  %************************************************************************
  %*									*
  \subsection{tcMatch}
--- 131,153 ----
  \end{code}
  
  
+ \begin{code}
+ matchFunTys
+   :: SDoc	-- See Note [Herald for matchExpecteFunTys] in TcUnify
+   -> Arity
+   -> TcRhoType
+   -> ([TcSigmaType] -> TcRhoType -> TcM a)
+   -> TcM (HsWrapper, a)
+ 
+ -- Written in CPS style for historical reasons; 
+ -- could probably be un-CPSd, like matchExpectedTyConApp
+ 
+ matchFunTys herald arity res_ty thing_inside
+   = do	{ (coi, pat_tys, res_ty) <- matchExpectedFunTys herald arity res_ty
+ 	; res <- thing_inside pat_tys res_ty
+         ; return (coToHsWrapper (mkSymCoercion coi), res) }
+ \end{code}
+ 
  %************************************************************************
  %*									*
  \subsection{tcMatch}
***************
*** 140,147 ****
  
  \begin{code}
  tcMatches :: TcMatchCtxt
! 	  -> [BoxySigmaType] 		-- Expected pattern types
! 	  -> BoxyRhoType		-- Expected result-type of the Match.
  	  -> MatchGroup Name
  	  -> TcM (MatchGroup TcId)
  
--- 156,163 ----
  
  \begin{code}
  tcMatches :: TcMatchCtxt
! 	  -> [TcSigmaType] 	-- Expected pattern types
! 	  -> TcRhoType		-- Expected result-type of the Match.
  	  -> MatchGroup Name
  	  -> TcM (MatchGroup TcId)
  
***************
*** 149,155 ****
    = MC { mc_what :: HsMatchContext Name,	-- What kind of thing this is
      	 mc_body :: LHsExpr Name 		-- Type checker for a body of
                                                  -- an alternative
! 		 -> BoxyRhoType
  		 -> TcM (LHsExpr TcId) }	
  
  tcMatches ctxt pat_tys rhs_ty (MatchGroup matches _)
--- 165,171 ----
    = MC { mc_what :: HsMatchContext Name,	-- What kind of thing this is
      	 mc_body :: LHsExpr Name 		-- Type checker for a body of
                                                  -- an alternative
! 		 -> TcRhoType
  		 -> TcM (LHsExpr TcId) }	
  
  tcMatches ctxt pat_tys rhs_ty (MatchGroup matches _)
***************
*** 159,166 ****
  
  -------------
  tcMatch :: TcMatchCtxt
! 	-> [BoxySigmaType]	-- Expected pattern types
! 	-> BoxyRhoType	 	-- Expected result-type of the Match.
  	-> LMatch Name
  	-> TcM (LMatch TcId)
  
--- 175,182 ----
  
  -------------
  tcMatch :: TcMatchCtxt
! 	-> [TcSigmaType]	-- Expected pattern types
! 	-> TcRhoType	 	-- Expected result-type of the Match.
  	-> LMatch Name
  	-> TcM (LMatch TcId)
  
***************
*** 170,176 ****
      tc_match ctxt pat_tys rhs_ty match@(Match pats maybe_rhs_sig grhss)
        = add_match_ctxt match $
          do { (pats', grhss') <- tcPats (mc_what ctxt) pats pat_tys rhs_ty $
!     			        tc_grhss ctxt maybe_rhs_sig grhss
  	   ; return (Match pats' Nothing grhss') }
  
      tc_grhss ctxt Nothing grhss rhs_ty 
--- 186,192 ----
      tc_match ctxt pat_tys rhs_ty match@(Match pats maybe_rhs_sig grhss)
        = add_match_ctxt match $
          do { (pats', grhss') <- tcPats (mc_what ctxt) pats pat_tys rhs_ty $
!     			        tc_grhss ctxt maybe_rhs_sig grhss rhs_ty
  	   ; return (Match pats' Nothing grhss') }
  
      tc_grhss ctxt Nothing grhss rhs_ty 
***************
*** 188,194 ****
  	    m_ctxt     -> addErrCtxt (pprMatchInCtxt m_ctxt match) thing_inside
  
  -------------
! tcGRHSs :: TcMatchCtxt -> GRHSs Name -> BoxyRhoType
  	-> TcM (GRHSs TcId)
  
  -- Notice that we pass in the full res_ty, so that we get
--- 204,210 ----
  	    m_ctxt     -> addErrCtxt (pprMatchInCtxt m_ctxt match) thing_inside
  
  -------------
! tcGRHSs :: TcMatchCtxt -> GRHSs Name -> TcRhoType
  	-> TcM (GRHSs TcId)
  
  -- Notice that we pass in the full res_ty, so that we get
***************
*** 204,210 ****
  	; return (GRHSs grhss' binds') }
  
  -------------
! tcGRHS :: TcMatchCtxt -> BoxyRhoType -> GRHS Name -> TcM (GRHS TcId)
  
  tcGRHS ctxt res_ty (GRHS guards rhs)
    = do  { (guards', rhs') <- tcStmts stmt_ctxt tcGuardStmt guards res_ty $
--- 220,226 ----
  	; return (GRHSs grhss' binds') }
  
  -------------
! tcGRHS :: TcMatchCtxt -> TcRhoType -> GRHS Name -> TcM (GRHS TcId)
  
  tcGRHS ctxt res_ty (GRHS guards rhs)
    = do  { (guards', rhs') <- tcStmts stmt_ctxt tcGuardStmt guards res_ty $
***************
*** 225,246 ****
  tcDoStmts :: HsStmtContext Name 
  	  -> [LStmt Name]
  	  -> LHsExpr Name
! 	  -> BoxyRhoType
  	  -> TcM (HsExpr TcId)		-- Returns a HsDo
  tcDoStmts ListComp stmts body res_ty
!   = do	{ (elt_ty, coi) <- boxySplitListTy res_ty
  	; (stmts', body') <- tcStmts ListComp (tcLcStmt listTyCon) stmts 
  				     elt_ty $
  			     tcBody body
! 	; return $ mkHsWrapCoI coi 
                       (HsDo ListComp stmts' body' (mkListTy elt_ty)) }
  
  tcDoStmts PArrComp stmts body res_ty
!   = do	{ (elt_ty, coi) <- boxySplitPArrTy res_ty
  	; (stmts', body') <- tcStmts PArrComp (tcLcStmt parrTyCon) stmts 
  				     elt_ty $
  			     tcBody body
! 	; return $ mkHsWrapCoI coi 
                       (HsDo PArrComp stmts' body' (mkPArrTy elt_ty)) }
  
  tcDoStmts DoExpr stmts body res_ty
--- 241,262 ----
  tcDoStmts :: HsStmtContext Name 
  	  -> [LStmt Name]
  	  -> LHsExpr Name
! 	  -> TcRhoType
  	  -> TcM (HsExpr TcId)		-- Returns a HsDo
  tcDoStmts ListComp stmts body res_ty
!   = do	{ (coi, elt_ty) <- matchExpectedListTy res_ty
  	; (stmts', body') <- tcStmts ListComp (tcLcStmt listTyCon) stmts 
  				     elt_ty $
  			     tcBody body
! 	; return $ mkHsWrapCo coi 
                       (HsDo ListComp stmts' body' (mkListTy elt_ty)) }
  
  tcDoStmts PArrComp stmts body res_ty
!   = do	{ (coi, elt_ty) <- matchExpectedPArrTy res_ty
  	; (stmts', body') <- tcStmts PArrComp (tcLcStmt parrTyCon) stmts 
  				     elt_ty $
  			     tcBody body
! 	; return $ mkHsWrapCo coi 
                       (HsDo PArrComp stmts' body' (mkPArrTy elt_ty)) }
  
  tcDoStmts DoExpr stmts body res_ty
***************
*** 249,272 ****
  	; return (HsDo DoExpr stmts' body' res_ty) }
  
  tcDoStmts ctxt@(MDoExpr _) stmts body res_ty
!   = do	{ ((m_ty, elt_ty), coi) <- boxySplitAppTy res_ty
!  	; let res_ty' = mkAppTy m_ty elt_ty	-- The boxySplit consumes res_ty
! 	      tc_rhs rhs = withBox liftedTypeKind $ \ pat_ty ->
  			   tcMonoExpr rhs (mkAppTy m_ty pat_ty)
  
! 	; (stmts', body') <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts 
! 				     res_ty' $
  			     tcBody body
  
  	; let names = [mfixName, bindMName, thenMName, returnMName, failMName]
! 	; insts <- mapM (newMethodFromName DoOrigin m_ty) names
! 	; return $ 
!             mkHsWrapCoI coi 
!               (HsDo (MDoExpr (names `zip` insts)) stmts' body' res_ty') }
  
  tcDoStmts ctxt _ _ _ = pprPanic "tcDoStmts" (pprStmtContext ctxt)
  
! tcBody :: LHsExpr Name -> BoxyRhoType -> TcM (LHsExpr TcId)
  tcBody body res_ty
    = do	{ traceTc (text "tcBody" <+> ppr res_ty)
  	; body' <- tcMonoExpr body res_ty
--- 265,286 ----
  	; return (HsDo DoExpr stmts' body' res_ty) }
  
  tcDoStmts ctxt@(MDoExpr _) stmts body res_ty
!   = do	{ (coi, (m_ty, elt_ty)) <- matchExpectedAppTy res_ty
!  	; let res_ty' = mkAppTy m_ty elt_ty	-- The matchExpected consumes res_ty
! 	      tc_rhs rhs = tcInfer $ \ pat_ty ->
  			   tcMonoExpr rhs (mkAppTy m_ty pat_ty)
  
! 	; (stmts', body') <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts res_ty' $
  			     tcBody body
  
  	; let names = [mfixName, bindMName, thenMName, returnMName, failMName]
! 	; insts <- mapM (\name -> newMethodFromName DoOrigin name m_ty) names
! 	; return $ mkHsWrapCo coi $ 
!           HsDo (MDoExpr (names `zip` insts)) stmts' body' res_ty' }
  
  tcDoStmts ctxt _ _ _ = pprPanic "tcDoStmts" (pprStmtContext ctxt)
  
! tcBody :: LHsExpr Name -> TcRhoType -> TcM (LHsExpr TcId)
  tcBody body res_ty
    = do	{ traceTc (text "tcBody" <+> ppr res_ty)
  	; body' <- tcMonoExpr body res_ty
***************
*** 285,299 ****
  type TcStmtChecker
    =  forall thing. HsStmtContext Name
          	-> Stmt Name
! 		-> BoxyRhoType			-- Result type for comprehension
! 	      	-> (BoxyRhoType -> TcM thing)	-- Checker for what follows the stmt
                	-> TcM (Stmt TcId, thing)
  
  tcStmts :: HsStmtContext Name
  	-> TcStmtChecker	-- NB: higher-rank type
          -> [LStmt Name]
! 	-> BoxyRhoType
! 	-> (BoxyRhoType -> TcM thing)
          -> TcM ([LStmt TcId], thing)
  
  -- Note the higher-rank type.  stmt_chk is applied at different
--- 299,313 ----
  type TcStmtChecker
    =  forall thing. HsStmtContext Name
          	-> Stmt Name
! 		-> TcRhoType			-- Result type for comprehension
! 	      	-> (TcRhoType -> TcM thing)	-- Checker for what follows the stmt
                	-> TcM (Stmt TcId, thing)
  
  tcStmts :: HsStmtContext Name
  	-> TcStmtChecker	-- NB: higher-rank type
          -> [LStmt Name]
! 	-> TcRhoType
! 	-> (TcRhoType -> TcM thing)
          -> TcM ([LStmt TcId], thing)
  
  -- Note the higher-rank type.  stmt_chk is applied at different
***************
*** 330,336 ****
  
  tcGuardStmt ctxt (BindStmt pat rhs _ _) res_ty thing_inside
    = do	{ (rhs', rhs_ty) <- tcInferRhoNC rhs	-- Stmt has a context already
! 	; (pat', thing)  <- tcPat (StmtCtxt ctxt) pat rhs_ty res_ty thing_inside
  	; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
  
  tcGuardStmt _ stmt _ _
--- 344,351 ----
  
  tcGuardStmt ctxt (BindStmt pat rhs _ _) res_ty thing_inside
    = do	{ (rhs', rhs_ty) <- tcInferRhoNC rhs	-- Stmt has a context already
! 	; (pat', thing)  <- tcPat (StmtCtxt ctxt) pat rhs_ty res_ty $
!                             thing_inside res_ty
  	; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
  
  tcGuardStmt _ stmt _ _
***************
*** 345,353 ****
  
  -- A generator, pat <- rhs
  tcLcStmt m_tc ctxt (BindStmt pat rhs _ _) res_ty thing_inside
!  = do	{ (rhs', pat_ty) <- withBox liftedTypeKind $ \ ty ->
! 			    tcMonoExpr rhs (mkTyConApp m_tc [ty])
! 	; (pat', thing)  <- tcPat (StmtCtxt ctxt) pat pat_ty res_ty thing_inside
  	; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
  
  -- A boolean guard
--- 360,369 ----
  
  -- A generator, pat <- rhs
  tcLcStmt m_tc ctxt (BindStmt pat rhs _ _) res_ty thing_inside
!  = do	{ pat_ty <- newFlexiTyVarTy liftedTypeKind
!         ; rhs'   <- tcMonoExpr rhs (mkTyConApp m_tc [pat_ty])
! 	; (pat', thing)  <- tcPat (StmtCtxt ctxt) pat pat_ty res_ty $
!                             thing_inside res_ty
  	; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
  
  -- A boolean guard
***************
*** 361,367 ****
  --		     | ... ; let h v = ... ]
  --
  -- It's possible that g,h are overloaded, so we need to feed the LIE from the
! -- (g x, h x) up through both lots of bindings (so we get the bindInstsOfLocalFuns).
  -- Similarly if we had an existential pattern match:
  --
  --	data T = forall a. Show a => C a
--- 377,383 ----
  --		     | ... ; let h v = ... ]
  --
  -- It's possible that g,h are overloaded, so we need to feed the LIE from the
! -- (g x, h x) up through both lots of bindings (so we get the bindLocalMethods).
  -- Similarly if we had an existential pattern match:
  --
  --	data T = forall a. Show a => C a
***************
*** 477,488 ****
                  -- (see Note [Treat rebindable syntax first], but that breaks 
  		-- the rigidity info for GADTs.  When we move to the new story
                  -- for GADTs, we can move this after tcSyntaxOp
!           (rhs', rhs_ty) <- tcInferRhoNC rhs
! 
! 	; ((bind_op', new_res_ty), pat_ty) <- 
! 	     withBox liftedTypeKind $ \ pat_ty ->
! 	     withBox liftedTypeKind $ \ new_res_ty ->
! 	     tcSyntaxOp DoOrigin bind_op 
  			     (mkFunTys [rhs_ty, mkFunTy pat_ty new_res_ty] res_ty)
  
  		-- If (but only if) the pattern can fail, 
--- 493,502 ----
                  -- (see Note [Treat rebindable syntax first], but that breaks 
  		-- the rigidity info for GADTs.  When we move to the new story
                  -- for GADTs, we can move this after tcSyntaxOp
!           rhs_ty     <- newFlexiTyVarTy liftedTypeKind
!         ; pat_ty     <- newFlexiTyVarTy liftedTypeKind
!         ; new_res_ty <- newFlexiTyVarTy liftedTypeKind
! 	; bind_op'   <- tcSyntaxOp DoOrigin bind_op 
  			     (mkFunTys [rhs_ty, mkFunTy pat_ty new_res_ty] res_ty)
  
  		-- If (but only if) the pattern can fail, 
***************
*** 491,505 ****
  		      then return noSyntaxExpr
  		      else tcSyntaxOp DoOrigin fail_op (mkFunTy stringTy new_res_ty)
  
! 		-- We should typecheck the RHS *before* the pattern,
!                 -- because of GADTs. 
! 		-- 	do { pat <- rhs; <rest> }
! 		-- is rather like
! 		--	case rhs of { pat -> <rest> }
! 		-- We do inference on rhs, so that information about its type 
!                 -- can be refined when type-checking the pattern. 
! 
! 	; (pat', thing) <- tcPat (StmtCtxt ctxt) pat pat_ty new_res_ty thing_inside
  
  	; return (BindStmt pat' rhs' bind_op' fail_op', thing) }
  
--- 505,513 ----
  		      then return noSyntaxExpr
  		      else tcSyntaxOp DoOrigin fail_op (mkFunTy stringTy new_res_ty)
  
!         ; rhs' <- tcMonoExpr rhs rhs_ty
! 	; (pat', thing) <- tcPat (StmtCtxt ctxt) pat pat_ty new_res_ty $
!                            thing_inside new_res_ty
  
  	; return (BindStmt pat' rhs' bind_op' fail_op', thing) }
  
***************
*** 508,517 ****
    = do	{   	-- Deal with rebindable syntax; 
                  --   (>>) :: rhs_ty -> new_res_ty -> res_ty
  		-- See also Note [Treat rebindable syntax first]
! 	  ((then_op', rhs_ty), new_res_ty) <-
! 		withBox liftedTypeKind $ \ new_res_ty ->
! 		withBox liftedTypeKind $ \ rhs_ty ->
! 		tcSyntaxOp DoOrigin then_op 
  			   (mkFunTys [rhs_ty, new_res_ty] res_ty)
  
          ; rhs' <- tcMonoExprNC rhs rhs_ty
--- 516,524 ----
    = do	{   	-- Deal with rebindable syntax; 
                  --   (>>) :: rhs_ty -> new_res_ty -> res_ty
  		-- See also Note [Treat rebindable syntax first]
!           rhs_ty     <- newFlexiTyVarTy liftedTypeKind
!         ; new_res_ty <- newFlexiTyVarTy liftedTypeKind
! 	; then_op' <- tcSyntaxOp DoOrigin then_op 
  			   (mkFunTys [rhs_ty, new_res_ty] res_ty)
  
          ; rhs' <- tcMonoExprNC rhs rhs_ty
***************
*** 528,550 ****
  	      tup_ty  = mkBoxedTupleTy tup_elt_tys
  
          ; tcExtendIdEnv tup_ids $ do
!         { ((stmts', (ret_op', tup_rets)), stmts_ty)
!                 <- withBox liftedTypeKind $ \ stmts_ty ->
!                    tcStmts ctxt tcDoStmt stmts stmts_ty   $ \ inner_res_ty ->
!                    do { tup_rets <- zipWithM tc_ret tup_names tup_elt_tys
  		      ; ret_op' <- tcSyntaxOp DoOrigin ret_op (mkFunTy tup_ty inner_res_ty)
                        ; return (ret_op', tup_rets) }
  
! 	; (mfix_op', mfix_res_ty) <- withBox liftedTypeKind $ \ mfix_res_ty ->
!                                      tcSyntaxOp DoOrigin mfix_op
!                                         (mkFunTy (mkFunTy tup_ty stmts_ty) mfix_res_ty)
! 
! 	; (bind_op', new_res_ty) <- withBox liftedTypeKind $ \ new_res_ty ->
! 				    tcSyntaxOp DoOrigin bind_op 
! 			                (mkFunTys [mfix_res_ty, mkFunTy tup_ty new_res_ty] res_ty)
  
!         ; (thing,lie) <- getLIE (thing_inside new_res_ty)
!         ; lie_binds <- bindInstsOfLocalFuns lie tup_ids
    
          ; let rec_ids = takeList rec_names tup_ids
  	; later_ids <- tcLookupLocalIds later_names
--- 535,559 ----
  	      tup_ty  = mkBoxedTupleTy tup_elt_tys
  
          ; tcExtendIdEnv tup_ids $ do
!         { stmts_ty <- newFlexiTyVarTy liftedTypeKind
!         ; (stmts', (ret_op', tup_rets))
!                 <- tcStmts ctxt tcDoStmt stmts stmts_ty   $ \ inner_res_ty ->
!                    do { tup_rets <- zipWithM tcCheckId tup_names tup_elt_tys
!                              -- Unify the types of the "final" Ids (which may 
!                              -- be polymorphic) with those of "knot-tied" Ids
  		      ; ret_op' <- tcSyntaxOp DoOrigin ret_op (mkFunTy tup_ty inner_res_ty)
                        ; return (ret_op', tup_rets) }
  
! 	; mfix_res_ty <- newFlexiTyVarTy liftedTypeKind
!         ; mfix_op' <- tcSyntaxOp DoOrigin mfix_op
!                                  (mkFunTy (mkFunTy tup_ty stmts_ty) mfix_res_ty)
! 
! 	; new_res_ty <- newFlexiTyVarTy liftedTypeKind
!         ; bind_op' <- tcSyntaxOp DoOrigin bind_op 
! 			         (mkFunTys [mfix_res_ty, mkFunTy tup_ty new_res_ty] res_ty)
  
!         ; thing <- thing_inside new_res_ty
! --         ; lie_binds <- bindLocalMethods lie tup_ids
    
          ; let rec_ids = takeList rec_names tup_ids
  	; later_ids <- tcLookupLocalIds later_names
***************
*** 553,568 ****
          ; return (RecStmt { recS_stmts = stmts', recS_later_ids = later_ids
                            , recS_rec_ids = rec_ids, recS_ret_fn = ret_op' 
                            , recS_mfix_fn = mfix_op', recS_bind_fn = bind_op'
!                           , recS_rec_rets = tup_rets, recS_dicts = lie_binds }, thing)
          }}
-   where 
-     -- Unify the types of the "final" Ids with those of "knot-tied" Ids
-     tc_ret rec_name mono_ty
-         = do { poly_id <- tcLookupId rec_name
-                 -- poly_id may have a polymorphic type
-                 -- but mono_ty is just a monomorphic type variable
-              ; co_fn <- tcSubExp DoOrigin (idType poly_id) mono_ty
-              ; return (mkHsWrap co_fn (HsVar poly_id)) }
  
  tcDoStmt _ stmt _ _
    = pprPanic "tcDoStmt: unexpected Stmt" (ppr stmt)
--- 562,569 ----
          ; return (RecStmt { recS_stmts = stmts', recS_later_ids = later_ids
                            , recS_rec_ids = rec_ids, recS_ret_fn = ret_op' 
                            , recS_mfix_fn = mfix_op', recS_bind_fn = bind_op'
!                           , recS_rec_rets = tup_rets, recS_dicts = emptyTcEvBinds }, thing)
          }}
  
  tcDoStmt _ stmt _ _
    = pprPanic "tcDoStmt: unexpected Stmt" (ppr stmt)
***************
*** 589,595 ****
  	  -> TcStmtChecker
  tcMDoStmt tc_rhs ctxt (BindStmt pat rhs _ _) res_ty thing_inside
    = do	{ (rhs', pat_ty) <- tc_rhs rhs
! 	; (pat', thing)  <- tcPat (StmtCtxt ctxt) pat pat_ty res_ty thing_inside
  	; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
  
  tcMDoStmt tc_rhs _ (ExprStmt rhs _ _) res_ty thing_inside
--- 590,597 ----
  	  -> TcStmtChecker
  tcMDoStmt tc_rhs ctxt (BindStmt pat rhs _ _) res_ty thing_inside
    = do	{ (rhs', pat_ty) <- tc_rhs rhs
! 	; (pat', thing)  <- tcPat (StmtCtxt ctxt) pat pat_ty res_ty $
!                             thing_inside res_ty
  	; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
  
  tcMDoStmt tc_rhs _ (ExprStmt rhs _ _) res_ty thing_inside
***************
*** 604,634 ****
      	{ (stmts', (later_ids, rec_rets))
  		<- tcStmts ctxt (tcMDoStmt tc_rhs) stmts res_ty	$ \ _res_ty' ->
  			-- ToDo: res_ty not really right
! 		   do { rec_rets <- zipWithM tc_ret recNames rec_tys
  		      ; later_ids <- tcLookupLocalIds laterNames
  		      ; return (later_ids, rec_rets) }
  
! 	; (thing,lie) <- tcExtendIdEnv later_ids (getLIE (thing_inside res_ty))
  		-- NB:	The rec_ids for the recursive things 
  		-- 	already scope over this part. This binding may shadow
  		--	some of them with polymorphic things with the same Name
  		--	(see note [RecStmt] in HsExpr)
! 	; lie_binds <- bindInstsOfLocalFuns lie later_ids
    
  	; return (RecStmt stmts' later_ids rec_ids noSyntaxExpr noSyntaxExpr noSyntaxExpr rec_rets lie_binds, thing)
  	}}
-   where 
-     -- Unify the types of the "final" Ids with those of "knot-tied" Ids
-     tc_ret rec_name mono_ty
- 	= do { poly_id <- tcLookupId rec_name
- 		-- poly_id may have a polymorphic type
- 		-- but mono_ty is just a monomorphic type variable
- 	     ; co_fn <- tcSubExp DoOrigin (idType poly_id) mono_ty
- 	     ; return (mkHsWrap co_fn (HsVar poly_id)) }
  
  tcMDoStmt _ _ stmt _ _
    = pprPanic "tcMDoStmt: unexpected Stmt" (ppr stmt)
- 
  \end{code}
  
  
--- 606,630 ----
      	{ (stmts', (later_ids, rec_rets))
  		<- tcStmts ctxt (tcMDoStmt tc_rhs) stmts res_ty	$ \ _res_ty' ->
  			-- ToDo: res_ty not really right
! 		   do { rec_rets <- zipWithM tcCheckId recNames rec_tys
  		      ; later_ids <- tcLookupLocalIds laterNames
  		      ; return (later_ids, rec_rets) }
  
! 	; thing <- tcExtendIdEnv later_ids (thing_inside res_ty)
  		-- NB:	The rec_ids for the recursive things 
  		-- 	already scope over this part. This binding may shadow
  		--	some of them with polymorphic things with the same Name
  		--	(see note [RecStmt] in HsExpr)
! 
! -- Need the bindLocalMethods if we re-add Method constraints
! --	; lie_binds <- bindLocalMethods lie later_ids
! 	; let lie_binds = emptyTcEvBinds
    
  	; return (RecStmt stmts' later_ids rec_ids noSyntaxExpr noSyntaxExpr noSyntaxExpr rec_rets lie_binds, thing)
  	}}
  
  tcMDoStmt _ _ stmt _ _
    = pprPanic "tcMDoStmt: unexpected Stmt" (ppr stmt)
  \end{code}
  
  
