Implicitly bind kind variables in type family instance RHSes when it's sensible
authorRyan Scott <ryan.gl.scott@gmail.com>
Tue, 5 Sep 2017 15:00:56 +0000 (11:00 -0400)
committerRyan Scott <ryan.gl.scott@gmail.com>
Tue, 5 Sep 2017 15:00:57 +0000 (11:00 -0400)
commit0829821a6b886788a3ba6989e57e25a037bb6d05
tree115a892a6df20303a7f0b65009f7afa589c14d2d
parent24e50f988f775c6bba7d1daaee2e23c13650aa3b
Implicitly bind kind variables in type family instance RHSes when it's sensible

Summary:
Before, there was a discrepancy in how GHC renamed type synonyms as
opposed to type family instances. That is, GHC would accept definitions like
this one:

```lang=haskell
type T = (Nothing :: Maybe a)
```

However, it would not accept a very similar type family instance:

```lang=haskell
type family   T :: Maybe a
type instance T = (Nothing :: Maybe a)
```

The primary goal of this patch is to bring the renaming of type family
instances up to par with that of type synonyms, causing the latter definition
to be accepted, and fixing #14131.

In particular, we now allow kind variables on the right-hand sides of type
(and data) family instances to be //implicitly// bound by LHS type (or kind)
patterns (as opposed to type variables, which must always be explicitly
bound by LHS type patterns only). As a consequence, this allows programs
reported in #7938 and #9574 to typecheck, whereas before they would
have been rejected.

Implementation-wise, there isn't much trickery involved in making this happen.
We simply need to bind additional kind variables from the RHS of a type family
in the right place (in particular, see `RnSource.rnFamInstEqn`, which has
undergone a minor facelift).

While doing this has the upside of fixing #14131, it also made it easier to
trigger #13985, so I decided to fix that while I was in town. This was
accomplished by a careful blast of `reportFloatingKvs` in `tcFamTyPats`.

Test Plan: ./validate

Reviewers: simonpj, goldfire, austin, bgamari

Reviewed By: simonpj

Subscribers: rwbarton, thomie

GHC Trac Issues: #13985, #14131

Differential Revision: https://phabricator.haskell.org/D3872
16 files changed:
compiler/rename/RnSource.hs
compiler/rename/RnTypes.hs
compiler/typecheck/TcHsType.hs
compiler/typecheck/TcTyClsDecls.hs
docs/users_guide/8.4.1-notes.rst
docs/users_guide/glasgow_exts.rst
testsuite/tests/indexed-types/should_compile/T14131.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_compile/all.T
testsuite/tests/indexed-types/should_fail/T5515.stderr
testsuite/tests/indexed-types/should_fail/T7938.stderr
testsuite/tests/parser/should_compile/DumpRenamedAst.hs
testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
testsuite/tests/polykinds/T13985.hs [new file with mode: 0644]
testsuite/tests/polykinds/T13985.stderr [new file with mode: 0644]
testsuite/tests/polykinds/T9574.stderr [deleted file]
testsuite/tests/polykinds/all.T