Refactor typechecking of pattern bindings
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 31 Aug 2016 08:28:39 +0000 (09:28 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 21 Oct 2016 16:07:44 +0000 (17:07 +0100)
commit45bfd1a65978ee282d8d2cc1ddb7e3e5f4cd4717
tree46ceaa6088e7745ced922621819defeb504843f3
parentff225b4957ded752dc017446fccb9708a1f4ec56
Refactor typechecking of pattern bindings

This patch fixes a regression introduced, post 8.0.1, by
this major commit:

     commit 15b9bf4ba4ab47e6809bf2b3b36ec16e502aea72
     Author: Simon Peyton Jones <simonpj@microsoft.com>
     Date:   Sat Jun 11 23:49:27 2016 +0100

         Improve typechecking of let-bindings

         This major commit was initially triggered by #11339, but it
         spiraled into a major review of the way in which type
         signatures for bindings are handled, especially partial type
         signatures.

I didn't get the typechecking of pattern bindings right, leading
to Trac #12427.

In fixing this I found that this program doesn't work:

  data T where
    T :: a -> ((forall b. [b]->[b]) -> Int) -> T

  h1 y = case y of T _ v -> v

Works in 7.10, but not in 8.0.1.

There's a happy ending. I found a way to fix this, and improve
pattern bindings too.  Not only does this fix #12427, but it also
allows

In particular,we now can accept

  data T where MkT :: a -> Int -> T

  ... let { MkT _ q = t } in ...

Previously this elicited "my head exploded" but it's really
fine since q::Int.

The approach is described in detail in TcBinds
   Note [Typechecking pattern bindings]
Super cool.  And not even a big patch!
compiler/typecheck/TcBinds.hs
compiler/typecheck/TcPat.hs
testsuite/tests/typecheck/should_compile/T12427a.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/T12427b.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/all.T