Ticket #2130: A.hs

File A.hs, 2.9 KB (added by dons, 6 years ago)

Test case

Line 
1{-# OPTIONS -fglasgow-exts #-}
2
3module M where
4
5import Data.Word
6import Control.Monad
7import GHC.Word
8import GHC.Exts
9
10{-
11-- This code is fine:
12
13ok :: Word -> Bool
14ok c = c < 1
15
16ok' :: Word -> Bool
17ok' c | c < 1  = True
18      | otherwise = False
19-}
20
21-- This code generates ugly results:
22-- Int types here are also fine.
23
24bad :: Word -> Bool
25bad c | c < 1     = True
26      | c < 2     = True
27      | otherwise = False
28
29{-
30
31M.$wbad =
32  \ (ww_sXC :: GHC.Prim.Word#) ->
33    case GHC.Prim.eqWord# ww_sXC __word 1 of wild2_aSC {
34      GHC.Base.False ->
35        case GHC.Prim.ltWord# ww_sXC __word 1 of wild_B1 {
36          GHC.Base.False ->
37            case GHC.Prim.eqWord# ww_sXC __word 2 of wild21_XUq {
38              GHC.Base.False -> GHC.Prim.ltWord# ww_sXC __word 2;
39              GHC.Base.True -> GHC.Base.False
40            };
41          GHC.Base.True -> GHC.Base.True
42        };
43      GHC.Base.True ->
44        case GHC.Prim.eqWord# ww_sXC __word 2 of wild21_XUo {
45          GHC.Base.False -> GHC.Prim.ltWord# ww_sXC __word 2;
46
47-}
48
49------------------------------------------------------------------------
50
51-- Using our own instances for Ord and Eq, based on Int, are also good
52
53good :: MyWord -> Bool
54good c | c < 1     = True  -- two comparisons
55       | c < 2     = True
56       | otherwise = False
57
58{-
59
60M.good =
61  \ (c_agn :: M.MyWord) ->
62    case c_agn `cast` ((M.:CoMyWord) :: M.MyWord ~ GHC.Word.Word)
63
64    of wild_B1 { GHC.Word.W# x_agV ->
65        case GHC.Prim.ltWord# x_agV __word 1 of wild1_X33 {
66          GHC.Base.False -> GHC.Prim.ltWord# x_agV __word 2;
67          GHC.Base.True -> GHC.Base.True
68    }
69    }
70
71-}
72
73------------------------------------------------------------------------
74
75-- how is data Word = W# Word# deriving (Eq, Ord) derived??
76--
77newtype MyWord = MyWord { unWord :: Word }
78        deriving (Num,Show, Real,Enum,Integral,Bounded,Read)
79
80instance Eq MyWord where
81    (MyWord x) == (MyWord y) = eqWord x y
82    (MyWord x) /= (MyWord y) = neWord x y
83
84instance Ord MyWord where
85   (MyWord x) `compare` (MyWord y) = compareWord x y
86   (MyWord x)  <        (MyWord y) = ltWord x y
87   (MyWord x)  <=       (MyWord y) = leWord x y
88   (MyWord x)  >=       (MyWord y) = geWord x y
89   (MyWord x)  >        (MyWord y) = gtWord x y
90
91compareWord :: Word -> Word -> Ordering
92(W# x#) `compareWord` (W# y#) = compareWord# x# y#
93
94compareWord# :: Word# -> Word# -> Ordering
95compareWord# x# y#
96    | x# `ltWord#` y# = LT
97    | x# `eqWord#` y# = EQ
98    | otherwise       = GT
99
100gtWord, geWord, eqWord, neWord, ltWord, leWord :: Word -> Word -> Bool
101(W# x) `gtWord` (W# y) = x `gtWord#`  y
102(W# x) `geWord` (W# y) = x `geWord#` y
103(W# x) `eqWord` (W# y) = x `eqWord#` y
104(W# x) `neWord` (W# y) = x `neWord#` y
105(W# x) `ltWord` (W# y) = x `ltWord#`  y
106(W# x) `leWord` (W# y) = x `leWord#` y
107
108{-# INLINE eqWord #-}
109{-# INLINE neWord #-}
110{-# INLINE gtWord #-}
111{-# INLINE geWord #-}
112{-# INLINE ltWord #-}
113{-# INLINE leWord #-}
114
115------------------------------------------------------------------------