Skip to content
Snippets Groups Projects
Commit 1f689fc2 authored by sof's avatar sof
Browse files

[project @ 1997-07-26 03:26:10 by sof]

tcGRHS + tcGRHSsAndBinds carry extra expected type arg
parent a54d6062
No related branches found
No related tags found
No related merge requests found
...@@ -16,48 +16,47 @@ IMPORT_DELOOPER(TcLoop) -- for paranoia checking ...@@ -16,48 +16,47 @@ IMPORT_DELOOPER(TcLoop) -- for paranoia checking
import HsSyn ( GRHSsAndBinds(..), GRHS(..), MonoBinds, Stmt, DoOrListComp(..), import HsSyn ( GRHSsAndBinds(..), GRHS(..), MonoBinds, Stmt, DoOrListComp(..),
HsExpr, HsBinds(..), InPat, OutPat, Sig, Fake ) HsExpr, HsBinds(..), InPat, OutPat, Sig, Fake )
import RnHsSyn ( SYN_IE(RenamedGRHSsAndBinds), SYN_IE(RenamedGRHS) ) import RnHsSyn ( SYN_IE(RenamedGRHSsAndBinds), SYN_IE(RenamedGRHS) )
import TcHsSyn ( SYN_IE(TcGRHSsAndBinds), SYN_IE(TcGRHS), TcIdOcc(..) ) import TcHsSyn ( SYN_IE(TcGRHSsAndBinds), SYN_IE(TcGRHS) )
import TcMonad import TcMonad
import Inst ( Inst, SYN_IE(LIE), plusLIE ) import Inst ( Inst, SYN_IE(LIE), plusLIE )
import Kind ( mkTypeKind )
import TcBinds ( tcBindsAndThen ) import TcBinds ( tcBindsAndThen )
import TcExpr ( tcExpr, tcStmt ) import TcExpr ( tcExpr, tcStmt )
import TcType ( SYN_IE(TcType) ) import TcType ( SYN_IE(TcType), TcIdOcc(..), newTyVarTy )
import Unify ( unifyTauTy )
import TysWiredIn ( boolTy ) import TysWiredIn ( boolTy )
\end{code} \end{code}
\begin{code} \begin{code}
tcGRHSs :: [RenamedGRHS] -> TcM s ([TcGRHS s], LIE s, TcType s) tcGRHSs :: TcType s -> [RenamedGRHS] -> TcM s ([TcGRHS s], LIE s)
tcGRHSs [grhs] tcGRHSs expected_ty [grhs]
= tcGRHS grhs `thenTc` \ (grhs', lie, ty) -> = tcGRHS expected_ty grhs `thenTc` \ (grhs', lie) ->
returnTc ([grhs'], lie, ty) returnTc ([grhs'], lie)
tcGRHSs (grhs:grhss) tcGRHSs expected_ty (grhs:grhss)
= tcGRHS grhs `thenTc` \ (grhs', lie1, ty1) -> = tcGRHS expected_ty grhs `thenTc` \ (grhs', lie1) ->
tcGRHSs grhss `thenTc` \ (grhss', lie2, ty2) -> tcGRHSs expected_ty grhss `thenTc` \ (grhss', lie2) ->
unifyTauTy ty1 ty2 `thenTc_` returnTc (grhs' : grhss', lie1 `plusLIE` lie2)
returnTc (grhs' : grhss', lie1 `plusLIE` lie2, ty1)
tcGRHS (OtherwiseGRHS expr locn) tcGRHS expected_ty (OtherwiseGRHS expr locn)
= tcAddSrcLoc locn $ = tcAddSrcLoc locn $
tcExpr expr `thenTc` \ (expr, lie, ty) -> tcExpr expr expected_ty `thenTc` \ (expr, lie) ->
returnTc (OtherwiseGRHS expr locn, lie, ty) returnTc (OtherwiseGRHS expr locn, lie)
tcGRHS (GRHS guard expr locn) tcGRHS expected_ty (GRHS guard expr locn)
= tcAddSrcLoc locn $ = tcAddSrcLoc locn $
tc_stmts guard `thenTc` \ ((guard', expr', ty), lie) -> tc_stmts guard `thenTc` \ ((guard', expr'), lie) ->
returnTc (GRHS guard' expr' locn, lie, ty) returnTc (GRHS guard' expr' locn, lie)
where where
tc_stmts [] = tcExpr expr `thenTc` \ (expr2, expr_lie, expr_ty) -> tc_stmts [] = tcExpr expr expected_ty `thenTc` \ (expr2, expr_lie) ->
returnTc (([], expr2, expr_ty), expr_lie) returnTc (([], expr2), expr_lie)
tc_stmts (stmt:stmts) = tcStmt tcExpr ListComp (\x->x) combine stmt $ tc_stmts (stmt:stmts) = tcStmt tcExpr ListComp (\x->x) combine stmt $
tc_stmts stmts tc_stmts stmts
combine stmt _ (stmts, expr, ty) = (stmt:stmts, expr, ty) combine stmt _ (stmts, expr) = (stmt:stmts, expr)
\end{code} \end{code}
...@@ -65,17 +64,17 @@ tcGRHS (GRHS guard expr locn) ...@@ -65,17 +64,17 @@ tcGRHS (GRHS guard expr locn)
pieces. pieces.
\begin{code} \begin{code}
tcGRHSsAndBinds :: RenamedGRHSsAndBinds tcGRHSsAndBinds :: TcType s -- Expected type of RHSs
-> TcM s (TcGRHSsAndBinds s, LIE s, TcType s) -> RenamedGRHSsAndBinds
-> TcM s (TcGRHSsAndBinds s, LIE s)
tcGRHSsAndBinds (GRHSsAndBindsIn grhss binds) tcGRHSsAndBinds expected_ty (GRHSsAndBindsIn grhss binds)
= tcBindsAndThen = tcBindsAndThen
combiner binds combiner binds
(tcGRHSs grhss `thenTc` \ (grhss', lie, ty) -> (tcGRHSs expected_ty grhss `thenTc` \ (grhss', lie) ->
returnTc (GRHSsAndBindsOut grhss' EmptyBinds ty, lie) returnTc (GRHSsAndBindsOut grhss' EmptyBinds expected_ty, lie)
) `thenTc` \ (grhss_and_binds'@(GRHSsAndBindsOut _ _ result_ty), lie) -> )
returnTc (grhss_and_binds', lie, result_ty)
where where
combiner is_rec binds1 (GRHSsAndBindsOut grhss binds2 ty) combiner is_rec binds1 (GRHSsAndBindsOut grhss binds2 ty)
= GRHSsAndBindsOut grhss ((MonoBind binds1 [] is_rec) `ThenBinds` binds2) ty = GRHSsAndBindsOut grhss ((MonoBind binds1 [] is_rec) `ThenBinds` binds2) ty
\end{code} \end{code}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment