[Git][ghc/ghc][wip/sand-witch/pattern- at a-binders] Type patterns (#22478, #18986)
Andrei Borzenkov (@sand-witch)
gitlab at gitlab.haskell.org
Thu Jul 13 11:54:58 UTC 2023
Andrei Borzenkov pushed to branch wip/sand-witch/pattern- at a-binders at Glasgow Haskell Compiler / GHC
Commits:
afdf646b by Andrei Borzenkov at 2023-07-13T15:54:29+04:00
Type patterns (#22478, #18986)
Improved name resolution and type checking of type patterns in constructors:
1. HsTyPat: a new dedicated data type that represents type patterns in
HsConPatDetails instead of reusing HsPatSigType
2. rnHsTyPat: a new function that renames a type
pattern and collects its binders into three groups:
- explicitly bound type variables, excluding locally bound
variables
- implicitly bound type variables from kind signatures
(only if ScopedTypeVariables are enabled)
- named wildcards (only from kind signatures)
2a. rnHsPatSigTypeBindingVars: removed in favour of rnHsTyPat
2b. rnImplcitTvBndrs: removed because no longer needed
3. collect_pat: updated to collect type variable binders from type patterns
(this means that types and terms use the same infrastructure to detect
conflicting bindings, unused variables and name shadowing)
3a. CollVarTyVarBinders: a new CollectFlag constructor that enables
collection of type variables
4. tcHsTyPat: a new function that typechecks type patterns, capable of
handling polymorphic kinds.
See Note [Type patterns: binders and unifiers]
Examples of code that is now accepted:
f = \(P @a) -> \(P @a) -> ... -- triggers -Wname-shadowing
g :: forall a. Proxy a -> ...
g (P @a) = ... -- also triggers -Wname-shadowing
h (P @($(TH.varT (TH.mkName "t")))) = ...
-- t is bound at splice time
j (P @(a :: (x,x))) = ... -- (x,x) is no longer rejected
data T where
MkT :: forall (f :: forall k. k -> Type).
f Int -> f Maybe -> T
k :: T -> ()
k (MkT @f (x :: f Int) (y :: f Maybe)) = ()
-- f :: forall k. k -> Type
Examples of code that is rejected with better error messages:
f (Left @a @a _) = ...
-- new message:
-- • Conflicting definitions for ‘a’
-- Bound at: Test.hs:1:11
-- Test.hs:1:14
Examples of code that is now rejected:
{-# OPTIONS_GHC -Werror=unused-matches #-}
f (P @a) = ()
-- Defined but not used: type variable ‘a’
- - - - -
30 changed files:
- compiler/GHC/Hs/Instances.hs
- compiler/GHC/Hs/Pat.hs
- compiler/GHC/Hs/Type.hs
- compiler/GHC/Hs/Utils.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/Iface/Ext/Ast.hs
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Parser/Types.hs
- compiler/GHC/Rename/HsType.hs
- compiler/GHC/Rename/Pat.hs
- compiler/GHC/Rename/Splice.hs
- compiler/GHC/Rename/Splice.hs-boot
- compiler/GHC/Rename/Utils.hs
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Errors/Types.hs
- compiler/GHC/Tc/Gen/HsType.hs
- compiler/GHC/Tc/Gen/Pat.hs
- compiler/GHC/Tc/Utils/TcMType.hs
- compiler/GHC/ThToHs.hs
- compiler/GHC/Types/Error/Codes.hs
- compiler/GHC/Types/Name/Reader.hs
- compiler/Language/Haskell/Syntax/Extension.hs
- compiler/Language/Haskell/Syntax/Pat.hs
- compiler/Language/Haskell/Syntax/Type.hs
- testsuite/tests/gadt/T18191.stderr
- + testsuite/tests/rename/should_compile/T22478a.hs
- testsuite/tests/rename/should_compile/all.T
- + testsuite/tests/rename/should_fail/T22478b.hs
- + testsuite/tests/rename/should_fail/T22478b.stderr
- + testsuite/tests/rename/should_fail/T22478d.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/afdf646bde071702275037855b6a7ea5ea6648c5
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/afdf646bde071702275037855b6a7ea5ea6648c5
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20230713/6793284b/attachment.html>
More information about the ghc-commits
mailing list