[GHC] #11824: GHC error in desugarer lookup

Simon Peyton Jones simonpj at microsoft.com
Fri Apr 15 11:56:32 UTC 2016


|  If the latter there is no reason to fear: TcBinds.addTypecheckedBinds
|  (which TcTypeable uses) ensures that no bindings are added to the
|  environment if we are compiling a boot module,

Ah, I had missed that; it's pretty deeply hidden.

Suggestion:

* Move tcRecSelBinds from tcAddImplicits, to mkTypeableBinds.
  More precisely, make a new function addDerivedBindings, which
    * add record-selector bindings (via tcRecSelBinds)
    * adds typeable bindings (via mkTypableBinds)
  and call it where we currently call mkTypeableBinds.

* Instead of burying the "drop the bindings" deep in addTypecheckedBinds,
  inline it into addDerivedBindings:
   - make mkTypeableBinds *return* bindings rather than extending gbl-env
   - ditto tcRecSelBinds
  Then addDerivedBinds can test hs-boot, and extend the tcg_binds if necessary

That would put the two together nicely, they really are very similar.


I'm not bothered about the cost of generating bindings and then discarding them; it only happens for hs-boot files.  I _am_ concerned about clarity!

Thanks!

Simon

|  -----Original Message-----
|  From: Ben Gamari [mailto:ben at well-typed.com]
|  Sent: 13 April 2016 14:53
|  To: Simon Peyton Jones <simonpj at microsoft.com>
|  Cc: GHC developers <ghc-devs at haskell.org>
|  Subject: RE: [GHC] #11824: GHC error in desugarer lookup
|  
|  Simon Peyton Jones <simonpj at microsoft.com> writes:
|  
|  > Ben
|  >
|  > I'm offline, so can't reply on Phab.
|  >
|  > Calling mkTypeableBinds in tcRnHsBootDecls isn't quite right, because
|  it'll generate lots of *bindings* whereas all we want is the *Ids* in
|  the GlobalValEnv.
|  >
|  > (It's possible that tcg_binds is ignored in the boot-module case, but
|  > it's unsavoury to generate the bindings at all.  They are generated
|  > when we process the main module.)
|  >
|  > I suggest the easiest fix is, in mkModIdBinding and
|  mkTypeableTyConBinds, guard the binding-generation with a test for
|  whether isHsBootOrSig is true.
|  >
|  Are you concerned about the bindings being generated at all or merely
|  that they are being added to the typechecking environment?
|  
|  If the latter there is no reason to fear: TcBinds.addTypecheckedBinds
|  (which TcTypeable uses) ensures that no bindings are added to the
|  environment if we are compiling a boot module,
|  
|      addTypecheckedBinds :: TcGblEnv -> [LHsBinds Id] -> TcGblEnv
|      addTypecheckedBinds tcg_env binds
|        | isHsBootOrSig (tcg_src tcg_env) = tcg_env
|          -- Do not add the code for record-selector bindings
|          -- when compiling hs-boot files
|        | otherwise = tcg_env { tcg_binds = foldr unionBags
|                                                  (tcg_binds tcg_env)
|                                                  binds }
|  
|  Of course, we are still doing the work of producing the bindings; if it
|  is this that you are concerned about then I can be more careful in
|  guarding their production.
|  
|  Cheers,
|  
|  - Ben


More information about the ghc-devs mailing list