summaryrefslogtreecommitdiff
path: root/testsuite/tests/safeHaskell/overlapping/all.T
diff options
context:
space:
mode:
authorDavid Terei <code@davidterei.com>2015-05-11 16:05:37 -0700
committerDavid Terei <code@davidterei.com>2015-05-11 18:21:11 -0700
commit4fffbc34c024231c3c9fac7a2134896cc09c7fb7 (patch)
treea4b775d9f04997c2834303b2249dcae5ac42c642 /testsuite/tests/safeHaskell/overlapping/all.T
parenteecef1733d5de342383665943b955bc1c96472f4 (diff)
downloadhaskell-4fffbc34c024231c3c9fac7a2134896cc09c7fb7.tar.gz
New handling of overlapping inst in Safe Haskell
We do much better now due to the newish per-instance flags. Rather than mark any module that uses `-XOverlappingInstances`, `-XIncoherentInstances` or the new `OVERLAP*` pragmas as unsafe, we regard them all as safe and defer the check until an overlap occurs. An type-class method call that involves overlapping instances is considered _unsafe_ when: 1) The most specific instance, Ix, is from a module marked `-XSafe` 2) Ix is an orphan instance or a MPTC 3) At least one instance that Ix overlaps, Iy, is: a) from a different module than Ix AND b) Iy is not marked `OVERLAPPABLE` This check is only enforced in modules compiled with `-XSafe` or `-XTrustworthy`. This fixes Safe Haskell to work with the latest overlapping instance pragmas, and also brings consistent behavior. Previously, Safe Inferred modules behaved differently than `-XSafe` modules.
Diffstat (limited to 'testsuite/tests/safeHaskell/overlapping/all.T')
-rw-r--r--testsuite/tests/safeHaskell/overlapping/all.T62
1 files changed, 62 insertions, 0 deletions
diff --git a/testsuite/tests/safeHaskell/overlapping/all.T b/testsuite/tests/safeHaskell/overlapping/all.T
new file mode 100644
index 0000000000..c253850ac1
--- /dev/null
+++ b/testsuite/tests/safeHaskell/overlapping/all.T
@@ -0,0 +1,62 @@
+# overlapping tests Safe Haskell's handling of overlapping instances.
+
+# Just do the normal way, SafeHaskell is all in the frontend
+def f( name, opts ):
+ opts.only_ways = ['normal']
+
+setTestOpts(f)
+
+test('SH_Overlap1',
+ [ extra_clean(['SH_Overlap1_A.hi', 'SH_Overlap1_A.o',
+ 'SH_Overlap1_B.hi', 'SH_Overlap1_B.o']) ],
+ multimod_compile_fail, ['SH_Overlap1', ''])
+
+test('SH_Overlap2',
+ [ extra_clean(['SH_Overlap2_A.hi', 'SH_Overlap2_A.o',
+ 'SH_Overlap2_B.hi', 'SH_Overlap2_B.o']) ],
+ multimod_compile_fail, ['SH_Overlap2', ''])
+
+test('SH_Overlap3',
+ [ extra_clean(['SH_Overlap3_A.hi', 'SH_Overlap3_A.o',
+ 'SH_Overlap3_B.hi', 'SH_Overlap3_B.o']) ],
+ multimod_compile, ['SH_Overlap3', ''])
+
+test('SH_Overlap4',
+ [ extra_clean(['SH_Overlap4_A.hi', 'SH_Overlap4_A.o',
+ 'SH_Overlap4_B.hi', 'SH_Overlap4_B.o']) ],
+ multimod_compile, ['SH_Overlap4', ''])
+
+test('SH_Overlap5',
+ [ extra_clean(['SH_Overlap5_A.hi', 'SH_Overlap5_A.o',
+ 'SH_Overlap5_B.hi', 'SH_Overlap5_B.o']) ],
+ multimod_compile_fail, ['SH_Overlap5', ''])
+
+test('SH_Overlap6',
+ [ extra_clean(['SH_Overlap6_A.hi', 'SH_Overlap6_A.o',
+ 'SH_Overlap6_B.hi', 'SH_Overlap6_B.o']) ],
+ multimod_compile_fail, ['SH_Overlap6', ''])
+
+test('SH_Overlap7',
+ [ extra_clean(['SH_Overlap7_A.hi', 'SH_Overlap7_A.o',
+ 'SH_Overlap7_B.hi', 'SH_Overlap7_B.o']) ],
+ multimod_compile_fail, ['SH_Overlap7', '-Werror'])
+
+test('SH_Overlap8',
+ [ extra_clean(['SH_Overlap8_A.hi', 'SH_Overlap8_A.o']) ],
+ multimod_compile, ['SH_Overlap8', ''])
+
+test('SH_Overlap9',
+ [ extra_clean(['SH_Overlap9_A.hi', 'SH_Overlap9_A.o',
+ 'SH_Overlap9_B.hi', 'SH_Overlap9_B.o']) ],
+ multimod_compile, ['SH_Overlap9', '-Werror'])
+
+test('SH_Overlap10',
+ [ extra_clean(['SH_Overlap10_A.hi', 'SH_Overlap10_A.o',
+ 'SH_Overlap10_B.hi', 'SH_Overlap10_B.o']) ],
+ multimod_compile, ['SH_Overlap10', '-Werror'])
+
+test('SH_Overlap11',
+ [ extra_clean(['SH_Overlap11_A.hi', 'SH_Overlap11_A.o',
+ 'SH_Overlap11_B.hi', 'SH_Overlap11_B.o']) ],
+ multimod_compile, ['SH_Overlap11', ''])
+