checkTc, checkTcM, checkMaybeTc, checkMaybeTcM,
failTc, failWithTc, addErrTc, addErrsTc, warnTc,
- recoverTc, checkNoErrsTc, recoverNF_Tc, discardErrsTc,
+ recoverTc, checkNoErrsTc, ifErrsTc, recoverNF_Tc, discardErrsTc,
addErrTcM, addInstErrTcM, failWithTcM,
tcGetEnv, tcSetEnv,
foldBag, unitBag, unionBags, snocBag )
import Class ( Class )
import Name ( Name )
-import Var ( Id, TyVar, newMutTyVar, readMutTyVar, writeMutTyVar )
+import Var ( TyVar, newMutTyVar, readMutTyVar, writeMutTyVar )
import VarEnv ( TidyEnv, emptyTidyEnv )
import UniqSupply ( UniqSupply, uniqFromSupply, uniqsFromSupply,
splitUniqSupply, mkSplitUniqSupply,
errs_var = getTcErrs down
+ifErrsTc :: TcM r -> TcM r -> TcM r
+-- ifErrsTc bale_out main
+-- does 'bale_out' if there are errors in errors collection
+-- and does 'main' otherwise
+-- Useful to avoid error cascades
+
+ifErrsTc bale_out main
+ = getErrsTc `thenNF_Tc` \ (warns, errs) ->
+ if isEmptyBag errs then
+ main
+ else
+ bale_out
+
-- (tryTc_ r m) tries m; if it succeeds it returns it,
-- otherwise it returns r. Any error messages added by m are discarded,
-- whether or not m succeeds.
type InstLoc = (InstOrigin, SrcLoc, ErrCtxt)
data InstOrigin
- = OccurrenceOf Id -- Occurrence of an overloaded identifier
+ = OccurrenceOf Name -- Occurrence of an overloaded identifier
| IPOcc (IPName Name) -- Occurrence of an implicit parameter
| IPBind (IPName Name) -- Binding site of an implicit parameter
pprInstLoc (orig, locn, ctxt)
= hsep [text "arising from", pp_orig orig, text "at", ppr locn]
where
- pp_orig (OccurrenceOf id)
- = hsep [ptext SLIT("use of"), quotes (ppr id)]
+ pp_orig (OccurrenceOf name)
+ = hsep [ptext SLIT("use of"), quotes (ppr name)]
pp_orig (IPOcc name)
- = hsep [ptext SLIT("use of implicit parameter"), quotes (char '?' <> ppr name)]
+ = hsep [ptext SLIT("use of implicit parameter"), quotes (ppr name)]
pp_orig (IPBind name)
- = hsep [ptext SLIT("binding for implicit parameter"), quotes (char '?' <> ppr name)]
+ = hsep [ptext SLIT("binding for implicit parameter"), quotes (ppr name)]
pp_orig RecordUpdOrigin
= ptext SLIT("a record update")
pp_orig DataDeclOrigin