[GHC] #14963: ghci -fdefer-type-errors can't run IO action from another module
GHC
ghc-devs at haskell.org
Mon Jun 11 11:33:26 UTC 2018
#14963: ghci -fdefer-type-errors can't run IO action from another module
-------------------------------------+-------------------------------------
Reporter: elaforge | Owner: tdammers
Type: bug | Status: new
Priority: high | Milestone: 8.4.2
Component: GHCi | Version: 8.4.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by tdammers):
I've done some more dumping. The situation can be traced back to the
desugar phase at least.
In all 4 test cases, I did the same thing:
- start up `ghci` on the `Foo.hs` module, with `-fforce-recomp -ddump-ds
-dsuppress-all`; adding `-fdefer-type-errors` or not depending on the test
case.
- depending on the test case, `:set -fno-defer-type-errors` or `-fdefer-
type-errors` to override the command-line setting
- evaluate `test` in `ghci`
It turns out that the desugared output is almost entirely identical (save
for mismatching Uniques), except for the final GHCI invocation of `test`.
The desugared output for that is identical between the three cases that
involve deferred type errors anywhere, but different for the case that
doesn't defer type errors anywhere. To wit:
With deferred type errors in either or both module compilation and
interactive
session:
{{{
==================== Desugared ====================
bindIO
(let {
$dShow_a1Rt
$dShow_a1Rt = $fShowInt } in
(\ @ a_a1Dg ->
let {
$dGHCiSandboxIO_a1Di
$dGHCiSandboxIO_a1Di = $fGHCiSandboxIOIO } in
ghciStepIO $dGHCiSandboxIO_a1Di)
test)
(\ it_a1CU ->
thenIO
(print $dShow_a1Rt it_a1CU)
(returnIO (: (unsafeCoerce# it_a1CU) [])))
}}}
Without deferred type errors:
{{{
==================== Desugared ====================
let {
$dShow_a1Rq
$dShow_a1Rq = $fShowInt } in
bindIO
((\ @ a_a1De ->
let {
$dGHCiSandboxIO_a1Dg
$dGHCiSandboxIO_a1Dg = $fGHCiSandboxIOIO } in
ghciStepIO $dGHCiSandboxIO_a1Dg)
test)
(\ it_a1CT ->
thenIO
(print $dShow_a1Rq it_a1CT)
(returnIO (: (unsafeCoerce# it_a1CT) [])))
}}}
Ignoring uniques entirely, the only real difference is whether or not the
`dShow...` binding is floated out.
So the questions are: why does it get floated out when type errors are
deferred; and how does that lead to GHC calling `nameModule` on the
`dShow...` part.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14963#comment:28>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list