Skip to content
Snippets Groups Projects
Forked from Glasgow Haskell Compiler / GHC
Source project has a limited visibility.
  • Richard Eisenberg's avatar
    aed1974e
    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
    History
    Refactor the treatment of loopy superclass dicts
    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.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.