+\begin{code}
+tcPat tc_bndr pat@(TypePatIn ty) pat_ty
+ = failWithTc (badTypePat pat)
+
+tcPat tc_bndr (VarPatIn name) pat_ty
+ = tc_bndr name pat_ty `thenTc` \ (co_fn, lie_req, bndr_id) ->
+ returnTc (co_fn <$> VarPat bndr_id, lie_req,
+ emptyBag, unitBag (name, bndr_id), emptyLIE)
+
+tcPat tc_bndr (LazyPatIn pat) pat_ty
+ = tcPat tc_bndr pat pat_ty `thenTc` \ (pat', lie_req, tvs, ids, lie_avail) ->
+ returnTc (LazyPat pat', lie_req, tvs, ids, lie_avail)
+
+tcPat tc_bndr pat_in@(AsPatIn name pat) pat_ty
+ = tc_bndr name pat_ty `thenTc` \ (co_fn, lie_req1, bndr_id) ->
+ tcPat tc_bndr pat pat_ty `thenTc` \ (pat', lie_req2, tvs, ids, lie_avail) ->
+ returnTc (co_fn <$> (AsPat bndr_id pat'), lie_req1 `plusLIE` lie_req2,
+ tvs, (name, bndr_id) `consBag` ids, lie_avail)
+
+tcPat tc_bndr WildPatIn pat_ty
+ = returnTc (WildPat pat_ty, emptyLIE, emptyBag, emptyBag, emptyLIE)
+
+tcPat tc_bndr (ParPatIn parend_pat) pat_ty
+ = tcPat tc_bndr parend_pat pat_ty
+
+tcPat tc_bndr (SigPatIn pat sig) pat_ty
+ = tcHsSigType PatSigCtxt sig `thenTc` \ sig_ty ->
+ tcSubPat sig_ty pat_ty `thenTc` \ (co_fn, lie_sig) ->
+ tcPat tc_bndr pat sig_ty `thenTc` \ (pat', lie_req, tvs, ids, lie_avail) ->
+ returnTc (co_fn <$> pat', lie_req `plusLIE` lie_sig, tvs, ids, lie_avail)