Ticket #7148: badUnsafe.hs

File badUnsafe.hs, 745 bytes (added by carter, 21 months ago)

the code for the type family version of the bug

Line 
1{-# LANGUAGE TypeFamilies,
2             GeneralizedNewtypeDeriving #-}
3
4import Control.Monad.ST
5type family Result a b
6 
7class Convert a where
8  coerce :: a -> Result a b
9 
10newtype SAFE a = SAFE a
11type instance Result (SAFE a) b = a
12 
13instance Convert (SAFE a) where
14  coerce (SAFE a) = a
15
16newtype IS_NO_LONGER a = IS_NO_LONGER a deriving Convert
17type instance Result (IS_NO_LONGER a) b = b
18
19--infered type is
20unsafeCoerce :: a -> b
21unsafeCoerce = coerce . IS_NO_LONGER . SAFE
22
23--use it safely
24id' :: a -> a
25id' = unsafeCoerce
26 
27--segfault (with high probability)
28crash :: segfault
29crash = unsafeCoerce . tail . tail . tail . unsafeCoerce $ True
30
31
32--time for side effects
33unsafePerformIO :: IO a -> a
34unsafePerformIO x = runST $ unsafeCoerce x