
#11224: Program doesn't preserve semantics after pattern synonym inlining. -------------------------------------+------------------------------------- Reporter: anton.dubovik | Owner: Type: bug | Status: new Priority: highest | Milestone: 8.0.1 Component: Compiler | Version: 7.10.2 Resolution: | Keywords: | PatternSynonyms Operating System: Windows | Architecture: x86_64 Type of failure: Incorrect result | (amd64) at runtime | Test Case: Blocked By: | Blocking: Related Tickets: #11225 | Differential Rev(s): Phab:D1632 Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): OK, back to this ticket. I think we were just getting ourselves confused. * The type of `PRead` is definitely {{{ pattern PRead :: Read a => () => a -> String }}} That is, `(Read a)` is required (to perform the match), not provided (by being bound by the match). And `a` is certainly not existential. * The existential type variables are simply the ones bound existentially by the actual pattern. As Matthew says, we can't work out which ones they are by looking at the type (that was a hefalump trap, which I fell into). In this example, there are no existential variables. * We have a perfectly good function that discovers which the existential variables are, called `tcCollectEx`. It's used in the inference case and we can certainly use it in the checking case too. * Since we can't tell which is which before `tcCheckPatSyn`, we should not split them up in `TcBinds.tcTySig`. They can all be in one list in the `TPSI` record. * Looking at `tcCheckPatSyn` it's a good deal more complicated than necessary. I'll fix that. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11224#comment:22 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler