Use HsTyPats in associated type family defaults
authorRyan Scott <ryan.gl.scott@gmail.com>
Sun, 12 May 2019 23:16:37 +0000 (19:16 -0400)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Wed, 22 May 2019 20:56:01 +0000 (16:56 -0400)
commit6efe04dee3f4c584e0cd043b8424718f0791d1be
tree8a69d7500190af046add0b4ae43e3e46b0f330a5
parent2c15b85eb2541a64df0cdf3705fb9aa068634004
Use HsTyPats in associated type family defaults

Associated type family default declarations behave strangely in a
couple of ways:

1. If one tries to bind the type variables with an explicit `forall`,
   the `forall`'d part will simply be ignored. (#16110)
2. One cannot use visible kind application syntax on the left-hand
   sides of associated default equations, unlike every other form
   of type family equation. (#16356)

Both of these issues have a common solution. Instead of using
`LHsQTyVars` to represent the left-hand side arguments of an
associated default equation, we instead use `HsTyPats`, which is what
other forms of type family equations use. In particular, here are
some highlights of this patch:

* `FamEqn` is no longer parameterized by a `pats` type variable, as
  the `feqn_pats` field is now always `HsTyPats`.
* The new design for `FamEqn` in chronicled in
  `Note [Type family instance declarations in HsSyn]`.
* `TyFamDefltEqn` now becomes the same thing as `TyFamInstEqn`. This
  means that many of `TyFamDefltEqn`'s code paths can now reuse the
  code paths for `TyFamInstEqn`, resulting in substantial
  simplifications to various parts of the code dealing with
  associated type family defaults.

Fixes #16110 and #16356.
32 files changed:
compiler/deSugar/DsMeta.hs
compiler/hieFile/HieAst.hs
compiler/hsSyn/Convert.hs
compiler/hsSyn/HsDecls.hs
compiler/hsSyn/HsExtension.hs
compiler/hsSyn/HsInstances.hs
compiler/parser/RdrHsSyn.hs
compiler/rename/RnSource.hs
compiler/typecheck/TcTyClsDecls.hs
docs/users_guide/8.10.1-notes.rst
docs/users_guide/glasgow_exts.rst
testsuite/tests/indexed-types/should_compile/T16110_Compile.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_compile/T16356_Compile1.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_compile/T16356_Compile2.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_compile/T16356_Compile2.stderr [new file with mode: 0644]
testsuite/tests/indexed-types/should_compile/all.T
testsuite/tests/indexed-types/should_fail/SimpleFail4.stderr
testsuite/tests/indexed-types/should_fail/T16110_Fail1.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16110_Fail1.stderr [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16110_Fail2.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16110_Fail2.stderr [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16110_Fail3.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16110_Fail3.stderr [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16356_Fail1.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16356_Fail1.stderr [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16356_Fail2.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16356_Fail2.stderr [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16356_Fail3.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/T16356_Fail3.stderr [new file with mode: 0644]
testsuite/tests/indexed-types/should_fail/all.T
testsuite/tests/typecheck/should_fail/AssocTyDef02.stderr
utils/haddock