Make error when deriving an instance for a typeclass less misleading
authorRyan Scott <ryan.gl.scott@gmail.com>
Fri, 14 Oct 2016 14:40:56 +0000 (10:40 -0400)
committerBen Gamari <ben@smart-cactus.org>
Fri, 14 Oct 2016 17:27:33 +0000 (13:27 -0400)
commitd5a4e49d657682eeb6e86ae464d281974ce2f5e2
tree215c7bbafcd067a758c4793aed7d0d581e82a4a9
parent8c6a3d68c0301bb985aa2a462936bbcf7584ae9c
Make error when deriving an instance for a typeclass less misleading

Before, when you attempted to derive an instance for a typeclass,
e.g.,

```
class C1 (a :: Constraint) where
class C2 where

deriving instance C1 C2
```

GHC would complain that `C2`'s data constructors aren't in scope. But
that
makes no sense, since typeclasses don't have constructors! By refining
the
checks that GHC performs when deriving, we can make the error message a
little more sensible.

This also cleans up a related `DeriveAnyClass` infelicity. Before, you
wouldn't have been able to compile code like this:

```
import System.IO (Handle)
class C a
deriving instance C Handle
```

Since GHC was requiring that all data constructors of `Handle` be in
scope. But `DeriveAnyClass` doesn't even generate code that mentions
any data constructors, so this requirement is silly!

Fixes #11509.

Test Plan: make test TEST=T11509

Reviewers: simonpj, austin, bgamari

Reviewed By: simonpj, bgamari

Subscribers: thomie, simonpj

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

GHC Trac Issues: #11509
compiler/typecheck/TcDeriv.hs
compiler/typecheck/TcDerivUtils.hs
docs/users_guide/8.2.1-notes.rst
docs/users_guide/glasgow_exts.rst
testsuite/tests/deriving/should_compile/T11509_2.hs [new file with mode: 0644]
testsuite/tests/deriving/should_compile/T11509_3.hs [new file with mode: 0644]
testsuite/tests/deriving/should_compile/all.T
testsuite/tests/deriving/should_fail/T11509_1.hs [new file with mode: 0644]
testsuite/tests/deriving/should_fail/T11509_1.stderr [new file with mode: 0644]
testsuite/tests/deriving/should_fail/all.T