Better error reporting for inaccessible code

Authored by simonpj on Aug 24 2018, 10:40 AM.

Description

Better error reporting for inaccessible code

This patch fixes Trac Trac #15558. There turned out to be
two distinct problems

  • In TcExpr.tc_poly_expr_nc we had

    tc_poly_expr_nc (L loc expr) res_ty = do { traceTc "tcPolyExprNC" (ppr res_ty) ; (wrap, expr') <- tcSkolemiseET GenSigCtxt res_ty $ \ res_ty -> setSrcSpan loc $
    • NB: setSrcSpan *after* skolemising,
    • so we get better skolem locations tcExpr expr res_ty

      Putting the setSrcSpan inside the tcSkolemise means that the location on the Implication constraint is the /call/ to the function rather than the /argument/ to the call, and that is really quite wrong.

      I don't know what Richard's comment NB means -- I moved the setSrcSpan outside, and the "binding site" info in error messages actually improved.

      The reason I found this is that it affects the span reported for Trac Trac #15558.
  • In TcErrors.mkGivenErrorReporter we carefully munge the location for an insoluble Given constraint (Note [Inaccessible code]). But the 'implic' passed in wasn't necesarily the immediately- enclosing implication -- but for location-munging purposes it jolly well should be.

    Solution: use the innermost implication. This actually simplifies the code -- no need to pass an implication in to mkGivenErrorReporter.