• Richard Eisenberg's avatar
    Fix #16517 by bumping the TcLevel for method sigs · a22e51ea
    Richard Eisenberg authored
    There were actually two bugs fixed here:
    
    1. candidateQTyVarsOfType needs to be careful that it does not
       try to zap metavariables from an outer scope as "naughty"
       quantification candidates. This commit adds a simple check
       to avoid doing so.
    
    2. We weren't bumping the TcLevel in kcHsKindSig, which was used
       only for class method sigs. This mistake led to the acceptance
       of
    
         class C a where
           meth :: forall k. Proxy (a :: k) -> ()
    
       Note that k is *locally* quantified. This patch fixes the
       problem by using tcClassSigType, which correctly bumps the
       level. It's a bit inefficient because tcClassSigType does other
       work, too, but it would be tedious to repeat much of the code
       there with only a few changes. This version works well and is
       simple.
    
    And, while updating comments, etc., I noticed that tcRnType was
    missing a pushTcLevel, leading to #16767, which this patch also
    fixes, by bumping the level. In the refactoring here, I also
    use solveEqualities. This initially failed ghci/scripts/T15415,
    but that was fixed by teaching solveEqualities to respect
    -XPartialTypeSignatures.
    
    This patch also cleans up some Notes around error generation that
    came up in conversation.
    
    Test case: typecheck/should_fail/T16517, ghci/scripts/T16767
    a22e51ea
TcTyClsDecls.hs 169 KB