Skip to content

Use splitLHs{ForAll,Sigma}TyInvis throughout the codebase

Ryan Scott requested to merge wip/T17688 into master

Richard points out in #17688 (closed) 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 foralls into invisible foralls.
  • 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 foralls.

These are both ultimately caused by the fact that splitLHsForAllTy and splitLHsSigmaTy split apart visible foralls 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 foralls to reduce the chance for confusion with visible foralls, 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 (closed).

Edited by Ryan Scott

Merge request reports