Opened 2 years ago

Closed 18 months ago

#5913 closed bug (fixed)

Type class dictionary call loops at runtime

Reported by: mnislaih Owned by:
Priority: normal Milestone: 7.6.2
Component: Compiler Version: 7.4.1
Keywords: Cc: emax@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Runtime crash Difficulty: Unknown
Test Case: typecheck/should_run/T5913 Blocked By:
Blocking: Related Tickets:

Description (last modified by mnislaih)

The following code works fine in 7.0.3 but crashes at runtime with <loop> in 7.2.x and 7.4.1 :

{-# LANGUAGE UndecidableInstances #-}


class         L0 a where l0 :: a -> a
class L0 a => L1 a where l1 :: a -> a
class L1 a => L2 a where l2 :: a -> a


data Worksfine = Worksfine deriving Show
instance                                   L0 Worksfine where l0 = id
instance                                   L1 Worksfine where l1 = l2
instance {- undecidable -} L1 Worksfine => L2 Worksfine where l2 = l0


data WorksfineToo = WorksfineToo deriving Show
instance                                      L0 WorksfineToo where l0 = id
instance {- undecidable -} L2 WorksfineToo => L1 WorksfineToo where l1 = l2
instance {- undecidable -} L1 WorksfineToo => L2 WorksfineToo where l2 = id


-- l1 LoopsAtRuntime = <loop>
-- l2 LoopsAtRuntime = <loop>
data LoopsAtRuntime = LoopsAtRuntime deriving Show
instance                                        L0 LoopsAtRuntime where l0 = id
instance {- undecidable -} L2 LoopsAtRuntime => L1 LoopsAtRuntime where l1 = l2
instance {- undecidable -} L1 LoopsAtRuntime => L2 LoopsAtRuntime where l2 = l0

main = do
  print (l1 WorksfineToo)
  print (l2 WorksfineToo)
  print (l1 LoopsAtRuntime)
  print (l2 LoopsAtRuntime)

Change History (6)

comment:1 Changed 2 years ago by mnislaih

  • Description modified (diff)

comment:2 Changed 2 years ago by baramoglo

  • Cc emax@… added

comment:3 Changed 2 years ago by simonpj

  • Difficulty set to Unknown

I think this is another example of #5751. I know how to fix it but am hoping to wait until after the Haskell Symposium deadline (2 June).

comment:4 Changed 22 months ago by pcapriotti

  • Milestone set to 7.6.1

comment:5 Changed 19 months ago by igloo

  • Milestone changed from 7.6.1 to 7.6.2

comment:6 Changed 18 months ago by simonpj

  • Resolution set to fixed
  • Status changed from new to closed
  • Test Case set to typecheck/should_run/T5913

Fixed by the silent-superclass patch.

commit aa1e0976055e89ee20cb4c393ee05a33d670bc5d
Author: Simon Peyton Jones <simonpj@microsoft.com>
Date:   Sun May 27 22:31:43 2012 +0100

    Add silent superclass parameters (again)
    
    Silent superclass parameters solve the problem that
    the superclasses of a dicionary construction can easily
    turn out to be (wrongly) bottom.  The problem and solution
    are described in
       Note [Silent superclass arguments] in TcInstDcls
Note: See TracTickets for help on using tickets.