From 4fffbc34c024231c3c9fac7a2134896cc09c7fb7 Mon Sep 17 00:00:00 2001 From: David Terei Date: Mon, 11 May 2015 16:05:37 -0700 Subject: 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. --- testsuite/tests/safeHaskell/overlapping/all.T | 62 +++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 testsuite/tests/safeHaskell/overlapping/all.T (limited to 'testsuite/tests/safeHaskell/overlapping/all.T') 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', '']) + -- cgit v1.2.1