Skip to content
  • Richard Eisenberg's avatar
    Kill derived constraints · e7ded241
    Richard Eisenberg authored and Matthew Pickering's avatar Matthew Pickering committed
    Co-authored by: Sam Derbyshire
    
    Previously, GHC had three flavours of constraint:
    Wanted, Given, and Derived. This removes Derived constraints.
    
    Though serving a number of purposes, the most important role
    of Derived constraints was to enable better error messages.
    This job has been taken over by the new RewriterSets, as explained
    in Note [Wanteds rewrite wanteds] in GHC.Tc.Types.Constraint.
    
    Other knock-on effects:
     - Various new Notes as I learned about under-described bits of GHC
    
     - A reshuffling around the AST for implicit-parameter bindings,
       with better integration with TTG.
    
     - Various improvements around fundeps. These were caused by the
       fact that, previously, fundep constraints were all Derived,
       and Derived constraints would get dropped. Thus, an unsolved
       Derived didn't stop compilation. Without Derived, this is no
       longer possible, and so we have to be considerably more careful
       around fundeps.
    
     - A nice little refactoring in GHC.Tc.Errors to center the work
       on a new datatype called ErrorItem. Constraints are converted
       into ErrorItems at the start of processing, and this allows for
       a little preprocessing before the main classification.
    
     - This commit also cleans up the behavior in generalisation around
       functional dependencies. Now, if a variable is determined by
       functional dependencies, it will not be quantified. This change
       is user facing, but it should trim down GHC's strange behavior
       around fundeps.
    
     - Previously, reportWanteds did quite a bit of work, even on an empty
       WantedConstraints. This commit adds a fast path.
    
     - Now, GHC will unconditionally re-simplify constraints during
       quantification. See Note [Unconditionally resimplify constraints when
       quantifying], in GHC.Tc.Solver.
    
    Close #18398.
    Close #18406.
    Solve the fundep-related non-confluence in #18851.
    Close #19131.
    Close #19137.
    Close #20922.
    Close #20668.
    Close #19665.
    
    -------------------------
    Metric Decrease:
        LargeRecord
        T9872b
        T9872b_defer
        T9872d
        TcPlugin_RewritePerf
    -------------------------
    e7ded241