Repository : ssh://darcs.haskell.org//srv/darcs/testsuite On branch : ghc-7.2
http://hackage.haskell.org/trac/ghc/changeset/94694d9a0023bddd5573bb0934e8a8598eabc37c >--------------------------------------------------------------- commit 94694d9a0023bddd5573bb0934e8a8598eabc37c Author: David Terei <[email protected]> Date: Wed Jul 20 17:01:04 2011 -0700 Add tests for Safe Haskell Typeable instances feature >--------------------------------------------------------------- tests/safeHaskell/safeLanguage/SafeLang13.hs | 41 ++++++++++++++++++++++ tests/safeHaskell/safeLanguage/SafeLang13.stdout | 5 +++ tests/safeHaskell/safeLanguage/SafeLang13_A.hs | 19 ++++++++++ tests/safeHaskell/safeLanguage/SafeLang14.hs | 41 ++++++++++++++++++++++ tests/safeHaskell/safeLanguage/SafeLang14.stderr | 8 ++++ tests/safeHaskell/safeLanguage/SafeLang14_A.hs | 19 ++++++++++ tests/safeHaskell/safeLanguage/SafeLang15.hs | 33 +++++++++++++++++ tests/safeHaskell/safeLanguage/SafeLang15.stderr | 2 + tests/safeHaskell/safeLanguage/SafeLang15.stdout | 3 ++ tests/safeHaskell/safeLanguage/SafeLang15_A.hs | 19 ++++++++++ tests/safeHaskell/safeLanguage/all.T | 3 ++ tests/safeHaskell/unsafeLibs/BadImport03.stderr | 4 +- 12 files changed, 195 insertions(+), 2 deletions(-) diff --git a/tests/safeHaskell/safeLanguage/SafeLang13.hs b/tests/safeHaskell/safeLanguage/SafeLang13.hs new file mode 100644 index 0000000..9be68a3 --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang13.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 SafeLang13_A +import Data.Typeable + +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 + diff --git a/tests/safeHaskell/safeLanguage/SafeLang13.stdout b/tests/safeHaskell/safeLanguage/SafeLang13.stdout new file mode 100644 index 0000000..0be3899 --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang13.stdout @@ -0,0 +1,5 @@ +H "Hello World" +G 1 +Should be 3 := 3 +G 3 +Should be 3 := 4 diff --git a/tests/safeHaskell/safeLanguage/SafeLang13_A.hs b/tests/safeHaskell/safeLanguage/SafeLang13_A.hs new file mode 100644 index 0000000..c49b085 --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang13_A.hs @@ -0,0 +1,19 @@ +module SafeLang13_A (IsoInt, h, showH, P, p, showP) where + +newtype IsoInt = I Int + +h :: IsoInt +h = I 2 + +showH :: String +showH = let I n = h + in show n + +data P = P Int + +p :: P +p = P 3 + +showP :: P -> String +showP (P n) = "Should be 3 := " ++ show n + diff --git a/tests/safeHaskell/safeLanguage/SafeLang14.hs b/tests/safeHaskell/safeLanguage/SafeLang14.hs new file mode 100644 index 0000000..9be68a3 --- /dev/null +++ b/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 SafeLang13_A +import Data.Typeable + +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 + diff --git a/tests/safeHaskell/safeLanguage/SafeLang14.stderr b/tests/safeHaskell/safeLanguage/SafeLang14.stderr new file mode 100644 index 0000000..5430d91 --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang14.stderr @@ -0,0 +1,8 @@ +[1 of 2] Compiling SafeLang13_A ( SafeLang13_A.hs, SafeLang13_A.o ) +[2 of 2] Compiling Main ( SafeLang14.hs, SafeLang14.o ) + +SafeLang14.hs:14:10: + Can't create hand written instances of Typeable in Safe Haskell! Can only derive them + +SafeLang14.hs:17:10: + Can't create hand written instances of Typeable in Safe Haskell! Can only derive them diff --git a/tests/safeHaskell/safeLanguage/SafeLang14_A.hs b/tests/safeHaskell/safeLanguage/SafeLang14_A.hs new file mode 100644 index 0000000..c49b085 --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang14_A.hs @@ -0,0 +1,19 @@ +module SafeLang13_A (IsoInt, h, showH, P, p, showP) where + +newtype IsoInt = I Int + +h :: IsoInt +h = I 2 + +showH :: String +showH = let I n = h + in show n + +data P = P Int + +p :: P +p = P 3 + +showP :: P -> String +showP (P n) = "Should be 3 := " ++ show n + diff --git a/tests/safeHaskell/safeLanguage/SafeLang15.hs b/tests/safeHaskell/safeLanguage/SafeLang15.hs new file mode 100644 index 0000000..966de8f --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang15.hs @@ -0,0 +1,33 @@ +{-# 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 SafeLang13_A +import Data.Typeable + +data H = H String deriving (Typeable, Show) + +data G = G Int deriving (Show) + +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 + diff --git a/tests/safeHaskell/safeLanguage/SafeLang15.stderr b/tests/safeHaskell/safeLanguage/SafeLang15.stderr new file mode 100644 index 0000000..41fa100 --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang15.stderr @@ -0,0 +1,2 @@ +SafeLang15: SafeLang15.hs:22:9-37: Irrefutable pattern failed for pattern Data.Maybe.Just p' + diff --git a/tests/safeHaskell/safeLanguage/SafeLang15.stdout b/tests/safeHaskell/safeLanguage/SafeLang15.stdout new file mode 100644 index 0000000..451a58d --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang15.stdout @@ -0,0 +1,3 @@ +H "Hello World" +G 1 +Should be 3 := 3 diff --git a/tests/safeHaskell/safeLanguage/SafeLang15_A.hs b/tests/safeHaskell/safeLanguage/SafeLang15_A.hs new file mode 100644 index 0000000..c49b085 --- /dev/null +++ b/tests/safeHaskell/safeLanguage/SafeLang15_A.hs @@ -0,0 +1,19 @@ +module SafeLang13_A (IsoInt, h, showH, P, p, showP) where + +newtype IsoInt = I Int + +h :: IsoInt +h = I 2 + +showH :: String +showH = let I n = h + in show n + +data P = P Int + +p :: P +p = P 3 + +showP :: P -> String +showP (P n) = "Should be 3 := " ++ show n + diff --git a/tests/safeHaskell/safeLanguage/all.T b/tests/safeHaskell/safeLanguage/all.T index 7074c0f..122050d 100644 --- a/tests/safeHaskell/safeLanguage/all.T +++ b/tests/safeHaskell/safeLanguage/all.T @@ -16,4 +16,7 @@ test('SafeLang09', exit_code(1), compile_and_run, ['']) test('SafeLang10', normal, compile_fail, ['--make -trust base']) test('SafeLang11', req_interp, compile_and_run, ['--make -trust base']) test('SafeLang12', normal, compile_fail, ['--make -trust base']) +test('SafeLang13', normal, compile_and_run, ['--make -trust base']) +test('SafeLang14', normal, compile_fail, ['--make -trust base -XSafe']) +test('SafeLang15', exit_code(1), compile_and_run, ['--make -trust base -XSafe']) diff --git a/tests/safeHaskell/unsafeLibs/BadImport03.stderr b/tests/safeHaskell/unsafeLibs/BadImport03.stderr index b1fcc3c..54bb8ee 100644 --- a/tests/safeHaskell/unsafeLibs/BadImport03.stderr +++ b/tests/safeHaskell/unsafeLibs/BadImport03.stderr @@ -1,5 +1,5 @@ [1 of 2] Compiling BadImport02_A ( BadImport02_A.hs, BadImport02_A.o ) [2 of 2] Compiling Main ( BadImport03.hs, BadImport03.o ) -BadImport03.hs:8:1: - base:Data.Typeable can't be safely imported! The module itself isn't safe. +BadImport03.hs:16:10: + Can't create hand written instances of Typeable in Safe Haskell! Can only derive them _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
