[GHC] #8450: can't match type Bool with (), but shouldn't have to

GHC ghc-devs at haskell.org
Fri Nov 22 16:39:21 UTC 2013


#8450: can't match type Bool with (), but shouldn't have to
------------------------------------------------+--------------------------
        Reporter:  dmwit                        |            Owner:
            Type:  feature request              |           Status:  closed
        Priority:  normal                       |        Milestone:
       Component:  Compiler                     |          Version:  7.6.3
      Resolution:  fixed                        |         Keywords:
Operating System:  Unknown/Multiple             |     Architecture:
 Type of failure:  None/Unknown                 |  Unknown/Multiple
       Test Case:  typecheck/should_fail/T8450  |       Difficulty:
        Blocking:                               |  Unknown
                                                |       Blocked By:
                                                |  Related Tickets:
------------------------------------------------+--------------------------

Comment (by Simon Peyton Jones <simonpj@…>):

 In [changeset:"7881488201629aa1ab36e3e0fbeb4d7b4b85bd91/ghc"]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="7881488201629aa1ab36e3e0fbeb4d7b4b85bd91"
 A raft of changes driven by Trac #8540

 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.
 }}}

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


More information about the ghc-tickets mailing list