Remove the type-checking knot.
authorRichard Eisenberg <rae@cs.brynmawr.edu>
Tue, 17 Jul 2018 04:12:34 +0000 (00:12 -0400)
committerBen Gamari <ben@smart-cactus.org>
Thu, 2 Aug 2018 00:54:11 +0000 (20:54 -0400)
commit59f38587d44efd00b10a6d98f6a7a1b22e87f13a
tree9220a579b67ab588fc16ac78a04048fdc79fdefa
parentff086cc10da176ca16a349969f0b8a049cc691ef
Remove the type-checking knot.

Bug #15380 hangs because a knot-tied TyCon ended up in a kind.
Looking at the code in tcInferApps, I'm amazed this hasn't happened
before! I couldn't think of a good way to fix it (with dependent
types, we can't really keep types out of kinds, after all), so
I just went ahead and removed the knot.

This was remarkably easy to do. In tcTyVar, when we find a TcTyCon,
just use it. (Previously, we looked up the knot-tied TyCon and used
that.) Then, during the final zonk, replace TcTyCons with the real,
full-blooded TyCons in the global environment. It's all very easy.

The new bit is explained in the existing
Note [Type checking recursive type and class declarations]
in TcTyClsDecls.

Naturally, I removed various references to the knot and the
zonkTcTypeInKnot (and related) functions. Now, we can print types
during type checking with abandon!

NB: There is a teensy error message regression with this patch,
around the ordering of quantified type variables. This ordering
problem is fixed (I believe) with the patch for #14880. The ordering
affects only internal variables that cannot be instantiated with
any kind of visible type application.

There is also a teensy regression around the printing of types
in TH splices. I think this is really a TH bug and will file
separately.

Test case: dependent/should_fail/T15380

(cherry picked from commit f8618a9b15177ee8c84771b927cb3583c9cd8408)
21 files changed:
compiler/basicTypes/DataCon.hs
compiler/iface/BuildTyCl.hs
compiler/typecheck/FamInst.hs
compiler/typecheck/TcEnv.hs
compiler/typecheck/TcHsSyn.hs
compiler/typecheck/TcHsType.hs
compiler/typecheck/TcMType.hs
compiler/typecheck/TcTyClsDecls.hs
compiler/typecheck/TcType.hs
compiler/types/TyCoRep.hs
compiler/types/TyCon.hs
compiler/types/Type.hs
testsuite/tests/dependent/should_compile/T14066a.stderr
testsuite/tests/dependent/should_fail/T15380.hs [new file with mode: 0644]
testsuite/tests/dependent/should_fail/T15380.stderr [new file with mode: 0644]
testsuite/tests/dependent/should_fail/all.T
testsuite/tests/ghci/scripts/T6018ghcifail.stderr
testsuite/tests/polykinds/T7524.stderr
testsuite/tests/th/T10267.stderr
testsuite/tests/typecheck/should_fail/T6018fail.stderr
testsuite/tests/typecheck/should_fail/T6018failclosed.stderr