Improve error recovery in the typechecker
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 13 Mar 2019 11:15:20 +0000 (11:15 +0000)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Sat, 16 Mar 2019 12:08:25 +0000 (08:08 -0400)
commit4927117cd6166a97455d788dbf7433c95441b57a
tree07a0e4b2277d0db641254f8b4c0c2fe3f33d588f
parent57201bebaeb15c5635ac5ea153b0141b55670199
Improve error recovery in the typechecker

Issue #16418 showed that we were carrying on too eagerly after a bogus
type signature was identified (a bad telescope in fact), leading to a
subsequent crash.

This led me in to a maze of twisty little passages in the typechecker's
error recovery, and I ended up doing some refactoring in TcRnMonad.
Some specfifics

* TcRnMonad.try_m is now called attemptM.

* I switched the order of the result pair in tryTc,
  to make it consistent with other similar functions.

* The actual exception used in the Tc monad is irrelevant so,
  to avoid polluting type signatures, I made tcTryM, a simple
  wrapper around tryM, and used it.

The more important changes are in

* TcSimplify.captureTopConstraints, where we should have been calling
  simplifyTop rather than reportUnsolved, so that levity defaulting
  takes place properly.

* TcUnify.emitResidualTvConstraint, where we need to set the correct
  status for a new implication constraint.  (Previously we ended up
  with an Insoluble constraint wrapped in an Unsolved implication,
  which meant that insolubleWC gave the wrong answer.
21 files changed:
compiler/ghci/RtClosureInspect.hs
compiler/typecheck/TcBackpack.hs
compiler/typecheck/TcBinds.hs
compiler/typecheck/TcRnExports.hs
compiler/typecheck/TcRnMonad.hs
compiler/typecheck/TcSigs.hs
compiler/typecheck/TcSimplify.hs
compiler/typecheck/TcUnify.hs
testsuite/tests/dependent/should_fail/BadTelescope2.hs
testsuite/tests/dependent/should_fail/BadTelescope2.stderr
testsuite/tests/dependent/should_fail/BadTelescope5.hs [new file with mode: 0644]
testsuite/tests/dependent/should_fail/BadTelescope5.stderr [new file with mode: 0644]
testsuite/tests/dependent/should_fail/T15743c.stderr
testsuite/tests/dependent/should_fail/T16418.hs [new file with mode: 0644]
testsuite/tests/dependent/should_fail/T16418.stderr [new file with mode: 0644]
testsuite/tests/dependent/should_fail/all.T
testsuite/tests/patsyn/should_fail/T9161-1.hs
testsuite/tests/patsyn/should_fail/T9161-1.stderr
testsuite/tests/patsyn/should_fail/T9161-2.hs
testsuite/tests/patsyn/should_fail/T9161-2.stderr
testsuite/tests/typecheck/should_fail/tcfail212.stderr