summaryrefslogtreecommitdiff
path: root/testsuite/tests/gadt/set.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/gadt/set.hs')
-rw-r--r--testsuite/tests/gadt/set.hs45
1 files changed, 45 insertions, 0 deletions
diff --git a/testsuite/tests/gadt/set.hs b/testsuite/tests/gadt/set.hs
new file mode 100644
index 0000000000..3a78bbb64b
--- /dev/null
+++ b/testsuite/tests/gadt/set.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE GADTs #-}
+
+-- Provoked by
+-- http://www.haskell.org/pipermail/haskell-cafe/2007-January/021086.html
+
+module ShouldCompile where
+
+import Data.Set as Set
+
+data Teq a b where Teq :: Teq a a
+
+---------------------
+data SetM1 a where
+ SM1 :: Ord w => Teq w a -> Set.Set w -> SetM1 a
+
+unionA1 :: SetM1 a -> SetM1 a -> SetM1 a
+unionA1 (SM1 Teq m1) (SM1 Teq m2)
+ = SM1 Teq (m1 `Set.union` m2)
+
+unionB1 :: SetM1 a -> SetM1 a -> SetM1 a
+unionB1 (SM1 p1 m1) (SM1 p2 m2)
+ = case p1 of Teq -> case p2 of Teq -> SM1 Teq (m1 `Set.union` m2)
+
+unionC1 :: SetM1 a -> SetM1 a -> SetM1 a
+unionC1 (SM1 p1 m1) (SM1 p2 m2)
+ = case (p1,p2) of (Teq,Teq) -> SM1 Teq (m1 `Set.union` m2)
+
+
+---------------------
+data SetM2 a where
+ SM2 :: Ord w => Teq a w -> Set.Set w -> SetM2 a
+ -- Different order of args in Teq
+
+unionA2 :: SetM2 a -> SetM2 a -> SetM2 a
+unionA2 (SM2 Teq m1) (SM2 Teq m2)
+ = SM2 Teq (m1 `Set.union` m2)
+
+unionB2 :: SetM2 a -> SetM2 a -> SetM2 a
+unionB2 (SM2 p1 m1) (SM2 p2 m2)
+ = case p1 of Teq -> case p2 of Teq -> SM2 Teq (m1 `Set.union` m2)
+
+unionC2 :: SetM2 a -> SetM2 a -> SetM2 a
+unionC2 (SM2 p1 m1) (SM2 p2 m2)
+ = case (p1,p2) of (Teq,Teq) -> SM2 Teq (m1 `Set.union` m2)
+