[commit: ghc] master: A raft of changes driven by Trac #8540 (7881488)
git at git.haskell.org
git at git.haskell.org
Fri Nov 22 16:39:25 UTC 2013
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/7881488201629aa1ab36e3e0fbeb4d7b4b85bd91/ghc
>---------------------------------------------------------------
commit 7881488201629aa1ab36e3e0fbeb4d7b4b85bd91
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Fri Nov 22 09:24:54 2013 +0000
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.
>---------------------------------------------------------------
7881488201629aa1ab36e3e0fbeb4d7b4b85bd91
compiler/basicTypes/RdrName.lhs | 85 +++++++++++-------
compiler/rename/RnEnv.lhs | 52 ++++++-----
compiler/rename/RnExpr.lhs | 17 ++--
compiler/rename/RnNames.lhs | 73 +++++++---------
compiler/rename/RnPat.lhs | 8 +-
compiler/rename/RnSource.lhs | 11 ++-
compiler/rename/RnSplice.lhs | 159 ++++++++++++++++++++++------------
compiler/rename/RnSplice.lhs-boot | 1 -
compiler/typecheck/TcAnnotations.lhs | 9 +-
compiler/typecheck/TcEnv.lhs | 145 ++++++++++++++-----------------
compiler/typecheck/TcExpr.lhs | 55 +++++-------
compiler/typecheck/TcRnDriver.lhs | 4 +-
compiler/typecheck/TcRnMonad.lhs | 25 +++---
compiler/typecheck/TcRnTypes.lhs | 36 ++++----
compiler/typecheck/TcSplice.lhs | 47 ++--------
compiler/typecheck/TcTyClsDecls.lhs | 8 +-
16 files changed, 380 insertions(+), 355 deletions(-)
Diff suppressed because of size. To see it, use:
git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc 7881488201629aa1ab36e3e0fbeb4d7b4b85bd91
More information about the ghc-commits
mailing list