[GHC] #12035: hs-boot knot tying insufficient for ghc --make

GHC ghc-devs at haskell.org
Tue May 10 09:47:18 UTC 2016


#12035: hs-boot knot tying insufficient for ghc --make
-------------------------------------+-------------------------------------
           Reporter:  ezyang         |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.1
  (Type checker)                     |
           Keywords:  hs-boot        |  Operating System:  Unknown/Multiple
  backpack                           |
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 GHC in one-shot mode goes through great pains to make sure that if we are
 typechecking A.hs with an A.hs-boot, any references to A in the interfaces
 we load in should point to the `TyThing`s from our LOCAL `tcg_type_env`
 (`_var`), not the declarations from the `hs-boot`. Indeed, it is never
 right to load the hi-boot file into the EPS (#10182, #10336). Because in
 one-shot compilation we are loading things into the EPS anew, there is not
 much risk of having stale `TyThing`s lying around which still refer to the
 old `hs-boot` ModDetails.

 `ghc --make` does not do a sufficient job as knot tying. Specifically, any
 `Id`s/`TyThing`s from the HPT which were built against the `hs-boot`
 ModDetails will have out-of-date information. We do manage to tie the knot
 if we use `tcLookupGlobal` directly, which does look in the local type
 environment (e.g., #12034 affects both `-c` and `--make`), but if we get
 our hands on a `TyThing` indirectly, we're in trouble. The case where this
 is most obvious is unfoldings; see #10083 for an example of GHC behaving
 differently between `-c` and `--make` (although, ironically, `--make`s bad
 behavior masks the bug).

 It's not entirely clear how to fix this problem. In analogy to what
 happens in `-c`, we should clear the stale `TyThing`s from our HPT and
 retypecheck them after we have setup the type environment for our `hs`
 file.  But presently in `--make` we don't lazily load types from our home
 package. Maybe we should!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12035>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list