
#12860: GeneralizedNewtypeDeriving + MultiParamTypeClasses sends typechecker into an infinite loop -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.0.1 checker) | Keywords: FunDeps, Resolution: | deriving Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): I've hit another snag, related to comment:15. I tried putting the call to `checkValidInstance` after `simplifyDeriv` has finished iterating, but that doesn't work for the original program in this ticket. Why? Because during the second iteration of `simplifyDeriv`, we pass the context `C b a` (the result of the first iteration of `simplifyDeriv`) to `solveWantedsAndDrop`. But that leads to the infinite loop described in comment:2, so it's already too late by that point. Naturally, I thought to instead try calling `checkValidInstance` after //every// iteration of `simplifyDeriv`. This does fix the original program, but it causes `T4809.hs` to fail instead. The reason is because of this derived instance: {{{#!hs newtype XMLGenT m a = XMLGenT (m a) deriving (MonadRWS r w s) }}} After the first iteration of `simplifyDeriv`, it produces the context `Monoid w`. We then pass the following instance to `checkValidInstance`: {{{#!hs instance Monoid w => MonadRWS r w s (XMLGenT m) }}} But this doesn't satisfy the coverage condition for `MonadRWS`'s fundeps! (We need `m -> r`, `m -> w`, and `m -> s`.) The final context for this instance, `(MonadReader r m, MonadWriter w m, MonadState s m)`, //does// satisfy the coverage condition, but we don't get this until after a later iteration of `simplifyDeriv`. To sum it up: I can't call `checkValidInstance` at the end, since an intermediate context might throw the simplifier into a loop, but I can't call `checkValidInstance` in the middle either, since an intermediate context might not satisfy the coverage condition. I don't know how to proceed from here. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12860#comment:18 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler