
#12881: GHC 8.0.2 regression involving OVERLAP annotations -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: Type: bug | Status: new Priority: high | Milestone: 8.0.2 Component: Compiler | Version: 8.0.2-rc1 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: | -------------------------------------+------------------------------------- @@ -16,0 +16,15 @@ + {{{ + $ /opt/ghc/8.0.2/bin/ghc Bug.hs + [1 of 1] Compiling Bug ( Bug.hs, Bug.o ) + + Bug.hs:9:10: error: + • Overlapping instances for Arbitrary Int + arising from a use of ‘Bug.$dmshrink’ + Matching instances: + instance Arbitrary a -- Defined at Bug.hs:8:10 + instance Arbitrary Int -- Defined at Bug.hs:9:10 + • In the expression: Bug.$dmshrink @Int + In an equation for ‘shrink’: shrink = Bug.$dmshrink @Int + In the instance declaration for ‘Arbitrary Int’ + }}} + New description: `quickcheck-combinators-0.0.1` fails to build with GHC 8.0.2-rc1 (but does build with GHC 8.0.1) due to this issue. Here is a simplified example: {{{#!hs {-# LANGUAGE FlexibleInstances #-} module Bug where class Arbitrary a where shrink :: a -> [a] shrink _ = [] instance Arbitrary a instance Arbitrary Int }}} {{{ $ /opt/ghc/8.0.2/bin/ghc Bug.hs [1 of 1] Compiling Bug ( Bug.hs, Bug.o ) Bug.hs:9:10: error: • Overlapping instances for Arbitrary Int arising from a use of ‘Bug.$dmshrink’ Matching instances: instance Arbitrary a -- Defined at Bug.hs:8:10 instance Arbitrary Int -- Defined at Bug.hs:9:10 • In the expression: Bug.$dmshrink @Int In an equation for ‘shrink’: shrink = Bug.$dmshrink @Int In the instance declaration for ‘Arbitrary Int’ }}} Is this expected? If so, we should make a note of this in the 8.0.2 release notes. -- Comment (by RyanGlScott): Making this even stranger, if you explicitly implement `shrink`: {{{#!hs {-# LANGUAGE FlexibleInstances #-} module Bug where class Arbitrary a where shrink :: a -> [a] shrink _ = [] instance Arbitrary a where shrink _ = [] instance Arbitrary Int where shrink _ = [] }}} then it compiles and both versions of GHC 8.0. However, when you try something like this (which is basically what happens under the hood with default class method implementations): {{{#!hs {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Bug where class Arbitrary a where shrink :: a -> [a] shrink _ = [] instance Arbitrary a where shrink = dmshrink @a instance Arbitrary Int where shrink = dmshrink @Int dmshrink :: Arbitrary a => a -> [a] dmshrink _ = [] }}} Then this will fail to compile on GHC 8.0.1 //and// GHC 8.0.2. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12881#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler