Use "on the spot" solving for fundeps
authorsimonpj@microsoft.com <unknown>
Thu, 17 Feb 2011 14:09:21 +0000 (14:09 +0000)
committersimonpj@microsoft.com <unknown>
Thu, 17 Feb 2011 14:09:21 +0000 (14:09 +0000)
commit50d0293555691012f96259de7f8682b94db58517
tree2d3814f485377175796f05d2aa71014a0230e8d5
parent53da379cee909d23b9f785c2250e64cba34ad3b2
Use "on the spot" solving for fundeps

When we spot an equality arising from a functional dependency,
we now use that equality (a "wanted") to rewrite the work-item
constraint right away.  This avoids two dangers

 Danger 1: If we send the original constraint on down the pipeline
           it may react with an instance declaration, and in delicate
   situations (when a Given overlaps with an instance) that
   may produce new insoluble goals: see Trac #4952

 Danger 2: If we don't rewrite the constraint, it may re-react
           with the same thing later, and produce the same equality
           again --> termination worries.

To achieve this required some refactoring of FunDeps.lhs (nicer
now!).

This patch also contains a couple of unrelated improvements

* A bad bug in TcSMonad.nestImplicTcS whereby the Tcs tyvars
  of an outer implication were not untouchable inside

* Improved logging machinery for the type constraint solver;
  use -ddump-cs-trace (probably with a wider default line width
  -dppr-cols=200 or something)
compiler/main/DynFlags.hs
compiler/typecheck/TcCanonical.lhs
compiler/typecheck/TcInteract.lhs
compiler/typecheck/TcRnTypes.lhs
compiler/typecheck/TcSMonad.lhs
compiler/types/FunDeps.lhs