Make equality constraints in kinds invisible
authorRyan Scott <ryan.gl.scott@gmail.com>
Tue, 30 Apr 2019 15:28:41 +0000 (11:28 -0400)
committerÖmer Sinan Ağacan <omeragacan@gmail.com>
Fri, 3 May 2019 18:54:50 +0000 (21:54 +0300)
commitcc495d5777c01ef62129df15caacf87b0e430c6b
tree98367d77415752a0b21e0bcb9a5cacd233de32c5
parent87bc954ab65aaf08b4f59cf46bd2916acd69ea73
Make equality constraints in kinds invisible

Issues #12102 and #15872 revealed something strange about the way GHC
handles equality constraints in kinds: it treats them as _visible_
arguments! This causes a litany of strange effects, from strange
error messages
(https://gitlab.haskell.org/ghc/ghc/issues/12102#note_169035)
to bizarre `Eq#`-related things leaking through to GHCi output, even
without any special flags enabled.

This patch is an attempt to contain some of this strangeness.
In particular:

* In `TcHsType.etaExpandAlgTyCon`, we propagate through the
  `AnonArgFlag`s of any `Anon` binders. Previously, we were always
  hard-coding them to `VisArg`, which meant that invisible binders
  (like those whose kinds were equality constraint) would mistakenly
  get flagged as visible.
* In `ToIface.toIfaceAppArgsX`, we previously assumed that the
  argument to a `FunTy` always corresponding to a `Required`
  argument. We now dispatch on the `FunTy`'s `AnonArgFlag` and map
  `VisArg` to `Required` and `InvisArg` to `Inferred`. As a
  consequence, the iface pretty-printer correctly recognizes that
  equality coercions are inferred arguments, and as a result,
  only displays them in `-fprint-explicit-kinds` is enabled.
* Speaking of iface pretty-printing, `Anon InvisArg` binders were
  previously being pretty-printed like `T (a :: b ~ c)`, as if they
  were required. This seemed inconsistent with other invisible
  arguments (that are printed like `T @{d}`), so I decided to switch
  this to `T @{a :: b ~ c}`.

Along the way, I also cleaned up a minor inaccuracy in the users'
guide section for constraints in kinds that was spotted in
https://gitlab.haskell.org/ghc/ghc/issues/12102#note_136220.

Fixes #12102 and #15872.
12 files changed:
compiler/iface/IfaceType.hs
compiler/iface/ToIface.hs
compiler/typecheck/TcHsType.hs
compiler/types/TyCon.hs
docs/users_guide/glasgow_exts.rst
testsuite/tests/ghci/scripts/T15872.hs [new file with mode: 0644]
testsuite/tests/ghci/scripts/T15872.script [new file with mode: 0644]
testsuite/tests/ghci/scripts/T15872.stdout [new file with mode: 0644]
testsuite/tests/ghci/scripts/all.T
testsuite/tests/typecheck/should_fail/T12102b.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_fail/T12102b.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_fail/all.T