Expand type/kind synonyms in TyVars before deriving-related typechecking
authorRyanGlScott <ryan.gl.scott@gmail.com>
Fri, 15 Jan 2016 16:42:02 +0000 (17:42 +0100)
committerBen Gamari <ben@smart-cactus.org>
Fri, 15 Jan 2016 16:42:04 +0000 (17:42 +0100)
commit165ae440b6bbf577eabf0b6d422ed6ea3bf949b4
tree79f1c08b9c491441cb548dc4b22c514d106ea414
parent443bf04485f997be2e3a744102605645c54e9d61
Expand type/kind synonyms in TyVars before deriving-related typechecking

Before, it was possible to have a datatypes such as

```
type ConstantT a b = a
newtype T (f :: * -> *) (a :: ConstantT * f) = T (f a) deriving Functor

data family TFam (f :: * -> *) (a :: *)
newtype instance TFam f (ConstantT a f) = TFam (f a) deriving Functor
```

fail to eta-reduce because either (1) a TyVar had a kind synonym that
mentioned another TyVar, or (2) an instantiated type was itself a type
synonym that mentioned another TyVar. A little bit of tweaking to
`expandTypeSynonyms` and applying it before the eta-reduction check in
the `deriving` machinery is sufficient to fix this.

Fixes #11416.

Test Plan: ./validate

Reviewers: goldfire, simonpj, austin, bgamari

Reviewed By: simonpj

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1772

GHC Trac Issues: #11416
compiler/typecheck/TcDeriv.hs
compiler/types/Type.hs
testsuite/tests/deriving/should_compile/T11416.hs [new file with mode: 0644]
testsuite/tests/deriving/should_compile/all.T