[project @ 2005-11-02 17:41:00 by simonpj]
authorsimonpj <unknown>
Wed, 2 Nov 2005 17:41:00 +0000 (17:41 +0000)
committersimonpj <unknown>
Wed, 2 Nov 2005 17:41:00 +0000 (17:41 +0000)
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
ghc/compiler/typecheck/TcSplice.lhs

index d2bc11a..1c7e722 100644 (file)
@@ -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
index 37adac1..47b2f6c 100644 (file)
@@ -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