Instantiate GND bindings with an explicit type signature
authorRyan Scott <ryan.gl.scott@gmail.com>
Thu, 5 Jul 2018 12:30:05 +0000 (08:30 -0400)
committerRyan Scott <ryan.gl.scott@gmail.com>
Thu, 5 Jul 2018 12:48:16 +0000 (08:48 -0400)
commit132273f34e394bf7e900d0c15e01e91edd711890
treef9de2ec8726a85cb8baa90691295e18a86194eb1
parent93b7ac8d73885369f61f6eb6147352d45de4e957
Instantiate GND bindings with an explicit type signature

Summary:
Before, we were using visible type application to apply
impredicative types to `coerce` in
`GeneralizedNewtypeDeriving`-generated bindings. This approach breaks
down when combined with `QuantifiedConstraints` in certain ways,
which #14883 and #15290 provide examples of. See
Note [GND and QuantifiedConstraints] for all the gory details.

To avoid this issue, we instead use an explicit type signature to
instantiate each GND binding, and use that to bind any type variables
that might be bound by a class method's type signature. This reduces
the need to impredicative type applications, and more importantly,
makes the programs from #14883 and #15290 work again.

Test Plan: make test TEST="T15290b T15290c T15290d T14883"

Reviewers: simonpj, bgamari

Reviewed By: simonpj

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #14883, #15290

Differential Revision: https://phabricator.haskell.org/D4895
compiler/hsSyn/HsUtils.hs
compiler/rename/RnSource.hs
compiler/typecheck/TcGenDeriv.hs
testsuite/tests/deriving/should_compile/T14578.stderr
testsuite/tests/deriving/should_compile/T14883.hs [new file with mode: 0644]
testsuite/tests/deriving/should_compile/T15290c.hs [new file with mode: 0644]
testsuite/tests/deriving/should_compile/T15290d.hs [new file with mode: 0644]
testsuite/tests/deriving/should_compile/all.T
testsuite/tests/deriving/should_fail/T15073.stderr
testsuite/tests/deriving/should_fail/T4846.stderr