#5051: Typechecker behaviour change
---------------------------+------------------------------------------------
  Reporter:  igloo         |          Owner:  simonpj         
      Type:  bug           |         Status:  closed          
  Priority:  high          |      Milestone:  7.2.1           
 Component:  Compiler      |        Version:  7.0.2           
Resolution:  fixed         |       Keywords:                  
  Testcase:                |      Blockedby:                  
Difficulty:                |             Os:  Unknown/Multiple
  Blocking:                |   Architecture:  Unknown/Multiple
   Failure:  None/Unknown  |  
---------------------------+------------------------------------------------
Changes (by simonpj):

 * cc: mechvel@… (added)
  * status:  new => closed
  * resolution:  => fixed


Comment:

 GHC 7 indeed falls over on `DoCon` 2.12.  It turns out to be a rather
 subtle interaction of overlapping instances with the ill-fated "silent
 superclass parameters" I introduced to solve a problem in the
 typechecker's constraint solver.

 The problem is demonstrated in minature by test `T5051`, which I have
 added to the test suite, and I reproduce below for completeness.

 Happily, silent parameters aren't needed any more (we solve the problem in
 another nicer way), so this patch removes them
 {{{
 commit a9d48fd94ae92b979610f5efe5d66506928118eb
 Author: Simon Peyton Jones <simo...@microsoft.com>
 Date:   Wed Jun 22 11:46:03 2011 +0100

     Remove "silent superclass parameters"

     We introduced silent superclass parameters as a way to avoid
     superclass loops, but we now solve that problem a different
     way ("derived" superclass constraints carry no evidence). So
     they aren't needed any more.

     Apart from being a needless complication, they broke DoCon.
     Admittedly in a very obscure way, but still the result is
     hard to explain. To see the details see Trac #5051, with
     test case typecheck/should_compile/T5051.  (The test is
     nice and small!)

  compiler/basicTypes/Id.lhs                   |    7 +-
  compiler/basicTypes/IdInfo.lhs               |   12 +--
  compiler/basicTypes/MkId.lhs                 |   17 +--
  compiler/coreSyn/CoreSyn.lhs                 |    2 -
  compiler/coreSyn/CoreUnfold.lhs              |    1 -
  compiler/coreSyn/CoreUtils.lhs               |    2 +-
  compiler/coreSyn/PprCore.lhs                 |    1 -
  compiler/iface/BinIface.hs                   |    8 +-
  compiler/iface/IfaceSyn.lhs                  |    4 +-
  compiler/iface/MkIface.lhs                   |    2 +-
  compiler/iface/TcIface.lhs                   |    5 +-
  compiler/typecheck/TcErrors.lhs              |   12 +--
  compiler/typecheck/TcInstDcls.lhs            |  163
 ++++++++++----------------
  compiler/typecheck/TcInteract.lhs            |   77 ++++--------
  compiler/typecheck/TcMType.lhs               |   22 +----
  compiler/types/InstEnv.lhs                   |   13 +--
  compiler/vectorise/Vectorise/Type/PADict.hs  |   73 +++++-------
  compiler/vectorise/Vectorise/Type/PRepr.hs   |   28 ++++-
  compiler/vectorise/Vectorise/Utils/PADict.hs |   16 +---
  19 files changed, 165 insertions(+), 300 deletions(-)
 }}}
 The fix will be be in GHC 7.2, but probably not in GHC 7.0.  I've verified
 that 7.2 can compile DoCon 2.12 and run the `demotest`.

 Here's the tiny test
 {{{
 {-# LANGUAGE FlexibleInstances, OverlappingInstances #-}

 -- A very delicate interaction of overlapping instances

 module T5051 where

 data T = T deriving( Eq, Ord )
 instance 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!
 }}}

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

_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to