summaryrefslogtreecommitdiff
path: root/testsuite/tests/safeHaskell/ghci
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/safeHaskell/ghci')
-rw-r--r--testsuite/tests/safeHaskell/ghci/A.hs10
-rw-r--r--testsuite/tests/safeHaskell/ghci/B.hs8
-rw-r--r--testsuite/tests/safeHaskell/ghci/C.hs13
-rw-r--r--testsuite/tests/safeHaskell/ghci/D.hs8
-rw-r--r--testsuite/tests/safeHaskell/ghci/E.hs7
-rw-r--r--testsuite/tests/safeHaskell/ghci/Makefile4
-rw-r--r--testsuite/tests/safeHaskell/ghci/P13_A.hs9
-rw-r--r--testsuite/tests/safeHaskell/ghci/all.T20
-rw-r--r--testsuite/tests/safeHaskell/ghci/p1.script8
-rw-r--r--testsuite/tests/safeHaskell/ghci/p1.stderr6
-rw-r--r--testsuite/tests/safeHaskell/ghci/p10.script10
-rw-r--r--testsuite/tests/safeHaskell/ghci/p10.stderr2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p10.stdout1
-rw-r--r--testsuite/tests/safeHaskell/ghci/p11.script6
-rw-r--r--testsuite/tests/safeHaskell/ghci/p11.stderr3
-rw-r--r--testsuite/tests/safeHaskell/ghci/p12.script10
-rw-r--r--testsuite/tests/safeHaskell/ghci/p12.stderr3
-rw-r--r--testsuite/tests/safeHaskell/ghci/p12.stdout2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p13.script14
-rw-r--r--testsuite/tests/safeHaskell/ghci/p13.stderr13
-rw-r--r--testsuite/tests/safeHaskell/ghci/p13.stdout0
-rw-r--r--testsuite/tests/safeHaskell/ghci/p14.script10
-rw-r--r--testsuite/tests/safeHaskell/ghci/p14.stderr2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p15.script23
-rw-r--r--testsuite/tests/safeHaskell/ghci/p15.stderr12
-rw-r--r--testsuite/tests/safeHaskell/ghci/p15.stdout2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p16.script22
-rw-r--r--testsuite/tests/safeHaskell/ghci/p16.stderr15
-rw-r--r--testsuite/tests/safeHaskell/ghci/p16.stdout1
-rw-r--r--testsuite/tests/safeHaskell/ghci/p17.script10
-rw-r--r--testsuite/tests/safeHaskell/ghci/p17.stderr3
-rw-r--r--testsuite/tests/safeHaskell/ghci/p2.script10
-rw-r--r--testsuite/tests/safeHaskell/ghci/p2.stderr2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p2.stdout2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p3.script12
-rw-r--r--testsuite/tests/safeHaskell/ghci/p3.stderr6
-rw-r--r--testsuite/tests/safeHaskell/ghci/p3.stdout1
-rw-r--r--testsuite/tests/safeHaskell/ghci/p4.script8
-rw-r--r--testsuite/tests/safeHaskell/ghci/p4.stderr6
-rw-r--r--testsuite/tests/safeHaskell/ghci/p5.script13
-rw-r--r--testsuite/tests/safeHaskell/ghci/p5.stdout7
-rw-r--r--testsuite/tests/safeHaskell/ghci/p6.script13
-rw-r--r--testsuite/tests/safeHaskell/ghci/p6.stderr10
-rw-r--r--testsuite/tests/safeHaskell/ghci/p6.stdout1
-rw-r--r--testsuite/tests/safeHaskell/ghci/p7.script6
-rw-r--r--testsuite/tests/safeHaskell/ghci/p7.stdout2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p8.script6
-rw-r--r--testsuite/tests/safeHaskell/ghci/p8.stdout2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p9.script10
-rw-r--r--testsuite/tests/safeHaskell/ghci/p9.stderr2
-rw-r--r--testsuite/tests/safeHaskell/ghci/p9.stdout1
51 files changed, 377 insertions, 0 deletions
diff --git a/testsuite/tests/safeHaskell/ghci/A.hs b/testsuite/tests/safeHaskell/ghci/A.hs
new file mode 100644
index 0000000000..73da27f637
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/A.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE Trustworthy #-}
+module A (a) where
+
+import System.IO.Unsafe
+
+a :: Int
+a = 1
+
+unsafe = unsafePerformIO
+
diff --git a/testsuite/tests/safeHaskell/ghci/B.hs b/testsuite/tests/safeHaskell/ghci/B.hs
new file mode 100644
index 0000000000..58ecfb42f7
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/B.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE Unsafe #-}
+module B where
+
+import System.IO.Unsafe
+
+a :: Int
+a = 1
+
diff --git a/testsuite/tests/safeHaskell/ghci/C.hs b/testsuite/tests/safeHaskell/ghci/C.hs
new file mode 100644
index 0000000000..94959c7c0b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/C.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE Safe #-}
+module C (a, C(), D(..)) where
+
+a :: Int
+a = 1
+
+b :: Int
+b = 2
+
+data C a = C a Int
+
+data D a = D a Int
+
diff --git a/testsuite/tests/safeHaskell/ghci/D.hs b/testsuite/tests/safeHaskell/ghci/D.hs
new file mode 100644
index 0000000000..2a70c065ab
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/D.hs
@@ -0,0 +1,8 @@
+module D (a) where
+
+a :: Int
+a = 1
+
+b :: Int
+b = 2
+
diff --git a/testsuite/tests/safeHaskell/ghci/E.hs b/testsuite/tests/safeHaskell/ghci/E.hs
new file mode 100644
index 0000000000..4474d46d5f
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/E.hs
@@ -0,0 +1,7 @@
+module E where
+
+import System.IO.Unsafe
+
+a :: Int
+a = 1
+
diff --git a/testsuite/tests/safeHaskell/ghci/Makefile b/testsuite/tests/safeHaskell/ghci/Makefile
new file mode 100644
index 0000000000..4a268530f1
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/Makefile
@@ -0,0 +1,4 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
diff --git a/testsuite/tests/safeHaskell/ghci/P13_A.hs b/testsuite/tests/safeHaskell/ghci/P13_A.hs
new file mode 100644
index 0000000000..1044c83545
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/P13_A.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE OverlappingInstances, FlexibleInstances #-}
+module P13_A where
+
+class Pos a where { res :: a -> Bool }
+
+instance Pos [a] where { res _ = True }
+
+instance Pos Char where { res _ = True }
+
diff --git a/testsuite/tests/safeHaskell/ghci/all.T b/testsuite/tests/safeHaskell/ghci/all.T
new file mode 100644
index 0000000000..1c878c6759
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/all.T
@@ -0,0 +1,20 @@
+# Test GHCi works with Safe Haskell
+
+test('p1', normal, ghci_script, ['p1.script'])
+test('p2', normal, ghci_script, ['p2.script'])
+test('p3', normal, ghci_script, ['p3.script'])
+test('p4', normal, ghci_script, ['p4.script'])
+test('p5', normal, ghci_script, ['p5.script'])
+test('p6', normal, ghci_script, ['p6.script'])
+test('p7', normal, ghci_script, ['p7.script'])
+test('p8', normal, ghci_script, ['p8.script'])
+test('p9', normal, ghci_script, ['p9.script'])
+test('p10', normal, ghci_script, ['p10.script'])
+test('p11', normal, ghci_script, ['p11.script'])
+test('p12', normal, ghci_script, ['p12.script'])
+test('p13', normal, ghci_script, ['p13.script'])
+test('p14', normal, ghci_script, ['p14.script'])
+test('p15', normal, ghci_script, ['p15.script'])
+test('p16', normal, ghci_script, ['p16.script'])
+test('p17', normal, ghci_script, ['p17.script'])
+
diff --git a/testsuite/tests/safeHaskell/ghci/p1.script b/testsuite/tests/safeHaskell/ghci/p1.script
new file mode 100644
index 0000000000..3c55ad7208
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p1.script
@@ -0,0 +1,8 @@
+-- Test disabled language extensions
+:unset +s
+:set -XSafe
+
+:set -XTemplateHaskell
+
+:set -XGeneralizedNewtypeDeriving
+
diff --git a/testsuite/tests/safeHaskell/ghci/p1.stderr b/testsuite/tests/safeHaskell/ghci/p1.stderr
new file mode 100644
index 0000000000..9446e1df16
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p1.stderr
@@ -0,0 +1,6 @@
+
+<no location info>: Warning:
+ -XTemplateHaskell is not allowed in Safe Haskell; ignoring -XTemplateHaskell
+
+<no location info>: Warning:
+ -XGeneralizedNewtypeDeriving is not allowed in Safe Haskell; ignoring -XGeneralizedNewtypeDeriving
diff --git a/testsuite/tests/safeHaskell/ghci/p10.script b/testsuite/tests/safeHaskell/ghci/p10.script
new file mode 100644
index 0000000000..e1cefae496
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p10.script
@@ -0,0 +1,10 @@
+-- Test load works
+:unset +s
+:set -XSafe
+
+:load D
+
+a
+
+b
+
diff --git a/testsuite/tests/safeHaskell/ghci/p10.stderr b/testsuite/tests/safeHaskell/ghci/p10.stderr
new file mode 100644
index 0000000000..768948984e
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p10.stderr
@@ -0,0 +1,2 @@
+
+<interactive>:10:1: Not in scope: `b'
diff --git a/testsuite/tests/safeHaskell/ghci/p10.stdout b/testsuite/tests/safeHaskell/ghci/p10.stdout
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p10.stdout
@@ -0,0 +1 @@
+1
diff --git a/testsuite/tests/safeHaskell/ghci/p11.script b/testsuite/tests/safeHaskell/ghci/p11.script
new file mode 100644
index 0000000000..19fb759600
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p11.script
@@ -0,0 +1,6 @@
+-- Test load works
+:unset +s
+:set -XSafe
+
+:load E
+
diff --git a/testsuite/tests/safeHaskell/ghci/p11.stderr b/testsuite/tests/safeHaskell/ghci/p11.stderr
new file mode 100644
index 0000000000..0d33615020
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p11.stderr
@@ -0,0 +1,3 @@
+
+E.hs:3:1:
+ base:System.IO.Unsafe can't be safely imported! The module itself isn't safe.
diff --git a/testsuite/tests/safeHaskell/ghci/p12.script b/testsuite/tests/safeHaskell/ghci/p12.script
new file mode 100644
index 0000000000..486302e8ed
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p12.script
@@ -0,0 +1,10 @@
+-- Test you can't unset options
+:unset +s
+:set -XSafe
+:unset -XSafe
+
+:set -fpackage-trust
+:unset -fpackage-trust
+
+import Data.ByteString
+
diff --git a/testsuite/tests/safeHaskell/ghci/p12.stderr b/testsuite/tests/safeHaskell/ghci/p12.stderr
new file mode 100644
index 0000000000..c97035e7ab
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p12.stderr
@@ -0,0 +1,3 @@
+
+<no location info>:
+ bytestring-0.10.0.0:Data.ByteString can't be safely imported! The package (bytestring-0.10.0.0) the module resides in isn't trusted.
diff --git a/testsuite/tests/safeHaskell/ghci/p12.stdout b/testsuite/tests/safeHaskell/ghci/p12.stdout
new file mode 100644
index 0000000000..5d16ff7a9f
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p12.stdout
@@ -0,0 +1,2 @@
+don't know how to reverse -XSafe
+Some flags have not been recognized: -fno-package-trust
diff --git a/testsuite/tests/safeHaskell/ghci/p13.script b/testsuite/tests/safeHaskell/ghci/p13.script
new file mode 100644
index 0000000000..4e96c844ed
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p13.script
@@ -0,0 +1,14 @@
+-- Test restricted functionality: Overlapping
+:unset +s
+:set -XSafe
+:set -XOverlappingInstances
+:set -XFlexibleInstances
+
+:l P13_A
+
+instance Pos [Int] where { res _ = error "This curry is poisoned!" }
+
+res [1::Int, 2::Int]
+-- res 'c'
+-- res ['c']
+
diff --git a/testsuite/tests/safeHaskell/ghci/p13.stderr b/testsuite/tests/safeHaskell/ghci/p13.stderr
new file mode 100644
index 0000000000..5e31e43439
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p13.stderr
@@ -0,0 +1,13 @@
+
+<interactive>:12:1:
+ Unsafe overlapping instances for Pos [Int]
+ arising from a use of `res'
+ The matching instance is:
+ instance [overlap ok] [safe] Pos [Int]
+ -- Defined at <interactive>:10:10
+ It is compiled in a Safe module and as such can only
+ overlap instances from the same module, however it
+ overlaps the following instances from different modules:
+ instance [overlap ok] [safe] Pos [a] -- Defined at P13_A.hs:6:10
+ In the expression: res [1 :: Int, 2 :: Int]
+ In an equation for `it': it = res [1 :: Int, 2 :: Int]
diff --git a/testsuite/tests/safeHaskell/ghci/p13.stdout b/testsuite/tests/safeHaskell/ghci/p13.stdout
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p13.stdout
diff --git a/testsuite/tests/safeHaskell/ghci/p14.script b/testsuite/tests/safeHaskell/ghci/p14.script
new file mode 100644
index 0000000000..4802faf940
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p14.script
@@ -0,0 +1,10 @@
+-- Test restricted functionality: RULES
+:unset +s
+:set -XSafe
+
+:set -fenable-rewrite-rules
+
+let f x = x - 1
+
+{-# RULES "id/Int" id = f #-}
+
diff --git a/testsuite/tests/safeHaskell/ghci/p14.stderr b/testsuite/tests/safeHaskell/ghci/p14.stderr
new file mode 100644
index 0000000000..4a66d78f55
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p14.stderr
@@ -0,0 +1,2 @@
+
+<interactive>:10:1: parse error on input `{-# RULES'
diff --git a/testsuite/tests/safeHaskell/ghci/p15.script b/testsuite/tests/safeHaskell/ghci/p15.script
new file mode 100644
index 0000000000..3faeec9df9
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p15.script
@@ -0,0 +1,23 @@
+-- Test restricted functionality: Data.Typeable
+:unset +s
+:set -XSafe
+:set -XDeriveDataTypeable
+:set -XStandaloneDeriving
+
+:m + Data.Typeable
+
+data H = H {h :: String} deriving (Typeable, Show)
+
+data G = G [Int] deriving (Show)
+
+instance Typeable G where { typeOf _ = typeOf (undefined :: H) }
+
+let x = H "Hello"
+let y = G [0]
+
+x
+y
+
+let (Just y_as_H) = (cast y) :: Maybe H
+y_as_H
+
diff --git a/testsuite/tests/safeHaskell/ghci/p15.stderr b/testsuite/tests/safeHaskell/ghci/p15.stderr
new file mode 100644
index 0000000000..883f541c7b
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p15.stderr
@@ -0,0 +1,12 @@
+
+<interactive>:14:10:
+ Can't create hand written instances of Typeable in Safe Haskell! Can only derive them
+
+<interactive>:22:22:
+ No instance for (Typeable G)
+ arising from a use of `cast'
+ Possible fix: add an instance declaration for (Typeable G)
+ In the expression: (cast y) :: Maybe H
+ In a pattern binding: (Just y_as_H) = (cast y) :: Maybe H
+
+<interactive>:23:1: Not in scope: `y_as_H'
diff --git a/testsuite/tests/safeHaskell/ghci/p15.stdout b/testsuite/tests/safeHaskell/ghci/p15.stdout
new file mode 100644
index 0000000000..40b3f68882
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p15.stdout
@@ -0,0 +1,2 @@
+H {h = "Hello"}
+G [0]
diff --git a/testsuite/tests/safeHaskell/ghci/p16.script b/testsuite/tests/safeHaskell/ghci/p16.script
new file mode 100644
index 0000000000..2bcea65c95
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p16.script
@@ -0,0 +1,22 @@
+-- Test restricted functionality: GeneralizedNewtypeDeriving
+:unset +s
+:set -XSafe
+
+:set -XGeneralizedNewtypeDeriving
+
+class Op a where { op :: a -> String }
+
+data T = A | B | C deriving (Show)
+instance Op T where { op _ = "T" }
+
+newtype T1 = T1 T
+instance Op T1 where op _ = "t1"
+
+newtype T2 = T2 T deriving (Op)
+
+let x = T1 A
+let y = T2 A
+
+op x
+op y
+
diff --git a/testsuite/tests/safeHaskell/ghci/p16.stderr b/testsuite/tests/safeHaskell/ghci/p16.stderr
new file mode 100644
index 0000000000..33602c70a5
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p16.stderr
@@ -0,0 +1,15 @@
+
+<no location info>: Warning:
+ -XGeneralizedNewtypeDeriving is not allowed in Safe Haskell; ignoring -XGeneralizedNewtypeDeriving
+
+<interactive>:16:29:
+ Can't make a derived instance of `Op T2':
+ `Op' is not a derivable class
+ Try -XGeneralizedNewtypeDeriving for GHC's newtype-deriving extension
+ In the newtype declaration for `T2'
+
+<interactive>:19:9:
+ Not in scope: data constructor `T2'
+ Perhaps you meant `T1' (line 13)
+
+<interactive>:22:4: Not in scope: `y'
diff --git a/testsuite/tests/safeHaskell/ghci/p16.stdout b/testsuite/tests/safeHaskell/ghci/p16.stdout
new file mode 100644
index 0000000000..233a1e18c7
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p16.stdout
@@ -0,0 +1 @@
+"t1"
diff --git a/testsuite/tests/safeHaskell/ghci/p17.script b/testsuite/tests/safeHaskell/ghci/p17.script
new file mode 100644
index 0000000000..c9821d4e17
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p17.script
@@ -0,0 +1,10 @@
+-- Test bad imports
+:unset +s
+:set -XSafe
+
+-- test trustworthy and package flag
+import Data.ByteString
+
+:set -fpackage-trust
+import Data.ByteString
+
diff --git a/testsuite/tests/safeHaskell/ghci/p17.stderr b/testsuite/tests/safeHaskell/ghci/p17.stderr
new file mode 100644
index 0000000000..c97035e7ab
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p17.stderr
@@ -0,0 +1,3 @@
+
+<no location info>:
+ bytestring-0.10.0.0:Data.ByteString can't be safely imported! The package (bytestring-0.10.0.0) the module resides in isn't trusted.
diff --git a/testsuite/tests/safeHaskell/ghci/p2.script b/testsuite/tests/safeHaskell/ghci/p2.script
new file mode 100644
index 0000000000..c2191165fd
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p2.script
@@ -0,0 +1,10 @@
+-- Test bad options
+
+:unset +s
+:set -XSafe
+
+-- we actually allow this for now but may want to revist this decision
+:set -trust base
+:set -distrust base
+:set -distrust-all
+
diff --git a/testsuite/tests/safeHaskell/ghci/p2.stderr b/testsuite/tests/safeHaskell/ghci/p2.stderr
new file mode 100644
index 0000000000..342bb05686
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p2.stderr
@@ -0,0 +1,2 @@
+package flags have changed, resetting and loading new packages...
+package flags have changed, resetting and loading new packages...
diff --git a/testsuite/tests/safeHaskell/ghci/p2.stdout b/testsuite/tests/safeHaskell/ghci/p2.stdout
new file mode 100644
index 0000000000..c6efa9ed48
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p2.stdout
@@ -0,0 +1,2 @@
+cannot satisfy -package -all
+ (use -v for more information)
diff --git a/testsuite/tests/safeHaskell/ghci/p3.script b/testsuite/tests/safeHaskell/ghci/p3.script
new file mode 100644
index 0000000000..c2d9061739
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p3.script
@@ -0,0 +1,12 @@
+-- Test bad imports
+:unset +s
+:set -XSafe
+
+import System.IO.Unsafe
+
+-- test trustworthy and package flag
+import Data.ByteString
+
+:set -fpackage-trust
+import Data.ByteString
+
diff --git a/testsuite/tests/safeHaskell/ghci/p3.stderr b/testsuite/tests/safeHaskell/ghci/p3.stderr
new file mode 100644
index 0000000000..62aca4e2c0
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p3.stderr
@@ -0,0 +1,6 @@
+
+<no location info>:
+ base:System.IO.Unsafe can't be safely imported! The module itself isn't safe.
+
+<no location info>:
+ bytestring-0.10.0.0:Data.ByteString can't be safely imported! The package (bytestring-0.10.0.0) the module resides in isn't trusted.
diff --git a/testsuite/tests/safeHaskell/ghci/p3.stdout b/testsuite/tests/safeHaskell/ghci/p3.stdout
new file mode 100644
index 0000000000..268f05e8d9
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p3.stdout
@@ -0,0 +1 @@
+can't import System.IO.Unsafe as it isn't trusted.
diff --git a/testsuite/tests/safeHaskell/ghci/p4.script b/testsuite/tests/safeHaskell/ghci/p4.script
new file mode 100644
index 0000000000..8d78f40679
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p4.script
@@ -0,0 +1,8 @@
+-- Test bad direct calls
+:unset +s
+:set -XSafe
+
+let x = System.IO.Unsafe.unsafePerformIO
+let y = x (putStrLn "Hello" >> return 1)
+y
+
diff --git a/testsuite/tests/safeHaskell/ghci/p4.stderr b/testsuite/tests/safeHaskell/ghci/p4.stderr
new file mode 100644
index 0000000000..8ff4107af8
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p4.stderr
@@ -0,0 +1,6 @@
+
+<interactive>:6:9: Not in scope: `System.IO.Unsafe.unsafePerformIO'
+
+<interactive>:7:9: Not in scope: `x'
+
+<interactive>:8:1: Not in scope: `y'
diff --git a/testsuite/tests/safeHaskell/ghci/p5.script b/testsuite/tests/safeHaskell/ghci/p5.script
new file mode 100644
index 0000000000..cdf6088812
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p5.script
@@ -0,0 +1,13 @@
+-- Test unsetting safe
+:unset +s
+:set -XSafe
+
+:set -XSafe
+:unset -XSafe
+
+:set -XTrustworthy
+:unset -XTrustworthy
+
+:set -XUnsafe
+:unset -XUnsafe
+
diff --git a/testsuite/tests/safeHaskell/ghci/p5.stdout b/testsuite/tests/safeHaskell/ghci/p5.stdout
new file mode 100644
index 0000000000..3f649f7b60
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p5.stdout
@@ -0,0 +1,7 @@
+don't know how to reverse -XSafe
+ghc-stage2: <no location info>: Incompatible Safe Haskell flags! (Safe, Trustworthy)
+Usage: For basic information, try the `--help' option.
+don't know how to reverse -XTrustworthy
+ghc-stage2: <no location info>: Incompatible Safe Haskell flags! (Safe, Unsafe)
+Usage: For basic information, try the `--help' option.
+don't know how to reverse -XUnsafe
diff --git a/testsuite/tests/safeHaskell/ghci/p6.script b/testsuite/tests/safeHaskell/ghci/p6.script
new file mode 100644
index 0000000000..8590fd6449
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p6.script
@@ -0,0 +1,13 @@
+-- Test restricted functionality: FFI
+:unset +s
+:set -XSafe
+
+:set -XForeignFunctionInterface
+
+foreign import ccall "sin" c_sin' :: Double -> IO Double
+x <- c_sin' 1
+x
+
+foreign import ccall "sin" c_sin :: Double -> Double
+c_sin 1
+
diff --git a/testsuite/tests/safeHaskell/ghci/p6.stderr b/testsuite/tests/safeHaskell/ghci/p6.stderr
new file mode 100644
index 0000000000..b32c521b4d
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p6.stderr
@@ -0,0 +1,10 @@
+
+<interactive>:12:1:
+ Unacceptable result type in foreign declaration: Double
+ Safe Haskell is on, all FFI imports must be in the IO monad
+ When checking declaration:
+ foreign import ccall safe "static sin" c_sin :: Double -> Double
+
+<interactive>:13:1:
+ Not in scope: `c_sin'
+ Perhaps you meant c_sin' (line 8)
diff --git a/testsuite/tests/safeHaskell/ghci/p6.stdout b/testsuite/tests/safeHaskell/ghci/p6.stdout
new file mode 100644
index 0000000000..e83a344363
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p6.stdout
@@ -0,0 +1 @@
+0.8414709848078965
diff --git a/testsuite/tests/safeHaskell/ghci/p7.script b/testsuite/tests/safeHaskell/ghci/p7.script
new file mode 100644
index 0000000000..ea4190b0a4
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p7.script
@@ -0,0 +1,6 @@
+-- Test load works
+:unset +s
+:set -XSafe
+
+:load A
+
diff --git a/testsuite/tests/safeHaskell/ghci/p7.stdout b/testsuite/tests/safeHaskell/ghci/p7.stdout
new file mode 100644
index 0000000000..674794fdac
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p7.stdout
@@ -0,0 +1,2 @@
+ghc-stage2: A.hs:1:14-24: Incompatible Safe Haskell flags! (Safe, Trustworthy)
+Usage: For basic information, try the `--help' option.
diff --git a/testsuite/tests/safeHaskell/ghci/p8.script b/testsuite/tests/safeHaskell/ghci/p8.script
new file mode 100644
index 0000000000..7d5101f226
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p8.script
@@ -0,0 +1,6 @@
+-- Test load works
+:unset +s
+:set -XSafe
+
+:load B
+
diff --git a/testsuite/tests/safeHaskell/ghci/p8.stdout b/testsuite/tests/safeHaskell/ghci/p8.stdout
new file mode 100644
index 0000000000..8280f4a6b0
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p8.stdout
@@ -0,0 +1,2 @@
+ghc-stage2: B.hs:1:14-19: Incompatible Safe Haskell flags! (Safe, Unsafe)
+Usage: For basic information, try the `--help' option.
diff --git a/testsuite/tests/safeHaskell/ghci/p9.script b/testsuite/tests/safeHaskell/ghci/p9.script
new file mode 100644
index 0000000000..298944dcae
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p9.script
@@ -0,0 +1,10 @@
+-- Test load works
+:unset +s
+:set -XSafe
+
+:load C
+
+a
+
+b
+
diff --git a/testsuite/tests/safeHaskell/ghci/p9.stderr b/testsuite/tests/safeHaskell/ghci/p9.stderr
new file mode 100644
index 0000000000..768948984e
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p9.stderr
@@ -0,0 +1,2 @@
+
+<interactive>:10:1: Not in scope: `b'
diff --git a/testsuite/tests/safeHaskell/ghci/p9.stdout b/testsuite/tests/safeHaskell/ghci/p9.stdout
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/testsuite/tests/safeHaskell/ghci/p9.stdout
@@ -0,0 +1 @@
+1