Fix isDroppableCt (Trac #14763)
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 8 Feb 2018 14:24:11 +0000 (14:24 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 8 Feb 2018 14:25:47 +0000 (14:25 +0000)
commit6edafe3be0133fe69581fb3851a812c69ab9dbf7
tree00f6f58cb7e5e233199d211b2ed397179b558584
parent059596df51619314a2e240af618fe7f4d2550ff2
Fix isDroppableCt (Trac #14763)

When finishing up an implication constraint, it's a bit tricky to
decide which Derived constraints to retain (for error reporting) and
which to discard.  I got this wrong in commit
   f20cf982f126aea968ed6a482551550ffb6650cf
   (Remove wc_insol from WantedConstraints)

The particular problem in Trac #14763 was that we were reporting as an
error a fundep-generated constraint
  (ex ~ T)
where 'ex' is an existentially-bound variable in a pattern match.
But this isn't really an error at all.

This patch fixes the problem. Indeed, since I had to understand
this rather tricky code, I took the opportunity to clean it up
and document better.  See
  isDroppableCt :: Ct -> Bool
and Note [Dropping derived constraints]

I also removed wl_deriv altogether from the WorkList data type.  It
was there in the hope of gaining efficiency by not even processing
lots of derived constraints, but it has turned out that most derived
constraints (notably equalities) must be processed anyway; see
Note [Prioritise equalities] in TcSMonad.

The two are coupled because to decide which constraints to put in
wl_deriv I was using another variant of isDroppableCt.  Now it's much
simpler -- and perhaps even more efficient too.
compiler/typecheck/TcCanonical.hs
compiler/typecheck/TcErrors.hs
compiler/typecheck/TcInteract.hs
compiler/typecheck/TcRnTypes.hs
compiler/typecheck/TcSMonad.hs
testsuite/tests/typecheck/should_compile/T14763.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/all.T