
#13018: TH-spliced pattern synonym declaration fails to typecheck -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.0.1 checker) | Keywords: Resolution: | PatternSynonyms Operating System: Unknown/Multiple | Architecture: Type of failure: GHC rejects | Unknown/Multiple valid program | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): From a quick investigation, the problematic code seems to be [http://git.haskell.org/ghc.git/blob/41ade95c068e77b916ff17865515eadb353a2358... repHsPatSynSigType] in `DsMeta`: {{{#!hs repHsPatSynSigType :: LHsSigType Name -> DsM (Core TH.TypeQ) repHsPatSynSigType (HsIB { hsib_vars = implicit_tvs , hsib_body = body }) = addTyVarBinds (newTvs (impls ++ univs)) $ \th_univs -> addTyVarBinds (newTvs exis) $ \th_exis -> do { th_reqs <- repLContext reqs ; th_provs <- repLContext provs ; th_ty <- repLTy ty ; repTForall th_univs th_reqs =<< (repTForall th_exis th_provs th_ty) } where impls = map (noLoc . UserTyVar . noLoc) implicit_tvs newTvs tvs = HsQTvs { hsq_implicit = [] , hsq_explicit = tvs , hsq_dependent = emptyNameSet } (univs, reqs, exis, provs, ty) = splitLHsPatSynTy body }}} In this particular example, all of `univs`, `reqs`, `exis`, and `provs` are `[]`. But `impls` is `[b,a]`, which causes `th_univs` to be `[b,a]` as well. In other words, that's why we see the incorrect `forall b a. forall. b -> T a` type signature. Is there a way to partition up `impls` to get `a` in `th_univs` and `b` in `th_exis`? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13018#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler