Make use of boot TyThings during typechecking.
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:Edward 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
Showing
- compiler/iface/TcIface.hs 45 additions, 20 deletionscompiler/iface/TcIface.hs
- compiler/rename/RnSource.hs 0 additions, 120 deletionscompiler/rename/RnSource.hs
- compiler/typecheck/FamInst.hs 16 additions, 62 deletionscompiler/typecheck/FamInst.hs
- compiler/typecheck/TcRnDriver.hs 2 additions, 2 deletionscompiler/typecheck/TcRnDriver.hs
- compiler/typecheck/TcRnMonad.hs 0 additions, 1 deletioncompiler/typecheck/TcRnMonad.hs
- compiler/typecheck/TcRnTypes.hs 0 additions, 7 deletionscompiler/typecheck/TcRnTypes.hs
- compiler/typecheck/TcTyClsDecls.hs 0 additions, 4 deletionscompiler/typecheck/TcTyClsDecls.hs
- testsuite/tests/typecheck/should_compile/T14396.hs 4 additions, 0 deletionstestsuite/tests/typecheck/should_compile/T14396.hs
- testsuite/tests/typecheck/should_compile/T14396.hs-boot 2 additions, 0 deletionstestsuite/tests/typecheck/should_compile/T14396.hs-boot
- testsuite/tests/typecheck/should_compile/T14396a.hs 5 additions, 0 deletionstestsuite/tests/typecheck/should_compile/T14396a.hs
- testsuite/tests/typecheck/should_compile/T14396b.hs 4 additions, 0 deletionstestsuite/tests/typecheck/should_compile/T14396b.hs
- testsuite/tests/typecheck/should_compile/T14396f.hs 3 additions, 0 deletionstestsuite/tests/typecheck/should_compile/T14396f.hs
- testsuite/tests/typecheck/should_compile/all.T 1 addition, 0 deletionstestsuite/tests/typecheck/should_compile/all.T
- testsuite/tests/typecheck/should_fail/T12042.stderr 5 additions, 5 deletionstestsuite/tests/typecheck/should_fail/T12042.stderr
Loading
Please register or sign in to comment