summaryrefslogtreecommitdiff
path: root/testsuite/tests/safeHaskell
diff options
context:
space:
mode:
authorDavid Terei <code@davidterei.com>2014-11-07 14:11:19 -0800
committerDavid Terei <code@davidterei.com>2014-11-12 16:09:33 -0800
commit1f8b4ee074b4d9e3d847b3139dc89fff1bb5d2e6 (patch)
treed77b9d8316d780ffc6604cddcbbee08884afc132 /testsuite/tests/safeHaskell
parent064c28960730ed2f592fb675c9a11310e2371b66 (diff)
downloadhaskell-1f8b4ee074b4d9e3d847b3139dc89fff1bb5d2e6.tar.gz
Add in `-fwarn-trustworthy-safe` flag.
This warns when a module marked as `-XTrustworthy` could have been inferred as safe instead.
Diffstat (limited to 'testsuite/tests/safeHaskell')
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs2
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe02.hs2
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.hs8
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.stderr4
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe03_A.hs8
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.hs13
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.stderr4
-rw-r--r--testsuite/tests/safeHaskell/check/pkg01/all.T11
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/SafeWarn01.hs11
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/SafeWarn01.stderr3
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/TrustworthySafe01.hs9
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.hs10
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.stderr3
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/TrustworthySafe04.hs10
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.hs11
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.stderr7
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.hs10
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.stderr6
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.hs12
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.stderr7
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.hs12
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.stderr7
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.hs19
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.stderr14
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.hs12
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.stderr7
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.hs13
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.stderr7
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/all.T17
-rw-r--r--testsuite/tests/safeHaskell/safeLanguage/SafeLang18.hs14
-rw-r--r--testsuite/tests/safeHaskell/safeLanguage/all.T2
-rw-r--r--testsuite/tests/safeHaskell/unsafeLibs/BadImport08.hs2
-rw-r--r--testsuite/tests/safeHaskell/unsafeLibs/BadImport08.stderr2
-rw-r--r--testsuite/tests/safeHaskell/unsafeLibs/BadImport09.hs12
-rw-r--r--testsuite/tests/safeHaskell/unsafeLibs/BadImport09.stderr4
-rw-r--r--testsuite/tests/safeHaskell/unsafeLibs/all.T1
36 files changed, 291 insertions, 5 deletions
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs
index deb0d57f8d..107881b2d8 100644
--- a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe01.hs
@@ -1,6 +1,6 @@
{-# LANGUAGE Safe #-}
{-# LANGUAGE NoImplicitPrelude #-}
-module ImpSafe ( MyWord ) where
+module ImpSafe01 ( MyWord ) where
-- While Data.Word is safe it imports trustworthy
-- modules in base, hence base needs to be trusted.
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe02.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe02.hs
index deb0d57f8d..c6ba0968d0 100644
--- a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe02.hs
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe02.hs
@@ -1,6 +1,6 @@
{-# LANGUAGE Safe #-}
{-# LANGUAGE NoImplicitPrelude #-}
-module ImpSafe ( MyWord ) where
+module ImpSafe02 ( MyWord ) where
-- While Data.Word is safe it imports trustworthy
-- modules in base, hence base needs to be trusted.
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.hs
new file mode 100644
index 0000000000..485e9e238c
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE Trustworthy #-}
+module Main where
+
+import safe Prelude
+import safe ImpSafe03_A
+
+main = putStrLn "test"
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.stderr b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.stderr
new file mode 100644
index 0000000000..2fdf45ce13
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03.stderr
@@ -0,0 +1,4 @@
+[2 of 2] Compiling Main ( ImpSafe03.hs, ImpSafe03.o )
+
+<no location info>:
+ The package (bytestring-0.10.4.0) is required to be trusted but it isn't!
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03_A.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03_A.hs
new file mode 100644
index 0000000000..06f5d39754
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe03_A.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE Trustworthy #-}
+module ImpSafe03_A where
+
+import safe Prelude
+import safe qualified Data.ByteString.Char8 as BS
+
+s = BS.pack "Hello World"
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.hs b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.hs
new file mode 100644
index 0000000000..3a8882905f
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+module ImpSafe04 ( 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 safe Data.Word
+import System.IO.Unsafe
+
+type MyWord = Word
+
diff --git a/testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.stderr b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.stderr
new file mode 100644
index 0000000000..50a12e027b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/check/pkg01/ImpSafe04.stderr
@@ -0,0 +1,4 @@
+
+ImpSafe04.hs:9:1:
+ Data.Word: Can't be safely imported!
+ The package (base-4.8.0.0) the module resides in isn't trusted.
diff --git a/testsuite/tests/safeHaskell/check/pkg01/all.T b/testsuite/tests/safeHaskell/check/pkg01/all.T
index f121b99add..e1ed80dd7c 100644
--- a/testsuite/tests/safeHaskell/check/pkg01/all.T
+++ b/testsuite/tests/safeHaskell/check/pkg01/all.T
@@ -51,6 +51,15 @@ test('ImpSafe01', normal, compile_fail, ['-fpackage-trust -distrust base'])
# Succeed since we don't enable package trust
test('ImpSafe02', normal, compile, ['-distrust base'])
+# Fail since we don't trust base of bytestring
+test('ImpSafe03', normal, multi_compile_fail,
+ ['ImpSafe03 -trust base -distrust bytestring', [
+ ('ImpSafe03_A.hs', ' -trust base -trust bytestring')
+ ], '-fpackage-trust' ])
+
+# Fail same as ImpSafe01 but testing with -XTrustworthy now
+test('ImpSafe04', normal, compile_fail, ['-fpackage-trust -distrust base'])
+
test('ImpSafeOnly01',
[pre_cmd('$MAKE -s --no-print-directory mkPackageDatabase.ImpSafeOnly01 ' + make_args),
clean_cmd('$MAKE -s --no-print-directory cleanPackageDatabase.ImpSafeOnly01')],
@@ -95,7 +104,7 @@ test('ImpSafeOnly07',
clean_cmd('$MAKE -s --no-print-directory cleanPackageDatabase.ImpSafeOnly07'),
normalise_errmsg_fun(normaliseBytestringPackage)],
compile_fail,
- ['-fpackage-trust -package-db pdb.ImpSafeOnly07/local.db -trust safePkg01'])
+ ['-fpackage-trust -package-db pdb.ImpSafeOnly07/local.db -trust safePkg01 -distrust bytestring'])
test('ImpSafeOnly08',
[pre_cmd('$MAKE -s --no-print-directory mkPackageDatabase.ImpSafeOnly08 ' + make_args),
clean_cmd('$MAKE -s --no-print-directory cleanPackageDatabase.ImpSafeOnly08'),
diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeWarn01.hs b/testsuite/tests/safeHaskell/safeInfered/SafeWarn01.hs
new file mode 100644
index 0000000000..507367929b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/SafeWarn01.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE Unsafe #-}
+{-# OPTIONS_GHC -fwarn-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+{-# OPTIONS_GHC -fenable-rewrite-rules #-}
+
+-- | Trivial Safe Module
+module SafeWarn01 where
+
+g :: Int
+g = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeWarn01.stderr b/testsuite/tests/safeHaskell/safeInfered/SafeWarn01.stderr
new file mode 100644
index 0000000000..e9849d9eef
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/SafeWarn01.stderr
@@ -0,0 +1,3 @@
+
+SafeWarn01.hs:2:16: Warning:
+ ‘SafeWarn01’ has been inferred as safe!
diff --git a/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe01.hs b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe01.hs
new file mode 100644
index 0000000000..6d65130a84
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe01.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE Trustworthy #-}
+
+-- | This module is marked trustworthy but should be inferable as -XSafe.
+-- But no warning enabled.
+module TrustworthySafe01 where
+
+g :: Int
+g = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.hs b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.hs
new file mode 100644
index 0000000000..9dfaccd950
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Trustworthy #-}
+{-# OPTIONS_GHC -fwarn-trustworthy-safe #-}
+
+-- | This module is marked trustworthy but should be inferable as -XSafe.
+-- Warning enabled.
+module TrustworthySafe02 where
+
+g :: Int
+g = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.stderr b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.stderr
new file mode 100644
index 0000000000..68bf4e998e
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe02.stderr
@@ -0,0 +1,3 @@
+
+TrustworthySafe02.hs:1:14: Warning:
+ ‘TrustworthySafe02’ is marked as Trustworthy but has been inferred as safe!
diff --git a/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe04.hs b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe04.hs
new file mode 100644
index 0000000000..0b96de1d2a
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/TrustworthySafe04.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Trustworthy #-}
+{-# OPTIONS_GHC -W -fno-warn-trustworthy-safe #-}
+
+-- | This module is marked trustworthy but should be inferable as -XSafe.
+-- Warning enabled through `-W` but then disabled with `-fno-warn...`.
+module TrustworthySafe04 where
+
+g :: Int
+g = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.hs
new file mode 100644
index 0000000000..afe188db4f
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.hs
@@ -0,0 +1,11 @@
+{-# OPTIONS_GHC -fwarn-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+
+-- | Trivial Unsafe Module
+module UnsafeWarn01 where
+
+import System.IO.Unsafe
+
+f :: IO a -> a
+f = unsafePerformIO
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.stderr b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.stderr
new file mode 100644
index 0000000000..1ef043a9fd
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn01.stderr
@@ -0,0 +1,7 @@
+
+UnsafeWarn01.hs:2:16: Warning:
+ ‘UnsafeWarn01’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn01.hs:7:1:
+ System.IO.Unsafe: Can't be safely imported!
+ The module itself isn't safe.
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.hs
new file mode 100644
index 0000000000..6f62ca5c94
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS_GHC -fwarn-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+
+{-# LANGUAGE TemplateHaskell #-}
+-- | Unsafe as uses TH
+module UnsafeWarn02 where
+
+f :: Int
+f = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.stderr b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.stderr
new file mode 100644
index 0000000000..7421ad0333
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn02.stderr
@@ -0,0 +1,6 @@
+
+UnsafeWarn02.hs:2:16: Warning:
+ ‘UnsafeWarn02’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn02.hs:4:14:
+ -XTemplateHaskell is not allowed in Safe Haskell
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.hs
new file mode 100644
index 0000000000..ded02de888
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE Trustworthy #-}
+{-# OPTIONS_GHC -fwarn-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+
+-- | Trivial Unsafe Module
+module UnsafeWarn03 where
+
+import System.IO.Unsafe
+
+f :: IO a -> a
+f = unsafePerformIO
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.stderr b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.stderr
new file mode 100644
index 0000000000..a3d44ba375
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn03.stderr
@@ -0,0 +1,7 @@
+
+UnsafeWarn03.hs:3:16: Warning:
+ ‘UnsafeWarn03’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn03.hs:8:1:
+ System.IO.Unsafe: Can't be safely imported!
+ The module itself isn't safe.
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.hs
new file mode 100644
index 0000000000..d8e8b84fa5
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE Trustworthy #-}
+{-# OPTIONS_GHC -fwarn-trustworthy-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+
+-- | Trivial Unsafe Module
+module UnsafeWarn04 where
+
+import System.IO.Unsafe
+
+f :: IO a -> a
+f = unsafePerformIO
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.stderr b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.stderr
new file mode 100644
index 0000000000..66deff4edc
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn04.stderr
@@ -0,0 +1,7 @@
+
+UnsafeWarn04.hs:3:16: Warning:
+ ‘UnsafeWarn04’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn04.hs:8:1:
+ System.IO.Unsafe: Can't be safely imported!
+ The module itself isn't safe.
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.hs
new file mode 100644
index 0000000000..76258d362b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE Unsafe #-}
+{-# OPTIONS_GHC -fwarn-trustworthy-safe #-}
+{-# OPTIONS_GHC -fwarn-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+{-# OPTIONS_GHC -fenable-rewrite-rules #-}
+
+-- | Trivial Unsafe Module
+module UnsafeWarn05 where
+
+import System.IO.Unsafe
+
+f :: IO a -> a
+f = unsafePerformIO
+
+{-# RULES "g" g = undefined #-}
+{-# NOINLINE [1] g #-}
+g :: Int
+g = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.stderr b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.stderr
new file mode 100644
index 0000000000..229ce3d56f
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn05.stderr
@@ -0,0 +1,14 @@
+
+UnsafeWarn05.hs:4:16: Warning:
+ ‘UnsafeWarn05’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn05.hs:10:1:
+ System.IO.Unsafe: Can't be safely imported!
+ The module itself isn't safe.
+
+UnsafeWarn05.hs:4:16: Warning:
+ ‘UnsafeWarn05’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn05.hs:15:11: Warning:
+ Rule "g" ignored
+ User defined rules are disabled under Safe Haskell
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.hs
new file mode 100644
index 0000000000..671a64822b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS_GHC -fenable-rewrite-rules #-}
+{-# OPTIONS_GHC -fwarn-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+
+-- | Unsafe as uses RULES
+module UnsafeWarn06 where
+
+{-# RULES "f" f = undefined #-}
+{-# NOINLINE [1] f #-}
+f :: Int
+f = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.stderr b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.stderr
new file mode 100644
index 0000000000..8fde73ee0b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn06.stderr
@@ -0,0 +1,7 @@
+
+UnsafeWarn06.hs:3:16: Warning:
+ ‘UnsafeWarn06’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn06.hs:8:11: Warning:
+ Rule "f" ignored
+ User defined rules are disabled under Safe Haskell
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.hs
new file mode 100644
index 0000000000..43982939b8
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE Trustworthy #-}
+{-# OPTIONS_GHC -fenable-rewrite-rules #-}
+{-# OPTIONS_GHC -fwarn-safe #-}
+{-# OPTIONS_GHC -fwarn-unsafe #-}
+
+-- | Unsafe as uses RULES
+module UnsafeWarn07 where
+
+{-# RULES "f" f = undefined #-}
+{-# NOINLINE [1] f #-}
+f :: Int
+f = 1
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.stderr b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.stderr
new file mode 100644
index 0000000000..c5c5e632d7
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeWarn07.stderr
@@ -0,0 +1,7 @@
+
+UnsafeWarn07.hs:4:16: Warning:
+ ‘UnsafeWarn07’ has been inferred as unsafe!
+ Reason:
+ UnsafeWarn07.hs:9:11: Warning:
+ Rule "f" ignored
+ User defined rules are disabled under Safe Haskell
diff --git a/testsuite/tests/safeHaskell/safeInfered/all.T b/testsuite/tests/safeHaskell/safeInfered/all.T
index c2222a3549..89062cd174 100644
--- a/testsuite/tests/safeHaskell/safeInfered/all.T
+++ b/testsuite/tests/safeHaskell/safeInfered/all.T
@@ -73,3 +73,20 @@ test('Mixed01', normal, compile_fail, [''])
test('Mixed02', normal, compile_fail, [''])
test('Mixed03', normal, compile_fail, [''])
+# Trustworthy Safe modules
+test('TrustworthySafe01', normal, compile, [''])
+test('TrustworthySafe02', normal, compile, [''])
+test('TrustworthySafe04', normal, compile, [''])
+
+# Check -fwarn-unsafe works
+test('UnsafeWarn01', normal, compile, [''])
+test('UnsafeWarn02', normal, compile, [''])
+test('UnsafeWarn03', normal, compile, [''])
+test('UnsafeWarn04', normal, compile, [''])
+test('UnsafeWarn05', normal, compile, [''])
+test('UnsafeWarn06', normal, compile, [''])
+test('UnsafeWarn07', normal, compile, [''])
+
+# Chck -fwa-safe works
+test('SafeWarn01', normal, compile, [''])
+
diff --git a/testsuite/tests/safeHaskell/safeLanguage/SafeLang18.hs b/testsuite/tests/safeHaskell/safeLanguage/SafeLang18.hs
new file mode 100644
index 0000000000..330a80d069
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeLanguage/SafeLang18.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE CPP #-}
+#if __GLASGOW_HASKELL__ >= 703
+{-# LANGUAGE Safe #-}
+#endif
+module SafeLang18 where
+
+#define p377 toPair
+
+data StrictPair a b = !a :*: !b
+
+toPair :: StrictPair a b -> (a, b)
+toPair (x :*: y) = (x, y)
+{-# INLINE p377 #-}
+
diff --git a/testsuite/tests/safeHaskell/safeLanguage/all.T b/testsuite/tests/safeHaskell/safeLanguage/all.T
index 926c576434..8dad0efee6 100644
--- a/testsuite/tests/safeHaskell/safeLanguage/all.T
+++ b/testsuite/tests/safeHaskell/safeLanguage/all.T
@@ -51,6 +51,8 @@ test('SafeLang17',
multimod_compile_fail,
['SafeLang17', ''])
+test('SafeLang18', normal, compile, [''])
+
# Test building a package, that trust values are set correctly
# and can be changed correctly
#test('SafeRecomp01',
diff --git a/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.hs b/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.hs
index 18c50dfab8..d2688fab80 100644
--- a/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.hs
+++ b/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.hs
@@ -2,7 +2,7 @@
-- | Import unsafe module Control.ST to make sure it fails
module Main where
-import Control.Monad.ST
+import Control.Monad.ST.Unsafe
f :: Int
f = 2
diff --git a/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.stderr b/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.stderr
index d3f193cff7..aa8b5a57f4 100644
--- a/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.stderr
+++ b/testsuite/tests/safeHaskell/unsafeLibs/BadImport08.stderr
@@ -1,4 +1,4 @@
BadImport08.hs:5:1:
- Control.Monad.ST: Can't be safely imported!
+ Control.Monad.ST.Unsafe: Can't be safely imported!
The module itself isn't safe.
diff --git a/testsuite/tests/safeHaskell/unsafeLibs/BadImport09.hs b/testsuite/tests/safeHaskell/unsafeLibs/BadImport09.hs
new file mode 100644
index 0000000000..90d1c49090
--- /dev/null
+++ b/testsuite/tests/safeHaskell/unsafeLibs/BadImport09.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE Safe #-}
+-- | Import unsafe module Control.ST to make sure it fails
+module Main where
+
+import Control.Monad.ST.Lazy.Unsafe
+
+f :: Int
+f = 2
+
+main :: IO ()
+main = putStrLn $ "X is: " ++ show f
+
diff --git a/testsuite/tests/safeHaskell/unsafeLibs/BadImport09.stderr b/testsuite/tests/safeHaskell/unsafeLibs/BadImport09.stderr
new file mode 100644
index 0000000000..88556c8997
--- /dev/null
+++ b/testsuite/tests/safeHaskell/unsafeLibs/BadImport09.stderr
@@ -0,0 +1,4 @@
+
+BadImport09.hs:5:1:
+ Control.Monad.ST.Lazy.Unsafe: Can't be safely imported!
+ The module itself isn't safe.
diff --git a/testsuite/tests/safeHaskell/unsafeLibs/all.T b/testsuite/tests/safeHaskell/unsafeLibs/all.T
index 4ed5aab700..03ca0e4d18 100644
--- a/testsuite/tests/safeHaskell/unsafeLibs/all.T
+++ b/testsuite/tests/safeHaskell/unsafeLibs/all.T
@@ -23,6 +23,7 @@ test('BadImport05', normal, compile_fail, [''])
test('BadImport06', normal, compile_fail, [''])
test('BadImport07', normal, compile_fail, [''])
test('BadImport08', normal, compile_fail, [''])
+test('BadImport09', normal, compile_fail, [''])
# check safe modules are marked safe
test('GoodImport01', normal, compile, [''])