Custom `Typeable` solver, that keeps track of kinds.
authorIavor S. Diatchki <diatchki@galois.com>
Sat, 7 Mar 2015 16:37:31 +0000 (10:37 -0600)
committerAustin Seipp <austin@well-typed.com>
Sat, 7 Mar 2015 16:38:30 +0000 (10:38 -0600)
commitb359c886cd7578ed083bcedcea05d315ecaeeb54
treebb1959149dde78d29614966131841a77fa38bbab
parent479523f3c37894d63352f1718e06696f3ed63143
Custom `Typeable` solver, that keeps track of kinds.

Summary:
This implements the new `Typeable` solver: when GHC sees `Typeable` constraints
it solves them on the spot.

The current implementation creates `TyCon` representations on the spot.

Pro: No overhead at all in code that does not use `Typeable`
Cons: Code that uses `Typeable` may create multipe `TyCon` represntations.

We have discussed an implementation where representations of `TyCons` are
computed once, in the module, where a datatype is declared.  This would
lead to more code being generated:  for a promotable datatype we need to
generate `2 + number_of_data_cons` type-constructro representations,
and we have to do that for all programs, even ones that do not intend to
use typeable.

I added code to emit warning whenevar `deriving Typeable` is encountered---
the idea being that this is not needed anymore, and shold be fixed.

Also, we allow `instance Typeable T` in .hs-boot files, but they result
in a warning, and are ignored.  This last one was to avoid breaking exisitng
code, and should become an error, eventually.

Test Plan:
1. GHC can compile itself.
2. I compiled a number of large libraries, including `lens`.
    - I had to make some small changes:
      `unordered-containers` uses internals of `TypeReps`, so I had to do a 1 line fix
    - `lens` needed one instance changed, due to a poly-kinded `Typeble` instance

3. I also run some code that uses `syb` to traverse a largish datastrucutre.
I didn't notice any signifiant performance difference between the 7.8.3 version,
and this implementation.

Reviewers: simonpj, simonmar, austin, hvr

Reviewed By: austin, hvr

Subscribers: thomie

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

GHC Trac Issues: #9858
31 files changed:
compiler/basicTypes/MkId.hs
compiler/deSugar/DsBinds.hs
compiler/main/DynFlags.hs
compiler/prelude/PrelNames.hs
compiler/typecheck/TcDeriv.hs
compiler/typecheck/TcEvidence.hs
compiler/typecheck/TcGenDeriv.hs
compiler/typecheck/TcHsSyn.hs
compiler/typecheck/TcInstDcls.hs
compiler/typecheck/TcInteract.hs
docs/users_guide/flags.xml
docs/users_guide/glasgow_exts.xml
libraries/base/Data/Data.hs
libraries/base/Data/Typeable/Internal.hs
testsuite/tests/annotations/should_fail/annfail10.stderr
testsuite/tests/deriving/should_compile/all.T
testsuite/tests/deriving/should_fail/T2604.hs [deleted file]
testsuite/tests/deriving/should_fail/T2604.stderr [deleted file]
testsuite/tests/deriving/should_fail/T5863a.hs [deleted file]
testsuite/tests/deriving/should_fail/T5863a.stderr [deleted file]
testsuite/tests/deriving/should_fail/T7800.hs [deleted file]
testsuite/tests/deriving/should_fail/T7800.stderr [deleted file]
testsuite/tests/deriving/should_fail/T7800a.hs [deleted file]
testsuite/tests/deriving/should_fail/T9687.stderr
testsuite/tests/deriving/should_fail/all.T
testsuite/tests/ghci.debugger/scripts/print019.stderr
testsuite/tests/polykinds/T8132.stderr
testsuite/tests/typecheck/should_compile/T9999.hs [deleted file]
testsuite/tests/typecheck/should_compile/all.T
testsuite/tests/typecheck/should_fail/TcStaticPointersFail02.stderr
testsuite/tests/typecheck/should_fail/all.T