
#15135: Overlapping typeclass instance selection depends on the optimisation level -------------------------------------+------------------------------------- Reporter: nicuveo | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.8.1 Component: Compiler | Version: 8.4.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): This is all caused by `-fsolve-constant-dicts`: see [http://downloads.haskell.org/~ghc/master/users-guide/using- optimisation.html#ghc-flag--fsolve-constant-dicts the manual], and Trac #12791 and #5835. The reason that behaviour differs with -O is because `-fsolve-constant- dicts` is implied by `-O`. The problem comes in {{{ instance Project a b => Project a (B b) where project (B a) = project a }}} From the RHS we get {{{ [W] Project a b }}} Shall we solve it from the dict passed into the instance? Or from the top-level instance declaration? {{{ instance {-# OVERLAPPING #-} Project a b where project _ = Nothing }}} With `-fsolve-constant-dicts`, GHC chooses the latter, wrongly. When you declare that instance as OVERLAPPABLE, thus {{{ instance {-# OVERLAPPABLE #-} Project a b where project _ = Nothing }}} GHC carefully refrains from using it, precisely because it might be overlapped (Trac #14434). Sadly, ''any'' instance declaration can be overlapped; GHC gives no way to say "this instance declaration cannot and must not be overlapped". Instead, in the presence of overlapping instances, the soundness of `-fsolve-constant-dicts` relies on the user specifying that an instance can be overlapped, by saying OVERLAPPABLE. This is terribly unsatisfactory, but at least we now understand what is going on. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15135#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler