diff options
author | David Terei <code@davidterei.com> | 2015-05-11 16:05:37 -0700 |
---|---|---|
committer | David Terei <code@davidterei.com> | 2015-05-11 18:21:11 -0700 |
commit | 4fffbc34c024231c3c9fac7a2134896cc09c7fb7 (patch) | |
tree | a4b775d9f04997c2834303b2249dcae5ac42c642 /testsuite/tests/safeHaskell/overlapping/all.T | |
parent | eecef1733d5de342383665943b955bc1c96472f4 (diff) | |
download | haskell-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.T | 62 |
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', '']) + |