Skip to content
  • Richard Eisenberg's avatar
    Refactor the treatment of loopy superclass dicts · aed1974e
    Richard Eisenberg authored and Simon Peyton Jones's avatar Simon Peyton Jones committed
    This patch completely re-engineers how we deal with loopy superclass
    dictionaries in instance declarations. It fixes #20666 and #19690
    
    The highlights are
    
    * Recognise that the loopy-superclass business should use precisely
      the Paterson conditions.  This is much much nicer.  See
      Note [Recursive superclasses] in GHC.Tc.TyCl.Instance
    
    * With that in mind, define "Paterson-smaller" in
      Note [Paterson conditions] in GHC.Tc.Validity, and the new
      data type `PatersonSize` in GHC.Tc.Utils.TcType, along with
      functions to compute and compare PatsonSizes
    
    * Use the new PatersonSize stuff when solving superclass constraints
      See Note [Solving superclass constraints] in GHC.Tc.TyCl.Instance
    
    * In GHC.Tc.Solver.Monad.lookupInInerts, add a missing call to
      prohibitedSuperClassSolve.  This was the original cause of #20666.
    
    * Treat (TypeError "stuff") as having PatersonSize zero. See
      Note [Paterson size for type family applications] in GHC.Tc.Utils.TcType.
    
    * Treat the head of a Wanted quantified constraint in the same way
      as the superclass of an instance decl; this is what fixes #19690.
      See GHC.Tc.Solver.Canonical Note [Solving a Wanted forall-constraint]
      (Thanks to Matthew Craven for this insight.)
    
      This entailed refactoring the GivenSc constructor of CtOrigin a bit,
      to say whether it comes from an instance decl or quantified constraint.
    
    * Some refactoring way in which redundant constraints are reported; we
      don't want to complain about the extra, apparently-redundant
      constraints that we must add to an instance decl because of the
      loopy-superclass thing.  I moved some work from GHC.Tc.Errors to
      GHC.Tc.Solver.
    
    * Add a new section to the user manual to describe the loopy
      superclass issue and what rules it follows.
    aed1974e