Skip to content
  • Simon Peyton Jones's avatar
    Fix floating of equalities · 594879dc
    Simon Peyton Jones authored
    This rather subtle patch fixes Trac #14584.  The problem was
    that we'd allowed a coercion, bound in a nested scope, to escape
    into an outer scope.
    
    The main changes are
    
    * TcSimplify.floatEqualities takes more care when floating
      equalities to make sure we don't float one out that mentions
      a locally-bound coercion.
      See Note [What prevents a constraint from floating]
    
    * TcSimplify.emitResidualConstraints (which emits the residual
      constraints in simplifyInfer) now avoids burying the constraints
      for escaping CoVars inside the implication constraint.
    
    * Since I had do to this stuff with CoVars, I moved the
      fancy footwork about not quantifying over CoVars from
      TcMType.quantifyTyVars to its caller
      TcSimplify.decideQuantifiedTyVars.  I think its other
      callers don't need to worry about all this CoVar stuff.
    
    This turned out to be surprisigly tricky, and took me a solid
    day to get right.  I think the result is reasonably neat, though,
    and well documented with Notes.
    
    (cherry picked from commit f5cf9d1a)
    594879dc