Strictness bug with existential contexts on data constructors
The following:
{-# LANGUAGE ExistentialQuantification #-}
module Main (main) where
main :: IO ()
main = r `seq` return ()
r :: Rec
r = Rec{ a = error "xxx", b = 3, c = True }
class C t
instance C Bool
data Rec = forall t. C t => Rec
{ a :: ()
, b :: !Int
, c :: t
}
Should succeed, but fails with error "xxx"
(but only when compiled with -O
). The problem is that the strictness signature for the data con wrapper doesn't take into account the dictionary fields.
I have a patch which I'll upload to Phabricator shortly...