• Ryan Scott's avatar
    Use splitLHs{ForAll,Sigma}TyInvis throughout the codebase · 1132602f
    Ryan Scott authored
    Richard points out in #17688 that we use `splitLHsForAllTy` and
    `splitLHsSigmaTy` in places that we ought to be using the
    corresponding `-Invis` variants instead, identifying two bugs
    that are caused by this oversight:
    
    * Certain TH-quoted type signatures, such as those that appear in
      quoted `SPECIALISE` pragmas, silently turn visible `forall`s into
      invisible `forall`s.
    * When quoted, the type `forall a -> (a ~ a) => a` will turn into
      `forall a -> a` due to a bug in `DsMeta.repForall` that drops
      contexts that follow visible `forall`s.
    
    These are both ultimately caused by the fact that `splitLHsForAllTy`
    and `splitLHsSigmaTy` split apart visible `forall`s in addition to
    invisible ones. This patch cleans things up:
    
    * We now use `splitLHsForAllTyInvis` and `splitLHsSigmaTyInvis`
      throughout the codebase. Relatedly, the `splitLHsForAllTy` and
      `splitLHsSigmaTy` have been removed, as they are easy to misuse.
    * `DsMeta.repForall` now only handles invisible `forall`s to reduce
      the chance for confusion with visible `forall`s, which need to be
      handled differently. I also renamed it from `repForall` to
      `repForallT` to emphasize that its distinguishing characteristic
      is the fact that it desugars down to `L.H.TH.Syntax.ForallT`.
    
    Fixes #17688.
    1132602f
TcBinds.hs 71.7 KB