+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
+ = zapToType pat_ty `thenNF_Tc` \ pat_ty' ->
+ -- We might have an incoming 'hole' type variable; no annotation
+ -- so zap it to a type. Rather like tcMonoPatBndr.
+ 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 pat_in@(SigPatIn pat sig) pat_ty
+ = tcAddErrCtxt (patCtxt pat_in) $
+ 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)
+\end{code}