Skip to content
  • Ryan Scott's avatar
    Refactor DeriveAnyClass's instance context inference · 639e702b
    Ryan Scott authored
    Summary:
    Currently, `DeriveAnyClass` has two glaring flaws:
    
    * It only works on classes whose argument is of kind `*` or `* -> *` (#9821).
    * The way it infers constraints makes no sense. It basically co-opts the
      algorithms used to infer contexts for `Eq` (for `*`-kinded arguments) or
      `Functor` (for `(* -> *)`-kinded arguments). This tends to produce overly
      constrained instances, which in extreme cases can lead to legitimate things
      failing to typecheck (#12594). Or even worse, it can trigger GHC panics
      (#12144 and #12423).
    
    This completely reworks the way `DeriveAnyClass` infers constraints to fix
    these two issues. It now uses the type signatures of the derived class's
    methods to infer constraints (and to simplify them). A high-level description
    of how this works is included in the GHC users' guide, and more technical notes
    on what is going on can be found as comments (and a Note) in `TcDerivInfer`.
    
    Fixes #9821, #12144, #12423, #12594.
    
    Test Plan: ./validate
    
    Reviewers: dfeuer, goldfire, simonpj, austin, bgamari
    
    Subscribers: dfeuer, thomie
    
    Differential Revision: https://phabricator.haskell.org/D2961
    639e702b