
#11793: Confusing type error from constrained class method -------------------------------------+------------------------------------- Reporter: gridaphobe | Owner: Type: bug | Status: new Priority: normal | Milestone: 8.0.1 Component: Compiler | Version: 8.0.1-rc2 Resolution: | Keywords: error-message Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect | Unknown/Multiple warning at compile-time | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): The original issue was this. Haskell has always allowed you to write {{{ class C a where foo :: forall b. Ord b => blah }}} (I'm using an explicit forall, which original Haskell didn't, but only to stress where the quantification is.) But Haskell 98 did not allow {{{ class C a where foo :: Ord a => blah }}} which added an extra constraint on the class variable 'a'. This was not checked by GHC 7.10, see #7854. I added the test in `f66e0e6`. But if we have implicit params should we allow {{{ class C a where foo :: ?x::Int => a -> a }}} Presumably yes. So give a constraint with free tyvars `pred_tvs`, the test should perhaps be * `pred_tvs` is not empty, and * All of the `pred_tvs` are class variables Under those circumstances, reject, unless `ConstrainedClassMethods` is on. I'll do that; it's easy. Simon GHC has no truck with such restrictions, hence the extension. But when you don't have the extension on -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11793#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler