Skip to content
  • Edward Z. Yang's avatar
    Make use of boot TyThings during typechecking. · 69987720
    Edward Z. Yang authored
    
    
    Summary:
    Suppose that you are typechecking A.hs, which transitively imports,
    via B.hs, A.hs-boot.  When we poke on B.hs and discover that it
    has a reference to a type from A, what TyThing should we wire
    it up with?  Clearly, if we have already typechecked A, we
    should use the most up-to-date TyThing: the one we freshly
    generated when we typechecked A.  But what if we haven't typechecked
    it yet?
    
    For the longest time, GHC adopted the policy that this was
    *an error condition*; that you MUST NEVER poke on B.hs's reference
    to a thing defined in A.hs until A.hs has gotten around to checking
    this.  However, actually ensuring this is the case has proven
    to be a bug farm.  The problem was especially poignant with
    type family consistency checks, which eagerly happen before
    any typechecking takes place.
    
    This patch takes a different strategy: if we ever try to access
    an entity from A which doesn't exist, we just fall back on the
    definition of A from the hs-boot file.  This means that you may
    end up with a mix of A.hs and A.hs-boot TyThings during the
    course of typechecking.
    
    Signed-off-by: default avatarEdward Z. Yang <ezyang@fb.com>
    
    Test Plan: validate
    
    Reviewers: simonpj, bgamari, austin, goldfire
    
    Subscribers: thomie, rwbarton
    
    GHC Trac Issues: #14396
    
    Differential Revision: https://phabricator.haskell.org/D4154
    69987720