content: {-# LANGUAGE FlexibleInstances #-}
  
  -- A very delicate interaction of overlapping instances
  
  module T5051 where
  
  data T = T deriving( Eq, Ord )
  instance {-# OVERLAPPING #-} Eq [T] 
  
  foo :: Ord a => [a] -> Bool
  foo x = x >= x
  
  -- Bizarrely, the defn of 'foo' failed in GHC 7.0.3 with
  -- T5051.hs:14:10:
  --    Overlapping instances for Eq [a]
  --      arising from a use of `>'
  --    Matching instances:
  --      instance Eq a => Eq [a] -- Defined in GHC.Classes
  --      instance [overlap ok] Eq [T] -- Defined at T5051.hs:9:10-15
  --    (The choice depends on the instantiation of `a'
  --     To pick the first instance above, use -XIncoherentInstances
  --     when compiling the other instance declarations)
  --    In the expression: x > x
  --
  -- Reason: the dfun for Ord [a] (in the Prelude) had a "silent"
  -- superclass parameter, thus
  --     $dfOrdList :: forall a. (Eq [a], Ord a) => Ord [a]
  -- Using the dfun means we need Eq [a], and that gives rise to the
  -- overlap error.
  --
  -- This is terribly confusing: the use of (>=) means we need Ord [a],
  -- and if we have Ord a (which we do) we should be done.
  -- A very good reason for not having silent parameters!
  -- But, alas, we need them!
  --
  -- Dec 14: now we don't have them any more, the test passes!
  