Type class dictionary call loops at runtime
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)