summaryrefslogtreecommitdiff
path: root/testsuite/tests/generics/all.T
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2016-06-23 14:51:22 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2016-06-24 11:04:21 +0100
commitd2958bd08a049b61941f078e51809c7e63bc3354 (patch)
treece836b88f13dae393870999e23ad21f0507ff8ab /testsuite/tests/generics/all.T
parentdf9611ee5c056066fe88fe3ef2f64382cec8b741 (diff)
downloadhaskell-d2958bd08a049b61941f078e51809c7e63bc3354.tar.gz
Improve typechecking of instance defaults
In an instance declaration when you don't specify the code for a method, GHC fills in from the default binding in the class. The type of the default method can legitmiately be ambiguous --- see Note [Default methods in instances] in TcInstDcls --- so typechecking it can be tricky. Trac #12220 showed that although we were dealing with that ambiguity for /vanilla/ default methods, we were not doing so for /generic/ default methods. Moreover we were dealing with it clumsily, by generating post-typechecked code. This patch fixes the bug AND deletes code! We now use the same code path for both vanilla and generic default methods; and generate /pre-typechecked/ code in both cases. The key trick is that we can use Visible Type Application to deal with the ambiguity, which wasn't possible before. Hooray. There is a small hit to performance in compiler/perf/T1969 which consists of nothing BUT instance declarations with several default methods to fill, which we now have to typecheck. The actual hit is from 724 -> 756 or 4% in that extreme example. Real world programs have vastly fewer instance decls.
Diffstat (limited to 'testsuite/tests/generics/all.T')
-rw-r--r--testsuite/tests/generics/all.T1
1 files changed, 1 insertions, 0 deletions
diff --git a/testsuite/tests/generics/all.T b/testsuite/tests/generics/all.T
index cae975c89e..6bf949fc3b 100644
--- a/testsuite/tests/generics/all.T
+++ b/testsuite/tests/generics/all.T
@@ -45,3 +45,4 @@ test('T10030', normal, compile_and_run, [''])
test('T10361a', normal, compile, [''])
test('T10361b', normal, compile, [''])
test('T11358', normal, compile_and_run, [''])
+test('T12220', normal, compile, [''])