Make use of boot TyThings during typechecking.
authorEdward Z. Yang <ezyang@fb.com>
Mon, 30 Oct 2017 00:15:07 +0000 (20:15 -0400)
committerEdward Z. Yang <ezyang@fb.com>
Fri, 1 Dec 2017 00:25:29 +0000 (19:25 -0500)
commit6998772043a7f0b0360116eb5ffcbaa5630b21fb
tree0dbe4c73951283b06a234b0c7eb72c594de0a87c
parentd672b7ffa0cf23fae6bf95731b841105ab4e9c8e
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
14 files changed:
compiler/iface/TcIface.hs
compiler/rename/RnSource.hs
compiler/typecheck/FamInst.hs
compiler/typecheck/TcRnDriver.hs
compiler/typecheck/TcRnMonad.hs
compiler/typecheck/TcRnTypes.hs
compiler/typecheck/TcTyClsDecls.hs
testsuite/tests/typecheck/should_compile/T14396.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/T14396.hs-boot [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/T14396a.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/T14396b.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/T14396f.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/all.T
testsuite/tests/typecheck/should_fail/T12042.stderr