Commit d068f518 authored by simonpj's avatar simonpj
Browse files

[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.
parent acc7346e
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment