[GHC] #14108: GHCi doesn't remember let-less function declarations with -fobject-code
GHC
ghc-devs at haskell.org
Mon Aug 14 16:30:27 UTC 2017
#14108: GHCi doesn't remember let-less function declarations with -fobject-code
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHCi | Version: 8.2.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: GHC rejects | Unknown/Multiple
valid program | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by RyanGlScott):
I believe I've identified the culprit. It turns out that the binding for
`foo2` is discarded entirely during desugaring—in particular, the function
[http://git.haskell.org/ghc.git/blob/c6462ab02882779d7e33f2cac00cd89a9ac192f1:/compiler/deSugar/Desugar.hs#l280
addExportFlagsAndRules] is to blame. Normally, the `HscTarget` argument is
`HscInterpreted`, on which `targetRetainsAllBindings` returns `True`,
causing `addExportFlagsAndRules` to set the `foo2` `Id` as exported.
However, when the `HscTarget` argument is, say, `HscAsm` (which can happen
when `-fobject-code` is enabled), then `targetRetainsAllBindings` returns
`False`. As a result, `addExportFlagsAndRules` checks if the `foo2` `Id`
is contained in either the `keep_alive` or `exported` sets—but in GHCi,
both of those are always empty, so `foo2` isn't marked as exported,
causing the desugarer to discard it later. Bummer.
This makes me believe that we should alter `addExportFlagsAndRules` so
that it always marks local bindings as exported when we're in an
interactive module (i.e., in GHCi). I'll experiment with this approach.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14108#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list