summaryrefslogtreecommitdiff
path: root/testsuite/tests/safeHaskell/safeLanguage/SafeLang14.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/safeHaskell/safeLanguage/SafeLang14.hs')
-rw-r--r--testsuite/tests/safeHaskell/safeLanguage/SafeLang14.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/testsuite/tests/safeHaskell/safeLanguage/SafeLang14.hs b/testsuite/tests/safeHaskell/safeLanguage/SafeLang14.hs
new file mode 100644
index 0000000000..98e29fbceb
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeLanguage/SafeLang14.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE DeriveDataTypeable, StandaloneDeriving #-}
+-- | This shows how to use typeable to perform unsafe
+-- casts. Basically its an example of what Safe Haskell
+-- should disallow. SafeLang14 will do that.
+module Main where
+
+import SafeLang14_A
+import Data.OldTypeable
+
+data H = H String deriving (Typeable, Show)
+
+data G = G Int deriving (Show)
+
+instance Typeable G where
+ typeOf _ = typeOf (undefined :: H)
+
+instance Typeable P where
+ typeOf _ = typeOf (undefined :: G)
+
+{-
+deriving instance Typeable G
+
+deriving instance Typeable P
+-}
+
+main = do
+ let h = H "Hello World"
+ g = G 1
+-- Just h' = (cast h) :: Maybe G
+ Just p' = (cast p) :: Maybe G
+ Just px = (cast $ incrG p') :: Maybe P
+ putStrLn $ show h
+ putStrLn $ show g
+-- putStrLn $ show h'
+ putStrLn $ showP p
+ putStrLn $ show p'
+ putStrLn $ showP px
+
+incrG :: G -> G
+incrG (G n) = G $ n + 1
+