Testcase for Coercible and newtype families (#8548)
authorJoachim Breitner <mail@joachim-breitner.de>
Fri, 22 Nov 2013 10:21:36 +0000 (10:21 +0000)
committerJoachim Breitner <mail@joachim-breitner.de>
Fri, 22 Nov 2013 17:54:12 +0000 (17:54 +0000)
testsuite/tests/typecheck/should_run/TcCoercible.hs
testsuite/tests/typecheck/should_run/TcCoercible.stdout

index 855a133..e3b29af 100644 (file)
@@ -1,4 +1,4 @@
-{-# LANGUAGE RoleAnnotations, StandaloneDeriving, FlexibleContexts, UndecidableInstances, GADTs #-}
+{-# LANGUAGE RoleAnnotations, StandaloneDeriving, FlexibleContexts, UndecidableInstances, GADTs, TypeFamilies #-}
 
 import GHC.Prim (Coercible, coerce)
 import Data.Monoid (mempty, First(First), Last())
@@ -31,6 +31,10 @@ data Oracle where Oracle :: Coercible (Fix (Either Age)) (Fix  (Either Int)) =>
 foo :: Oracle -> Either Age (Fix (Either Age)) -> Fix (Either Int)
 foo Oracle = coerce
 
+-- This ensures that Coercible looks into newtype instances (#8548)
+data family Fam k
+newtype instance Fam Int = FamInt Bool deriving Show
+
 main = do
     print (coerce $ one                       :: Age)
     print (coerce $ age                       :: Int)
@@ -58,6 +62,9 @@ main = do
     print (coerce $ (FixEither (Left age) :: FixEither Age) :: Either Int (FixEither Int))
     print (coerce $ (Left one :: Either Int (FixEither Age)) :: FixEither Age)
 
+    print (coerce $ True :: Fam Int)
+    print (coerce $ FamInt True :: Bool)
+
     foo `seq` return ()