X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FFamInst.lhs;h=f85f6b926666e2b4ef343808895ee12aeb0196cc;hb=2eb04ca0f8d0ec72b417cddc60672c696b4a3daa;hp=e2e596f7768ef5ca5a828be39140d9e7fb000299;hpb=4287edeb7f329529149d8c95597d5e418388265f;p=ghc-hetmet.git diff --git a/compiler/typecheck/FamInst.lhs b/compiler/typecheck/FamInst.lhs index e2e596f..f85f6b9 100644 --- a/compiler/typecheck/FamInst.lhs +++ b/compiler/typecheck/FamInst.lhs @@ -18,6 +18,7 @@ import Name import Module import SrcLoc import Outputable +import UniqFM import FiniteMap import Maybe @@ -64,6 +65,7 @@ instance Ord ModulePair where -- type ModulePairSet = FiniteMap ModulePair () +listToSet :: [ModulePair] -> ModulePairSet listToSet l = listToFM (zip l (repeat ())) checkFamInstConsistency :: [Module] -> [Module] -> TcM () @@ -78,7 +80,14 @@ checkFamInstConsistency famInstMods directlyImpMods Nothing -> panic "FamInst.checkFamInstConsistency" Just iface -> iface - ; modInstsEnv = eps_mod_fam_inst_env eps + ; hmiModule = mi_module . hm_iface + ; hmiFamInstEnv = mkFamInstEnv . md_fam_insts . hm_details + ; mkFamInstEnv = extendFamInstEnvList emptyFamInstEnv + ; hptModInsts = [ (hmiModule hmi, hmiFamInstEnv hmi) + | hmi <- eltsUFM hpt] + ; modInstsEnv = eps_mod_fam_inst_env eps -- external modules + `extendModuleEnvList` -- plus + hptModInsts -- home package modules ; groups = map (dep_finsts . mi_deps . modIface) directlyImpMods ; okPairs = listToSet $ concatMap allPairs groups @@ -95,7 +104,9 @@ checkFamInstConsistency famInstMods directlyImpMods allPairs [] = [] allPairs (m:ms) = map (ModulePair m) ms ++ allPairs ms - -- Check the consistency of the family instances of the two modules. + -- The modules are guaranteed to be in the environment, as they are either + -- already loaded in the EPS or they are in the HPT. + -- check modInstsEnv (ModulePair m1 m2) = let { instEnv1 = fromJust . lookupModuleEnv modInstsEnv $ m1 ; instEnv2 = fromJust . lookupModuleEnv modInstsEnv $ m2 @@ -163,13 +174,13 @@ checkForConflicts inst_envs famInst Nothing -> panic "FamInst.checkForConflicts" Just (tc, tys) -> tc `mkTyConApp` tys } - ; (tvs', _, tau') <- tcInstSkolType (FamInstSkol tycon) ty + ; (tvs', _, tau') <- tcInstSkolType FamInstSkol ty ; let (fam, tys') = tcSplitTyConApp tau' ; let { matches = lookupFamInstEnvUnify inst_envs fam tys' ; conflicts = [ conflictingFamInst - | match@(_, conflictingFamInst) <- matches + | match@(conflictingFamInst, _) <- matches , conflicting fam tys' tycon match ] }