Skip to content

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...

Edited by Simon Marlow
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information