
#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 AntC): Replying to [comment:3 baramoglo]:
Here is an example that exhibits the same bug (I think) in a single file:
... Prints `Just A` when compiled with `-O0` and `Nothing` when compiled with `-O1`.
I agree the optimisation level shouldn't change the behaviour when everything's in a single module.
Note that the first instance should really say `{-# OVERLAPPABLE #-}` (AFAIU). If I change to that, the bug goes away.
Ugh! Strictly speaking, the second and third instances are `INCOHERENT` because in no substitution ordering. But your `project (B A) :: Maybe A`, by giving a type annotation means it's apart from the second instance. (It should resolve to the third, which is marked `OVERLAPPING` so that's OK against the other eligible instance, i.e. the first one.)
Let me know if you think this should be filed as a different bug.
The O.P. is a classic 'Orphan Instances' problem, so expected behaviour. And as Simon's comment:2 says, use `OVERLAPPABLE` to avoid premature instance resolution in the imported module. I'm surprised that also seems to be required when in a single module. That seems too subtle for my liking. BTW what happens if you change all the pragmas to `OVERLAPS`? (That's supposed to give the effect of both `OVERLAPPING` and `OVERLAPPABLE`.) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15135#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler