diff options
author | David Terei <davidterei@gmail.com> | 2011-10-19 12:15:17 -0700 |
---|---|---|
committer | David Terei <davidterei@gmail.com> | 2011-10-25 14:47:31 -0700 |
commit | ed0bb9bef3338d143bf27945123e3fe4cf7d0047 (patch) | |
tree | 8a59b3eb5e71031d330adf512c01a4eb0d98d809 /testsuite/tests/safeHaskell/safeInfered | |
parent | a4a8a28f57dbcc4fac9cb2a5a6f326af65964366 (diff) | |
download | haskell-ed0bb9bef3338d143bf27945123e3fe4cf7d0047.tar.gz |
Modify and add a bunch of new tests for Safe Haskell changes
Diffstat (limited to 'testsuite/tests/safeHaskell/safeInfered')
29 files changed, 242 insertions, 0 deletions
diff --git a/testsuite/tests/safeHaskell/safeInfered/Makefile b/testsuite/tests/safeHaskell/safeInfered/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/safeHaskell/safeInfered/Mixed01.hs b/testsuite/tests/safeHaskell/safeInfered/Mixed01.hs new file mode 100644 index 0000000000..cb895fe634 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/Mixed01.hs @@ -0,0 +1,8 @@ +-- | Should fail compilation because safe imports aren't enabled +module Mixed01 where + +import safe Data.Word + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/Mixed02.hs b/testsuite/tests/safeHaskell/safeInfered/Mixed02.hs new file mode 100644 index 0000000000..062c2db64d --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/Mixed02.hs @@ -0,0 +1,10 @@ +{-# LANGUAGE Unsafe #-} +-- | Should fail compilation because we import Data.Word as safe and unsafe +module Mixed02 where + +import safe qualified Data.Word as DW +import Data.Word + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeInfered01.hs b/testsuite/tests/safeHaskell/safeInfered/SafeInfered01.hs new file mode 100644 index 0000000000..1562a18592 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/SafeInfered01.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module SafeInfered01 where + +import safe SafeInfered01_A.hs + +g :: Int +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeInfered01_A.hs b/testsuite/tests/safeHaskell/safeInfered/SafeInfered01_A.hs new file mode 100644 index 0000000000..f66ac43d78 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/SafeInfered01_A.hs @@ -0,0 +1,6 @@ +-- | Trivial Safe Module +module SafeInfered01_A where + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeInfered02.hs b/testsuite/tests/safeHaskell/safeInfered/SafeInfered02.hs new file mode 100644 index 0000000000..6656c5acf7 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/SafeInfered02.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module SafeInfered02 where + +import safe SafeInfered02_A + +g :: Int +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeInfered02_A.hs b/testsuite/tests/safeHaskell/safeInfered/SafeInfered02_A.hs new file mode 100644 index 0000000000..fff3286de5 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/SafeInfered02_A.hs @@ -0,0 +1,10 @@ +-- | Only uses deriving of Typeable so should be considered safe +module SafeInfered02_A where + +import Data.Typeable + +data G = G Int deriving (Typeable) + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeInfered03.hs b/testsuite/tests/safeHaskell/safeInfered/SafeInfered03.hs new file mode 100644 index 0000000000..9c7af12231 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/SafeInfered03.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module SafeInfered03 where + +import safe SafeInfered03_A + +g :: Int +g = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/SafeInfered03_A.hs b/testsuite/tests/safeHaskell/safeInfered/SafeInfered03_A.hs new file mode 100644 index 0000000000..01c2839cfc --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/SafeInfered03_A.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +-- | FFI but in IO monad so safe +module SafeInfered03_A where + +foreign import ccall "math.h" sin :: CDouble -> IO CDouble + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered01.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered01.hs new file mode 100644 index 0000000000..b1db9ea578 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered01.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered01 where + +import safe UnsafeInfered01_A + +g :: IO a -> a +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered01_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered01_A.hs new file mode 100644 index 0000000000..0fe65b9536 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered01_A.hs @@ -0,0 +1,8 @@ +-- | Trivial Unsafe Module +module UnsafeInfered01_A where + +import System.IO.Unsafe + +f :: IO a -> a +f = unsafePerformIO + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered02.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered02.hs new file mode 100644 index 0000000000..67105965d8 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered02.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered02 where + +import safe UnsafeInfered02_A + +g :: Int +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered02_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered02_A.hs new file mode 100644 index 0000000000..5a9a0db7f0 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered02_A.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE TemplateHaskell #-} +-- | Unsafe as uses TH +module UnsafeInfered02_A where + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered03.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered03.hs new file mode 100644 index 0000000000..67220ac4d0 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered03.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered03 where + +import safe UnsafeInfered03_A + +g :: Int +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered03_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered03_A.hs new file mode 100644 index 0000000000..ea3202ed5d --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered03_A.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +-- | Unsafe as uses GND +module UnsafeInfered03_A where + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered04.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered04.hs new file mode 100644 index 0000000000..85b7121bc3 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered04.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered04 where + +import safe UnsafeInfered04_A + +g :: Int +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered04_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered04_A.hs new file mode 100644 index 0000000000..244c3be1be --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered04_A.hs @@ -0,0 +1,9 @@ +{-# LANGUAGE RULES #-} +-- | Unsafe as uses RULES +-- Although only turns on the flag doesn't define? So mark safe +-- maybe? +module UnsafeInfered04_A where + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered05.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered05.hs new file mode 100644 index 0000000000..712d02a350 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered05.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered05 where + +import safe UnsafeInfered05_A + +g :: Int +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered05_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered05_A.hs new file mode 100644 index 0000000000..4d147716f5 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered05_A.hs @@ -0,0 +1,10 @@ +{-# OPTIONS_GHC -fenable-rewrite-rules #-} +-- | Unsafe as uses RULES +-- Although only turns on the flag doesn't define? So mark safe +-- maybe? +module UnsafeInfered05_A where + +{-# RULES "f" f = undefined #-} +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered06.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered06.hs new file mode 100644 index 0000000000..a5bb127202 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered06.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered06 where + +import safe UnsafeInfered06_A + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered06_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered06_A.hs new file mode 100644 index 0000000000..f865193a69 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered06_A.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +-- | Unsafe as uses FFI with a pure function +module UnsafeInfered06_A where + +foreign import ccall "math.h" sin :: CDouble -> CDouble + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07.hs new file mode 100644 index 0000000000..dd6a830239 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered07 where + +import safe UnsafeInfered07_A + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07_A.hs new file mode 100644 index 0000000000..98e9249876 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07_A.hs @@ -0,0 +1,10 @@ +-- | Unsafe as hand crafts a typeable instance +module UnsafeInfered07_A where + +import Data.Typeable + +data G = G Int + +instance Typeable G where + typeof _ = typeof (undefined::Int) + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered08.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered08.hs new file mode 100644 index 0000000000..394d7e6999 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered08.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered08 where + +import safe UnsafeInfered08_A + +f :: Int +f = g + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered08_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered08_A.hs new file mode 100644 index 0000000000..13f22ce3d7 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered08_A.hs @@ -0,0 +1,9 @@ +{-# LANGUAGE OverlappingInstances #-} +-- | Unsafe as uses overlapping instances +-- Although it isn't defining any so can we mark safe +-- still? +module UnsafeInfered08_A where + +g :: Int +g = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09.hs new file mode 100644 index 0000000000..1c1e61d3c5 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE Safe #-} +module UnsafeInfered09 where + +import safe UnsafeInfered09_A + +h :: Int +h = g + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09_A.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09_A.hs new file mode 100644 index 0000000000..d2e0893f75 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09_A.hs @@ -0,0 +1,8 @@ +-- | Unsafe as we explicitly marked UnsafeInfered09_B as unsafe +module UnsafeInfered09_A where + +import UnsafeInfered09_B + +g :: Int +g = f + diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09_B.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09_B.hs new file mode 100644 index 0000000000..8ba8720b03 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered09_B.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE Unsafe #-} +module UnsafeInfered09_B where + +f :: Int +f = 1 + diff --git a/testsuite/tests/safeHaskell/safeInfered/all.T b/testsuite/tests/safeHaskell/safeInfered/all.T new file mode 100644 index 0000000000..19a788b792 --- /dev/null +++ b/testsuite/tests/safeHaskell/safeInfered/all.T @@ -0,0 +1,29 @@ +# safeInfered tests are for testing that the Safe Haskell +# mode safe inference works correctly. + +# Just do the normal way, SafeHaskell is all in the frontend +def f( opts ): + opts.only_ways = ['normal'] + +setTestOpts(f) + +# Tests that should compile fine as they should be infered safe +test('SafeInfered01', normal, multimod_compile, ['SafeInfered01', '']) +test('SafeInfered02', normal, multimod_compile, ['SafeInfered02', '']) +test('SafeInfered03', normal, multimod_compile, ['SafeInfered03', '']) + +# Tests that should fail to compile as they should be infered unsafe +test('UnsafeInfered01', normal, multimod_compile_fail, ['UnsafeInfered01', '']) +test('UnsafeInfered02', normal, multimod_compile_fail, ['UnsafeInfered02', '']) +test('UnsafeInfered03', normal, multimod_compile_fail, ['UnsafeInfered03', '']) +test('UnsafeInfered04', normal, multimod_compile_fail, ['UnsafeInfered04', '']) +test('UnsafeInfered05', normal, multimod_compile_fail, ['UnsafeInfered05', '']) +test('UnsafeInfered06', normal, multimod_compile_fail, ['UnsafeInfered06', '']) +test('UnsafeInfered07', normal, multimod_compile_fail, ['UnsafeInfered07', '']) +test('UnsafeInfered08', normal, multimod_compile_fail, ['UnsafeInfered08', '']) +test('UnsafeInfered09', normal, multimod_compile_fail, ['UnsafeInfered09', '']) + +# Mixed tests +test('Mixed01', normal, compile_fail, ['']) +test('Mixed02', normal, compile_fail, ['']) + |