X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcRnDriver.lhs;h=4e0f283cdd2cb757d5fd4744c49b39407e05a55d;hb=9ac57e65bb77638ff7d5e7148ee5c3d80b25cf7d;hp=fafb7c7605f3c624eadecb17e4b41995f134367a;hpb=afeeed5189784fcd923e727171937df70b9ce9ce;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcRnDriver.lhs b/compiler/typecheck/TcRnDriver.lhs index fafb7c7..4e0f283 100644 --- a/compiler/typecheck/TcRnDriver.lhs +++ b/compiler/typecheck/TcRnDriver.lhs @@ -89,7 +89,6 @@ import TysWiredIn import IdInfo import {- Kind parts of -} Type import BasicTypes -import Data.Maybe #endif import FastString @@ -98,7 +97,6 @@ import Util import Bag import Control.Monad ( unless ) -import Data.Maybe ( isJust ) \end{code} @@ -171,6 +169,11 @@ tcRnModule hsc_env hsc_src save_rn_syntax -- Must be done after processing the exports tcg_env <- checkHiBootIface tcg_env boot_iface ; + -- Make the new type env available to stuff slurped from interface files + -- Must do this after checkHiBootIface, because the latter might add new + -- bindings for boot_dfuns, which may be mentioned in imported unfoldings + writeMutVar (tcg_type_env_var tcg_env) (tcg_type_env tcg_env) ; + -- Rename the Haddock documentation tcg_env <- rnHaddock module_info maybe_doc tcg_env ; @@ -375,9 +378,6 @@ tcRnSrcDecls boot_iface decls tcg_rules = rules', tcg_fords = fords' } } ; - -- Make the new type env available to stuff slurped from interface files - writeMutVar (tcg_type_env_var tcg_env) final_type_env ; - return (tcg_env' { tcg_binds = tcg_binds tcg_env' }) } @@ -510,7 +510,13 @@ checkHiBootIface ; mapM_ check_export boot_exports -- Check instance declarations - ; dfun_binds <- mapM check_inst boot_insts + ; mb_dfun_prs <- mapM check_inst boot_insts + ; let tcg_env' = tcg_env { tcg_binds = binds `unionBags` dfun_binds, + tcg_type_env = extendTypeEnvWithIds local_type_env boot_dfuns } + dfun_prs = catMaybes mb_dfun_prs + boot_dfuns = map fst dfun_prs + dfun_binds = listToBag [ noLoc $ VarBind boot_dfun (nlHsVar dfun) + | (boot_dfun, dfun) <- dfun_prs ] -- Check for no family instances ; unless (null boot_fam_insts) $ @@ -520,7 +526,7 @@ checkHiBootIface -- be the equivalent to the dfun bindings returned for class -- instances? We can't easily equate tycons... - ; return (tcg_env { tcg_binds = binds `unionBags` unionManyBags dfun_binds }) } + ; return tcg_env' } where check_export boot_avail -- boot_avail is exported by the boot iface | name `elem` dfun_names = return () @@ -560,12 +566,14 @@ checkHiBootIface local_export_env :: NameEnv AvailInfo local_export_env = availsToNameEnv local_exports + check_inst :: Instance -> TcM (Maybe (Id, Id)) + -- Returns a pair of the boot dfun in terms of the equivalent real dfun check_inst boot_inst = case [dfun | inst <- local_insts, let dfun = instanceDFunId inst, idType dfun `tcEqType` boot_inst_ty ] of - [] -> do { addErrTc (instMisMatch boot_inst); return emptyBag } - (dfun:_) -> return (unitBag $ noLoc $ VarBind local_boot_dfun (nlHsVar dfun)) + [] -> do { addErrTc (instMisMatch boot_inst); return Nothing } + (dfun:_) -> return (Just (local_boot_dfun, dfun)) where boot_dfun = instanceDFunId boot_inst boot_inst_ty = idType boot_dfun @@ -1128,7 +1136,7 @@ getModuleExports hsc_env mod ic = hsc_IC hsc_env checkMods = ic_toplev_scope ic ++ ic_exports ic in - initTc hsc_env HsSrcFile iNTERACTIVE (tcGetModuleExports mod checkMods) + initTc hsc_env HsSrcFile False iNTERACTIVE (tcGetModuleExports mod checkMods) -- Get the export avail info and also load all orphan and family-instance -- modules. Finally, check that the family instances of all modules in the