Skip to content
  • Simon Peyton Jones's avatar
    A raft of changes driven by Trac #8540 · 78814882
    Simon Peyton Jones authored
    The root cause of #8450 is that the new Template Haskell story, with
    the renamer doing more of the work of Template Haskell, wasn't dealing
    correctly with the keepAlive problem.  Consider
        g = ..blah...
        f = [| g |]
    Then f's RHS refers to g's name but not to g, so g was being discarded
    as dead code.
    
    Fixing this sucked me into a deep swamp of understanding how all the moving
    parts of hte new Template Haskell fit together, leading to a large collection
    of related changes and better documentation.  Specifically:
    
    * Instead of putting the TH level of a binder in the LocalRdrEnv, there
      is now a separate field
          tcl_th_bndrs :: NameEnv (TopLevelFlag, ThLevel)
      in the TcLclEnv, which records for each binder
         a) whether it is syntactically a top-level binder or not
         b) its TH level
      This deals uniformly with top-level and non-top-level binders, which was
      previously dealt with via greviously-delicate meddling with Internal and
      External Names.  Much better.
    
    * As a result I could remove the tct_level field of ATcId.
    
    * There are consequential changes in TcEnv too, which must also extend the
      level bindings.  Again, more clarity.
    
      I renamed TcEnv.tcExtendTcTyThingEnv to tcExtendKindEnv2, since it's only used
      during kind inference, for (AThing kind) and APromotionErr; and that is
      relevant to whether we want to extend the tcl_th_bndrs field (no).
    
    * I de-crufted the code in RnEnv.extendGlobalRdrEnv, by getting rid of the
      qual_gre code which said "Seems like 5 times as much work as it deserves!".
      Instead, RdrName.pickGREs makes the Internal names shadow External ones.
    
    * I moved the checkThLocalName cross-stage test to finishHsVar; previously
      we weren't doing the test at all in the OpApp case!
    
    * Quite a few changes (shortening the code) in the cross-stage checking code
      in TcExpr and RnSplice, notably to move the keepAlive call to the renamer
    
    One leftover piece:
    
    * In TcEnv I removed tcExtendGhciEnv and refactored
      tcExtendGlobalTyVars; this is really related to the next commit, but
      it was too hard to disentangle.
    78814882