Implement unboxed sum primitive type
[ghc.git] / testsuite / tests / unboxedsums / unboxedsums1.hs
1 {-# LANGUAGE UnboxedSums, MagicHash #-}
2
3 module Main where
4
5 import GHC.Prim
6 import GHC.Types
7
8 import System.Mem (performMajorGC)
9
10 type Either1 a b = (# a | b #)
11
12 showEither1 :: (Show a, Show b) => Either1 a b -> String
13 showEither1 (# left | #) = "Left " ++ show left
14 showEither1 (# | right #) = "Right " ++ show right
15
16 showEither2 :: (# Int# | Float# #) -> String
17 showEither2 (# i | #) = "Left " ++ show (I# i)
18 showEither2 (# | f #) = "Right " ++ show (F# f)
19
20 showEither3 :: Show a => (# a | Int# #) -> String
21 showEither3 (# a | #) = "Left " ++ show a
22 showEither3 (# | i #) = "Right " ++ show (I# i)
23
24 type T = (# Int | Bool | String | Char | Either Int Bool | Int# | Float# #)
25
26 showEither4 :: T -> String
27 showEither4 (# i | | | | | | #) = "Alt0: " ++ show i
28 showEither4 (# | b | | | | | #) = "Alt1: " ++ show b
29 showEither4 (# | | s | | | | #) = "Alt2: " ++ show s
30 showEither4 (# | | | c | | | #) = "Alt3: " ++ show c
31 showEither4 (# | | | | e | | #) = "Alt4: " ++ show e
32 showEither4 (# | | | | | i | #) = "Alt5: " ++ show (I# i)
33 showEither4 (# | | | | | | f #) = "Alt6: " ++ show (F# f)
34
35 main :: IO ()
36 main = do
37 putStrLn (showEither1 e1_1)
38 putStrLn (showEither1 e1_2)
39 putStrLn (showEither2 e2_1)
40 putStrLn (showEither2 e2_2)
41 putStrLn (showEither3 e3_1)
42 putStrLn (showEither3 e3_2)
43
44 putStrLn (showEither4 e4_1)
45 putStrLn (showEither4 e4_2)
46 putStrLn (showEither4 e4_3)
47 putStrLn (showEither4 e4_4)
48 putStrLn (showEither4 e4_5)
49 putStrLn (showEither4 e4_6)
50 putStrLn (showEither4 e4_7)
51
52 -- make sure we don't put pointers to non-pointer slots
53 performMajorGC
54
55 -- make sure pointers in unboxed sums are really roots
56 putStrLn (showEither1 e1_1)
57 where
58 -- boxed types only
59 e1_1, e1_2 :: Either1 String Int
60 e1_1 = (# "error" | #)
61 e1_2 = (# | 10 #)
62
63 -- prim types only
64 e2_1, e2_2 :: (# Int# | Float# #)
65 e2_1 = (# 10# | #)
66 e2_2 = (# | 1.2# #)
67
68 -- a mix of prim and boxed types
69 e3_1, e3_2 :: (# String | Int# #)
70 e3_1 = (# "OK" | #)
71 e3_2 = (# | 123# #)
72
73 -- big arity
74 e4_1, e4_2, e4_3, e4_4, e4_5, e4_6, e4_7 :: T
75 e4_1 = (# 10 | | | | | | #)
76 e4_2 = (# | False | | | | | #)
77 e4_3 = (# | | "ok" | | | | #)
78 e4_4 = (# | | | 'a' | | | #)
79 e4_5 = (# | | | | Right True | | #)
80 e4_6 = (# | | | | | 123# | #)
81 e4_7 = (# | | | | | | 54.3# #)