From d068f518de21a7a21613eb5a34c5eac8517bef75 Mon Sep 17 00:00:00 2001 From: simonpj Date: Wed, 2 Nov 2005 17:41:00 +0000 Subject: [PATCH] [project @ 2005-11-02 17:41:00 by simonpj] Second correction to the TH fix of Oct 26, involving thFAKE Original message 1) A bug in the renaming of [d| brackets |]. The problem was that when we renamed the bracket we messed up the name cache, because the module was still that of the parent module. Now we set a fake module before renaming it. This commit fixes the typecheker problem in a different way, in tcLookupGlobal. --- ghc/compiler/typecheck/TcEnv.lhs | 36 ++++++++++++++++++++++------------- ghc/compiler/typecheck/TcSplice.lhs | 6 +----- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/ghc/compiler/typecheck/TcEnv.lhs b/ghc/compiler/typecheck/TcEnv.lhs index d2bc11a..1c7e722 100644 --- a/ghc/compiler/typecheck/TcEnv.lhs +++ b/ghc/compiler/typecheck/TcEnv.lhs @@ -63,7 +63,8 @@ import InstEnv ( Instance, DFunId, instanceDFunId, instanceHead ) import DataCon ( DataCon ) import TyCon ( TyCon ) import Class ( Class ) -import Name ( Name, NamedThing(..), getSrcLoc, nameIsLocalOrFrom ) +import Name ( Name, NamedThing(..), getSrcLoc, nameModule ) +import PrelNames ( thFAKE ) import NameEnv import OccName ( mkDFunOcc, occNameString ) import HscTypes ( extendTypeEnvList, lookupType, @@ -93,20 +94,29 @@ tcLookupLocatedGlobal name tcLookupGlobal :: Name -> TcM TyThing tcLookupGlobal name - = do { env <- getGblEnv - ; if nameIsLocalOrFrom (tcg_mod env) name - - then -- It's defined in this module - case lookupNameEnv (tcg_type_env env) name of - Just thing -> return thing - Nothing -> notFound name -- Panic! + = ASSERT( isGlobalName name ) + do { env <- getGblEnv + + -- Try local envt + ; case lookupNameEnv (tcg_type_env env) name of { + Just thing -> return thing ; + Nothing -> do - else do -- It's imported + -- Try global envt { (eps,hpt) <- getEpsAndHpt - ; case lookupType hpt (eps_PTE eps) name of - Just thing -> return thing - Nothing -> tcImportDecl name - }} + ; case lookupType hpt (eps_PTE eps) name of { + Just thing -> return thing ; + Nothing -> do + + -- Should it have been in the local envt? + { let mod = nameModule name + ; if mod == tcg_mod env || mod == thFAKE then + notFound name -- It should be local, so panic + -- The thFAKE possibility is because it + -- might be in a declaration bracket + else + tcImportDecl name -- Go find it in an interface + }}}}} tcLookupGlobalId :: Name -> TcM Id -- Never used for Haskell-source DataCons, hence no ADataCon case diff --git a/ghc/compiler/typecheck/TcSplice.lhs b/ghc/compiler/typecheck/TcSplice.lhs index 37adac1..47b2f6c 100644 --- a/ghc/compiler/typecheck/TcSplice.lhs +++ b/ghc/compiler/typecheck/TcSplice.lhs @@ -140,13 +140,9 @@ tc_bracket (TypBr typ) -- Result type is Type (= Q Typ) tc_bracket (DecBr decls) - = do { setModule thFAKE $ tcTopSrcDecls emptyModDetails decls + = do { tcTopSrcDecls emptyModDetails decls -- Typecheck the declarations, dicarding the result -- We'll get all that stuff later, when we splice it in - -- See comments with RnExpr.rnBracket for the thFAKE stuff; - -- the type checker uses the module name to decide which - -- names are local (and hence can be found in the local - -- type envt), so we do need to set the module here too. ; decl_ty <- tcMetaTy decTyConName ; q_ty <- tcMetaTy qTyConName -- 1.7.10.4