summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Terei <code@davidterei.com>2014-08-01 18:49:43 -0700
committerDavid Terei <code@davidterei.com>2014-08-01 18:59:35 -0700
commitfbd0586ea55c753f6c81b592ae01e88e22f8f0cd (patch)
tree9d48d5c48a20a2d3b2623cd2850d1057a72724d3
parent105602f47f84ad17a87c68491effd0ba59ea1df6 (diff)
downloadhaskell-fbd0586ea55c753f6c81b592ae01e88e22f8f0cd.tar.gz
Infer safety of modules correctly with new overlapping pragmas.
-rw-r--r--compiler/typecheck/TcInstDcls.lhs3
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeInfered13.hs10
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeInfered14.hs10
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/UnsafeInfered15.hs10
-rw-r--r--testsuite/tests/safeHaskell/safeInfered/all.T5
5 files changed, 37 insertions, 1 deletions
diff --git a/compiler/typecheck/TcInstDcls.lhs b/compiler/typecheck/TcInstDcls.lhs
index 6ff8a2b0cf..2b123ffab6 100644
--- a/compiler/typecheck/TcInstDcls.lhs
+++ b/compiler/typecheck/TcInstDcls.lhs
@@ -424,6 +424,7 @@ tcInstDecls1 tycl_decls inst_decls deriv_decls
; when (safeInferOn dflags) $ forM_ local_infos $ \x -> case x of
_ | typInstCheck x -> recordUnsafeInfer
_ | genInstCheck x -> recordUnsafeInfer
+ _ | overlapCheck x -> recordUnsafeInfer
_ -> return ()
; return ( gbl_env
@@ -450,6 +451,8 @@ tcInstDecls1 tycl_decls inst_decls deriv_decls
ptext (sLit "Replace the following instance:"))
2 (pprInstanceHdr (iSpec i))
+ overlapCheck ty = overlapMode (is_flag $ iSpec ty) `elem`
+ [Overlappable, Overlapping, Overlaps]
genInstCheck ty = is_cls_nm (iSpec ty) `elem` genericClassNames
genInstErr i = hang (ptext (sLit $ "Generic instances can only be "
++ "derived in Safe Haskell.") $+$
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered13.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered13.hs
new file mode 100644
index 0000000000..defc3a5243
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered13.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS_GHC -fwarn-unsafe -Werror #-}
+{-# LANGUAGE FlexibleInstances #-}
+module UnsafeInfered13 where
+
+class C a where
+ f :: a -> String
+
+instance {-# OVERLAPS #-} C a where
+ f _ = "a"
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered14.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered14.hs
new file mode 100644
index 0000000000..5b9f64210f
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered14.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS_GHC -fwarn-unsafe -Werror #-}
+{-# LANGUAGE FlexibleInstances #-}
+module UnsafeInfered14 where
+
+class C a where
+ f :: a -> String
+
+instance {-# OVERLAPPABLE #-} C a where
+ f _ = "a"
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered15.hs b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered15.hs
new file mode 100644
index 0000000000..427c97b0ac
--- /dev/null
+++ b/testsuite/tests/safeHaskell/safeInfered/UnsafeInfered15.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS_GHC -fwarn-unsafe -Werror #-}
+{-# LANGUAGE FlexibleInstances #-}
+module UnsafeInfered15 where
+
+class C a where
+ f :: a -> String
+
+instance {-# OVERLAPPING #-} C a where
+ f _ = "a"
+
diff --git a/testsuite/tests/safeHaskell/safeInfered/all.T b/testsuite/tests/safeHaskell/safeInfered/all.T
index 47e9656279..9fb587b5f7 100644
--- a/testsuite/tests/safeHaskell/safeInfered/all.T
+++ b/testsuite/tests/safeHaskell/safeInfered/all.T
@@ -56,8 +56,11 @@ test('UnsafeInfered11',
[ extra_clean(['UnsafeInfered11_A.hi', 'UnsafeInfered11_A.o']) ],
multimod_compile_fail, ['UnsafeInfered11', ''])
-# test should fail as unsafe and we made warn unsafe + -Werror
+# Test should fail as unsafe and we made warn unsafe + -Werror
test('UnsafeInfered12', normal, compile_fail, [''])
+test('UnsafeInfered13', normal, compile_fail, [''])
+test('UnsafeInfered14', normal, compile_fail, [''])
+test('UnsafeInfered15', normal, compile_fail, [''])
# Mixed tests
test('Mixed01', normal, compile_fail, [''])