summaryrefslogtreecommitdiff
path: root/testsuite/tests/safeHaskell/check
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/safeHaskell/check')
-rw-r--r--testsuite/tests/safeHaskell/check/Check01.hs9
-rw-r--r--testsuite/tests/safeHaskell/check/Check01.stderr4
-rw-r--r--testsuite/tests/safeHaskell/check/Check01_A.hs15
-rw-r--r--testsuite/tests/safeHaskell/check/Check01_B.hs10
-rw-r--r--testsuite/tests/safeHaskell/check/Check02.hs9
-rw-r--r--testsuite/tests/safeHaskell/check/Check02.stderr1
-rw-r--r--testsuite/tests/safeHaskell/check/Check02_A.hs16
-rw-r--r--testsuite/tests/safeHaskell/check/Check02_B.hs10
-rw-r--r--testsuite/tests/safeHaskell/check/Check03.hs8
-rw-r--r--testsuite/tests/safeHaskell/check/Check03.stderr1
-rw-r--r--testsuite/tests/safeHaskell/check/Check03_A.hs15
-rw-r--r--testsuite/tests/safeHaskell/check/Check03_B.hs10
-rw-r--r--testsuite/tests/safeHaskell/check/Check04.hs7
-rw-r--r--testsuite/tests/safeHaskell/check/Check04.stderr2
-rw-r--r--testsuite/tests/safeHaskell/check/Check04_1.hs9
-rw-r--r--testsuite/tests/safeHaskell/check/Check04_A.hs15
-rw-r--r--testsuite/tests/safeHaskell/check/Check04_B.hs10
-rw-r--r--testsuite/tests/safeHaskell/check/CheckA.hs15
-rw-r--r--testsuite/tests/safeHaskell/check/CheckB.hs10
-rw-r--r--testsuite/tests/safeHaskell/check/CheckB.stderr2
-rw-r--r--testsuite/tests/safeHaskell/check/CheckB_Aux.hs15
-rw-r--r--testsuite/tests/safeHaskell/check/Makefile3
-rw-r--r--testsuite/tests/safeHaskell/check/all.T38
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs12
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.stderr3
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly01.hs8
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly02.hs8
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.hs8
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.stderr3
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/M_SafePkg.hs6
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/M_SafePkg2.hs6
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/M_SafePkg3.hs8
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/M_SafePkg4.hs11
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/Makefile46
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/Setup.hs4
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/all.T24
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/p.cabal15
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/safePkg01.stdout24
38 files changed, 420 insertions, 0 deletions
diff --git a/testsuite/tests/safeHaskell/check/Check01.hs b/testsuite/tests/safeHaskell/check/Check01.hs
new file mode 100644
index 0000000000..bd018acb50
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check01.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE SafeImports #-}
+module Check01 ( main' ) where
+
+import safe Check01_B
+
+main' = do
+ let n = mainM 1
+ print $ n
+
diff --git a/testsuite/tests/safeHaskell/check/Check01.stderr b/testsuite/tests/safeHaskell/check/Check01.stderr
new file mode 100644
index 0000000000..70722f32b8
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check01.stderr
@@ -0,0 +1,4 @@
+[3 of 3] Compiling Check01 ( Check01.hs, Check01.o )
+
+<no location info>:
+ The package (base) is required to be trusted but it isn't!
diff --git a/testsuite/tests/safeHaskell/check/Check01_A.hs b/testsuite/tests/safeHaskell/check/Check01_A.hs
new file mode 100644
index 0000000000..8b318a5124
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check01_A.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE Trustworthy #-}
+module Check01_A (
+ trace
+ ) where
+
+import qualified Debug.Trace as D
+import qualified Data.ByteString.Lazy.Char8 as BS
+
+-- | Allowed declasification
+trace :: String -> a -> a
+trace s = D.trace $ s ++ show a3
+
+a3 :: BS.ByteString
+a3 = BS.take 3 $ BS.repeat 'a'
+
diff --git a/testsuite/tests/safeHaskell/check/Check01_B.hs b/testsuite/tests/safeHaskell/check/Check01_B.hs
new file mode 100644
index 0000000000..b584e51b97
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check01_B.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Safe #-}
+
+-- Since Safe we require base package be trusted to compile
+module Check01_B where
+
+import Check01_A
+
+mainM :: Int -> Int
+mainM n = trace "Allowed Leak" $ n * 2
+
diff --git a/testsuite/tests/safeHaskell/check/Check02.hs b/testsuite/tests/safeHaskell/check/Check02.hs
new file mode 100644
index 0000000000..3f15cb4ba9
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check02.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE SafeImports #-}
+module Check02 ( main' ) where
+
+import safe Check02_B
+
+main' = do
+ let n = mainM 1
+ print $ n
+
diff --git a/testsuite/tests/safeHaskell/check/Check02.stderr b/testsuite/tests/safeHaskell/check/Check02.stderr
new file mode 100644
index 0000000000..708541b8ed
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check02.stderr
@@ -0,0 +1 @@
+[3 of 3] Compiling Check02 ( Check02.hs, Check02.o )
diff --git a/testsuite/tests/safeHaskell/check/Check02_A.hs b/testsuite/tests/safeHaskell/check/Check02_A.hs
new file mode 100644
index 0000000000..d43dab727a
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check02_A.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE Trustworthy #-}
+module Check02_A (
+ trace
+ ) where
+
+import qualified Debug.Trace as D
+import qualified Data.ByteString.Lazy.Char8 as BS
+
+-- | Allowed declasification
+trace :: String -> a -> a
+trace s = D.trace $ s ++ show a3
+
+a3 :: BS.ByteString
+a3 = BS.take 3 $ BS.repeat 'a'
+
+
diff --git a/testsuite/tests/safeHaskell/check/Check02_B.hs b/testsuite/tests/safeHaskell/check/Check02_B.hs
new file mode 100644
index 0000000000..10d45ccfbb
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check02_B.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Safe #-}
+
+-- Since Safe we require base package be trusted to compile
+module Check02_B where
+
+import Check02_A
+
+mainM :: Int -> Int
+mainM n = trace "Allowed Leak" $ n * 2
+
diff --git a/testsuite/tests/safeHaskell/check/Check03.hs b/testsuite/tests/safeHaskell/check/Check03.hs
new file mode 100644
index 0000000000..e06b4f83fb
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check03.hs
@@ -0,0 +1,8 @@
+module Check03 where
+
+import Check03_B
+
+mainN = do
+ let n = mainM 1
+ print $ n
+
diff --git a/testsuite/tests/safeHaskell/check/Check03.stderr b/testsuite/tests/safeHaskell/check/Check03.stderr
new file mode 100644
index 0000000000..343803f6ff
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check03.stderr
@@ -0,0 +1 @@
+[3 of 3] Compiling Check03 ( Check03.hs, Check03.o )
diff --git a/testsuite/tests/safeHaskell/check/Check03_A.hs b/testsuite/tests/safeHaskell/check/Check03_A.hs
new file mode 100644
index 0000000000..e7b8d75d03
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check03_A.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE Trustworthy #-}
+module Check03_A (
+ trace
+ ) where
+
+import qualified Debug.Trace as D
+import qualified Data.ByteString.Lazy.Char8 as BS
+
+-- | Allowed declasification
+trace :: String -> a -> a
+trace s = D.trace $ s ++ show a3
+
+a3 :: BS.ByteString
+a3 = BS.take 3 $ BS.repeat 'a'
+
diff --git a/testsuite/tests/safeHaskell/check/Check03_B.hs b/testsuite/tests/safeHaskell/check/Check03_B.hs
new file mode 100644
index 0000000000..bce45af4e5
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check03_B.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Safe #-}
+
+-- Since Safe we require base package be trusted to compile
+module Check03_B where
+
+import Check03_A
+
+mainM :: Int -> Int
+mainM n = trace "Allowed Leak" $ n * 2
+
diff --git a/testsuite/tests/safeHaskell/check/Check04.hs b/testsuite/tests/safeHaskell/check/Check04.hs
new file mode 100644
index 0000000000..9891de36ee
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check04.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE SafeImports #-}
+module Main ( main ) where
+
+import Check04_1
+
+main = main'
+
diff --git a/testsuite/tests/safeHaskell/check/Check04.stderr b/testsuite/tests/safeHaskell/check/Check04.stderr
new file mode 100644
index 0000000000..ec3bdb1585
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check04.stderr
@@ -0,0 +1,2 @@
+[4 of 4] Compiling Main ( Check04.hs, Check04.o )
+Linking Check04 ...
diff --git a/testsuite/tests/safeHaskell/check/Check04_1.hs b/testsuite/tests/safeHaskell/check/Check04_1.hs
new file mode 100644
index 0000000000..e823c889d6
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check04_1.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE SafeImports #-}
+module Check04_1 ( main' ) where
+
+import safe Check04_B
+
+main' = do
+ let n = mainM 1
+ print $ n
+
diff --git a/testsuite/tests/safeHaskell/check/Check04_A.hs b/testsuite/tests/safeHaskell/check/Check04_A.hs
new file mode 100644
index 0000000000..3f6b5f00e9
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check04_A.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE Trustworthy #-}
+module Check04_A (
+ trace
+ ) where
+
+import qualified Debug.Trace as D
+import qualified Data.ByteString.Lazy.Char8 as BS
+
+-- | Allowed declasification
+trace :: String -> a -> a
+trace s = D.trace $ s ++ show a3
+
+a3 :: BS.ByteString
+a3 = BS.take 3 $ BS.repeat 'a'
+
diff --git a/testsuite/tests/safeHaskell/check/Check04_B.hs b/testsuite/tests/safeHaskell/check/Check04_B.hs
new file mode 100644
index 0000000000..5280c51fad
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Check04_B.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Safe #-}
+
+-- Since Safe we require base package be trusted to compile
+module Check04_B where
+
+import Check04_A
+
+mainM :: Int -> Int
+mainM n = trace "Allowed Leak" $ n * 2
+
diff --git a/testsuite/tests/safeHaskell/check/CheckA.hs b/testsuite/tests/safeHaskell/check/CheckA.hs
new file mode 100644
index 0000000000..80f9ae4ee0
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/CheckA.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE Trustworthy #-}
+module CheckA (
+ trace
+ ) where
+
+import qualified Debug.Trace as D
+import qualified Data.ByteString.Lazy.Char8 as BS
+
+-- | Allowed declasification
+trace :: String -> a -> a
+trace s = D.trace $ s ++ show a3
+
+a3 :: BS.ByteString
+a3 = BS.take 3 $ BS.repeat 'a'
+
diff --git a/testsuite/tests/safeHaskell/check/CheckB.hs b/testsuite/tests/safeHaskell/check/CheckB.hs
new file mode 100644
index 0000000000..7e649a1598
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/CheckB.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Safe #-}
+
+-- Since Safe we require base package be trusted to compile
+module CheckB where
+
+import CheckB_Aux
+
+mainM :: Int -> Int
+mainM n = trace "Allowed Leak" $ n * 2
+
diff --git a/testsuite/tests/safeHaskell/check/CheckB.stderr b/testsuite/tests/safeHaskell/check/CheckB.stderr
new file mode 100644
index 0000000000..f8321b3704
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/CheckB.stderr
@@ -0,0 +1,2 @@
+[1 of 2] Compiling CheckB_Aux ( CheckB_Aux.hs, CheckB_Aux.o )
+[2 of 2] Compiling CheckB ( CheckB.hs, CheckB.o )
diff --git a/testsuite/tests/safeHaskell/check/CheckB_Aux.hs b/testsuite/tests/safeHaskell/check/CheckB_Aux.hs
new file mode 100644
index 0000000000..c04d5102d7
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/CheckB_Aux.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE Trustworthy #-}
+module CheckB_Aux (
+ trace
+ ) where
+
+import qualified Debug.Trace as D
+import qualified Data.ByteString.Lazy.Char8 as BS
+
+-- | Allowed declasification
+trace :: String -> a -> a
+trace s = D.trace $ s ++ show a3
+
+a3 :: BS.ByteString
+a3 = BS.take 3 $ BS.repeat 'a'
+
diff --git a/testsuite/tests/safeHaskell/check/Makefile b/testsuite/tests/safeHaskell/check/Makefile
new file mode 100644
index 0000000000..9101fbd40a
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/Makefile
@@ -0,0 +1,3 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
diff --git a/testsuite/tests/safeHaskell/check/all.T b/testsuite/tests/safeHaskell/check/all.T
new file mode 100644
index 0000000000..2e769ba1aa
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/all.T
@@ -0,0 +1,38 @@
+# Just do the normal way, SafeHaskell is all in the frontend
+def f( opts ):
+ opts.only_ways = ['normal']
+
+setTestOpts(f)
+
+test('CheckA', normal, compile, [''])
+test('CheckB',
+ extra_clean(['CheckB_Aux.hi', 'CheckB_Aux.o']),
+ multimod_compile, ['CheckB', '-trust base'])
+
+# fail as we don't trust base when compiling Check01
+test('Check01', normal, multi_compile_fail, ['Check01', [
+ ('Check01_A.hs', ''),
+ ('Check01_B.hs', '-trust base')
+ ], ''])
+
+# suceed this time since we trust base when we compile AND use CheckB
+test('Check02', normal, multi_compile, ['Check02', [
+ ('Check02_A.hs', ''),
+ ('Check02_B.hs', '')
+ ], '-trust base'])
+
+# suceed as while like Check01_fail we don't import CheckB as a safe
+# import this time, so don't require base trusted when used.
+test('Check03', normal, multi_compile, ['Check03', [
+ ('Check03_A.hs', ''),
+ ('Check03_B.hs', '-trust base')
+ ], ''])
+
+# Check a slightly larger transitive program. Check01 isn't imported
+# safely by Check03 so we don't require base trused at end.
+test('Check04', normal, multi_compile, ['Check04', [
+ ('Check04_A.hs', ''),
+ ('Check04_B.hs', '-trust base'),
+ ('Check04_1.hs', '-trust base')
+ ], ''])
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs
new file mode 100644
index 0000000000..deb0d57f8d
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+module ImpSafe ( MyWord ) where
+
+-- While Data.Word is safe it imports trustworthy
+-- modules in base, hence base needs to be trusted.
+-- Note: Worthwhile giving out better error messages for cases
+-- like this if I can.
+import Data.Word
+
+type MyWord = Word
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.stderr b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.stderr
new file mode 100644
index 0000000000..9ca2bbe817
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.stderr
@@ -0,0 +1,3 @@
+
+ImpSafe01.hs:9:1:
+ base:Data.Word can't be safely imported! The package (base) the module resides in isn't trusted.
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly01.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly01.hs
new file mode 100644
index 0000000000..2143d3139b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly01.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE Safe #-}
+module Main where
+
+import M_SafePkg
+
+main = do
+ putStrLn $ show bigInt
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly02.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly02.hs
new file mode 100644
index 0000000000..27281b9cce
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly02.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE Safe #-}
+module Main where
+
+import M_SafePkg2
+
+main = do
+ putStrLn $ show bigInt
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.hs
new file mode 100644
index 0000000000..d09e39937d
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE Safe #-}
+module Main where
+
+import M_SafePkg3
+
+main = do
+ putStrLn $ show bigInt
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.stderr b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.stderr
new file mode 100644
index 0000000000..bc6eecffee
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafeOnly03.stderr
@@ -0,0 +1,3 @@
+
+ImpSafeOnly03.hs:4:1:
+ safePkg01-1.0:M_SafePkg3 can't be safely imported! The package (safePkg01-1.0) the module resides in isn't trusted.
diff --git a/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg.hs b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg.hs
new file mode 100644
index 0000000000..14c21132e7
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE Safe #-}
+module M_SafePkg where
+
+bigInt :: Int
+bigInt = 9
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg2.hs b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg2.hs
new file mode 100644
index 0000000000..74c263f61d
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg2.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE Trustworthy #-}
+module M_SafePkg2 where
+
+bigInt :: Int
+bigInt = 9
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg3.hs b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg3.hs
new file mode 100644
index 0000000000..67714c4731
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg3.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE Safe #-}
+module M_SafePkg3 where
+
+import qualified M_SafePkg2 as M2
+
+bigInt :: Int
+bigInt = M2.bigInt
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg4.hs b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg4.hs
new file mode 100644
index 0000000000..52367b113b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/M_SafePkg4.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE Safe #-}
+module M_SafePkg4 where
+
+import qualified M_SafePkg3 as M3
+import Data.Word
+
+bigInt :: Int
+bigInt = M3.bigInt
+
+type MyWord = Word
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/Makefile b/testsuite/tests/safeHaskell/check/pkg01/Makefile
new file mode 100644
index 0000000000..7cc80494a1
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/Makefile
@@ -0,0 +1,46 @@
+TOP=../../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+clean:
+ rm -rf setup a.out
+ rm -rf dist
+ find . -name "*.o" | xargs rm -f
+ find . -name "*.hi" | xargs rm -f
+ rm -rf local.db
+ rm -rf install
+
+# We use the global package database as there's no easy way to tell
+# ghc-pkg (via Cabal) to use one in ., and the global one at least
+# won't affect the installed GHC and is more likely to work
+
+PREFIX := $(abspath install)
+$(eval $(call canonicalise,PREFIX))
+
+PKGCONF = local.db
+LGHC_PKG = '$(GHC_PKG)' --no-user-package-conf -f '$(PKGCONF)'
+
+safePkg01:
+ '$(MAKE)' clean
+ '$(TEST_HC)' --make -o setup Setup.hs -v0
+
+ '$(GHC_PKG)' init local.db
+ ./setup configure -v0 --prefix='$(PREFIX)' --with-compiler='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS) -trust base' --with-hc-pkg='$(GHC_PKG)' --package-db='$(PKGCONF)' $(PROF)
+ ./setup build -v0
+ ./setup copy -v0
+ ./setup register --inplace -v0
+ $(LGHC_PKG) list
+ $(LGHC_PKG) field safePkg01-1.0 trusted
+ echo
+ echo 'M_SafePkg'
+ '$(TEST_HC)' --show-iface dist/build/M_SafePkg.hi | grep -E '^package dependencies:|^trusted:|^require own pkg trusted:'
+ echo
+ echo 'M_SafePkg2'
+ '$(TEST_HC)' --show-iface dist/build/M_SafePkg2.hi | grep -E '^package dependencies:|^trusted:|^require own pkg trusted:'
+ echo
+ echo 'M_SafePkg3'
+ '$(TEST_HC)' --show-iface dist/build/M_SafePkg3.hi | grep -E '^package dependencies:|^trusted:|^require own pkg trusted:'
+ echo
+ echo 'M_SafePkg4'
+ '$(TEST_HC)' --show-iface dist/build/M_SafePkg4.hi | grep -E '^package dependencies:|^trusted:|^require own pkg trusted:'
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/Setup.hs b/testsuite/tests/safeHaskell/check/pkg01/Setup.hs
new file mode 100644
index 0000000000..6479cb1c16
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/Setup.hs
@@ -0,0 +1,4 @@
+import Distribution.Simple
+
+main = defaultMain
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/all.T b/testsuite/tests/safeHaskell/check/pkg01/all.T
new file mode 100644
index 0000000000..bdbdc4c56d
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/all.T
@@ -0,0 +1,24 @@
+# Just do the normal way, SafeHaskell is all in the frontend
+def f( opts ):
+ opts.only_ways = ['normal']
+
+setTestOpts(f)
+
+if config.have_profiling:
+ prof = '--enable-library-profiling'
+else:
+ prof = ''
+
+test('safePkg01',
+ [normal, alone],
+ run_command,
+ ['$MAKE -s --no-print-directory safePkg01 PROF=' + prof])
+
+test('ImpSafe01', normal, compile_fail, [''])
+
+test('ImpSafeOnly01', [normal, alone], compile, ['-package-conf local.db -trust base'])
+
+test('ImpSafeOnly02', [normal, alone], compile, ['-package-conf local.db -trust base -trust safePkg01'])
+
+test('ImpSafeOnly03', [normal, alone], compile_fail, ['-package-conf local.db -trust base'])
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/p.cabal b/testsuite/tests/safeHaskell/check/pkg01/p.cabal
new file mode 100644
index 0000000000..f6d84b5f8a
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/p.cabal
@@ -0,0 +1,15 @@
+Name: safePkg01
+Version: 1.0
+Description: SafeHaskell Test Package
+License: BSD3
+Build-Type: Simple
+
+Library {
+ Build-Depends: base >= 4
+ Exposed-Modules:
+ M_SafePkg
+ M_SafePkg2
+ M_SafePkg3
+ M_SafePkg4
+}
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/safePkg01.stdout b/testsuite/tests/safeHaskell/check/pkg01/safePkg01.stdout
new file mode 100644
index 0000000000..c1a5642c17
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/safePkg01.stdout
@@ -0,0 +1,24 @@
+local.db:
+ safePkg01-1.0
+
+trusted: False
+
+M_SafePkg
+package dependencies: base* ghc-prim integer-gmp
+trusted: safe
+require own pkg trusted: False
+
+M_SafePkg2
+package dependencies: base ghc-prim integer-gmp
+trusted: trustworthy
+require own pkg trusted: False
+
+M_SafePkg3
+package dependencies: base* ghc-prim integer-gmp
+trusted: safe
+require own pkg trusted: True
+
+M_SafePkg4
+package dependencies: base* ghc-prim integer-gmp
+trusted: safe
+require own pkg trusted: True