Fix DeriveAnyClass (Trac #9968)
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 9 Dec 2015 09:07:46 +0000 (09:07 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 9 Dec 2015 09:10:03 +0000 (09:10 +0000)
commitaf77089b08b60c00128f0e5a65d18211ea62dfee
tree24b1cea69a62959ef823a07762f4e293be6bed0a
parent31bddc42c24726a82e221c68df043703caeb42f4
Fix DeriveAnyClass (Trac #9968)

The main issue concerned things like

   data T a = MkT a deriving( C Int )

which is supposed to generate

   instance C Int (T a) where {}

But the 'Int' argument (called cls_tys in the code) wasn't
even being passed to inferConstraints and mk_data_eqn, so it
really had no chance.   DeriveAnyClass came along after this
code was written!

Anyway I did quite a bit of tidying up in inferConstraints.

Also I discovered that this case was not covered at all

   data T a b = MkT a b deriving( Bifunctor )

What constraints should we generate for the instance context?
We can deal with classes whose last arg has kind *, like Eq, Ord;
or (* -> *), like Functor, Traversable.  But we really don't have
a story for classes whose last arg has kind (* -> * -> *).

So I augmented checkSideConditions to check for that and give
a sensible error message.

ToDo: update the user manual.
compiler/typecheck/TcDeriv.hs
compiler/typecheck/TcGenDeriv.hs
testsuite/tests/deriving/should_compile/T9968.hs [new file with mode: 0644]
testsuite/tests/deriving/should_compile/all.T
testsuite/tests/deriving/should_fail/T9968a.hs [new file with mode: 0644]
testsuite/tests/deriving/should_fail/T9968a.stderr [new file with mode: 0644]
testsuite/tests/deriving/should_fail/all.T