[GHC] #10562: GHC 7.10.2 RC cannot build boolsimplifier-0.1.8

GHC ghc-devs at haskell.org
Tue Jun 23 17:08:53 UTC 2015


#10562: GHC 7.10.2 RC cannot build boolsimplifier-0.1.8
-------------------------------------+-------------------------------------
        Reporter:  snoyberg          |                   Owner:
            Type:  bug               |                  Status:  new
        Priority:  normal            |               Milestone:  7.10.2
       Component:  Compiler          |                 Version:  7.10.2-rc1
      Resolution:                    |                Keywords:
Operating System:  Linux             |            Architecture:  x86_64
 Type of failure:  GHC rejects       |  (amd64)
  valid program                      |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:                    |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by gershomb):

 So the relevant lines seem to be:


 {{{
 data QueryRep qtyp a where
     QAtom :: (Ord a) => a -> QueryRep QAtomTyp a
     QOp   :: (Show qtyp, Ord a) => Set (QueryRep QAtomTyp a) -> Set
 (QueryRep (QFlipTyp qtyp) a) -> QueryRep qtyp a

 instance (Eq a) => Eq (QueryRep qtyp a) where
     (QAtom x) == (QAtom y) = x == y
     (QOp as cs) == (QOp as' cs') = as == as' && cs == cs'
     _ == _ = False  -- can't happen

 instance (Ord a) => Ord (QueryRep qtyp a) where
     compare (QAtom x) (QAtom y) = compare x y
     compare (QOp as cs) (QOp as' cs') = compare as as' `mappend` compare
 cs cs'
     compare (QAtom _) _ = GT  -- can't happen
     compare _ _ = LT  -- can't happen

 }}}

 And the relevant error seems to be
 {{{
     Overlapping instances for Eq (QueryRep (QFlipTyp qtyp) a)
       arising from a use of ‘compare’
 }}}

 With the additional info:

 {{{
     There exists a (perhaps superclass) match:
       from the context (Eq (QueryRep qtyp a), Ord a)
         bound by the instance declaration
         at Data/BoolSimplifier.hs:116:10-41
       or from (Show qtyp, Ord a)
         bound by a pattern with constructor
                    QOp :: forall qtyp a.
                           (Show qtyp, Ord a) =>
                           Set (QueryRep QAtomTyp a)
                           -> Set (QueryRep (QFlipTyp qtyp) a) -> QueryRep
 qtyp a,
                  in an equation for ‘compare’
         at Data/BoolSimplifier.hs:118:14-22
       or from (Show qtyp, Ord a)
         bound by a pattern with constructor
                    QOp :: forall qtyp a.
                           (Show qtyp, Ord a) =>
                           Set (QueryRep QAtomTyp a)
                           -> Set (QueryRep (QFlipTyp qtyp) a) -> QueryRep
 qtyp a,
                  in an equation for ‘compare’
         at Data/BoolSimplifier.hs:118:26-36
     (The choice depends on the instantiation of ‘qtyp, a’
      To pick the first instance above, use IncoherentInstances
      when compiling the other instance declarations)
     In the second argument of ‘mappend’, namely ‘compare cs cs'’
     In the expression: compare as as' `mappend` compare cs cs'
     In an equation for ‘compare’:
         compare (QOp as cs) (QOp as' cs')
           = compare as as' `mappend` compare cs cs'
 }}}

 So what's happening is we've asserted there's an `Ord a` dictionary three
 different ways -- first and second from packing it in each of the two
 GADTs, and third from the constrain in the instance head. Interestingly,
 it doesn't seem to balk at duplicate `Ord` instances themselves, but from
 the fact that they lead to duplicate `Eq` instances.

 To be honest, I don't remember why the `Ord` constraint is ever packed
 with the GADT at all. But, regardless, this seems like something the
 compiler should be able to handle properly, and it seems like a regression
 if it can't?

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10562#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list