Correct the TH fix of Oct 26, involving thFAKE
MERGE TO STABLE
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.
But we have to tell the *typechecker* too, not just the renamer.
See comments with TcSplice.tc_bracket (DecBr case).
Should fix TH failures in the STABLE branch
getModule :: TcRn Module
getModule = do { env <- getGblEnv; return (tcg_mod env) }
getModule :: TcRn Module
getModule = do { env <- getGblEnv; return (tcg_mod env) }
+setModule :: Module -> TcRn a -> TcRn a
+setModule mod thing_inside = updGblEnv (\env -> env { tcg_mod = mod }) thing_inside
+
tcIsHsBoot :: TcRn Bool
tcIsHsBoot = do { env <- getGblEnv; return (isHsBoot (tcg_src env)) }
tcIsHsBoot :: TcRn Bool
tcIsHsBoot = do { env <- getGblEnv; return (isHsBoot (tcg_src env)) }
import TcHsType ( tcHsSigType, kcHsType )
import TcIface ( tcImportDecl )
import TypeRep ( Type(..), PredType(..), TyThing(..) ) -- For reification
import TcHsType ( tcHsSigType, kcHsType )
import TcIface ( tcImportDecl )
import TypeRep ( Type(..), PredType(..), TyThing(..) ) -- For reification
+import PrelNames ( thFAKE )
import Name ( Name, NamedThing(..), nameOccName, nameModule, isExternalName,
nameIsLocalOrFrom )
import NameEnv ( lookupNameEnv )
import Name ( Name, NamedThing(..), nameOccName, nameModule, isExternalName,
nameIsLocalOrFrom )
import NameEnv ( lookupNameEnv )
-- Result type is Type (= Q Typ)
tc_bracket (DecBr decls)
-- Result type is Type (= Q Typ)
tc_bracket (DecBr decls)
- = do { tcTopSrcDecls emptyModDetails decls
+ = do { setModule thFAKE $ tcTopSrcDecls emptyModDetails decls
-- Typecheck the declarations, dicarding the result
-- We'll get all that stuff later, when we splice it in
-- 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
; decl_ty <- tcMetaTy decTyConName
; q_ty <- tcMetaTy qTyConName