
#14498: GHC internal error: "not in scope during TC but it passed the renamer" -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.2.1 checker) | Keywords: Resolution: | PatternSynonyms Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: #14288 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj):
I thus claim that bringing existentials into scope in pattern synonyms is indeed useful.
I disagree. If you try to do this there is nothing to stop you using the existential variable in place where it really isn't in scope. Eg. {{{ pattern Q :: () => forall a. C a => Int -> G a -> (Int,Ex) pattern Q y x <- (y::a, MkEx _ (meth @a -> x)) }}} Now this is a bit stupid because `y::Int`, but it really should not be possible to refer to the existential `a` except underneath the appropriate pattern match. There may be many, possibly nested or possibly peer, existential patterns in a single pattern synonym. Moreover in terms we are content to be stuck with the choice of {{{ f x = case x of { MkEx (_ :: Proxy a) (meth @a -> x) -> ... } }}} Again we can only bring `a` into scope under the match. Maybe we'll add visible (existential) type application in patterns like this {{{ f x = case x of { MkEx @a _ (meth @a -> x) -> ... } }}} in which case that'll work in both cases. No no no. The more I think about this the more I'm convinced that the existentials absolutely should not scope, contrary to my original comment:1. Richard, do you agree? Then we can implement it. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14498#comment:16 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler