X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Frename%2FRnEnv.lhs;h=118267f893a78920c8bb93be57690cd740d1ba86;hb=8111e8c5719e0b37a16f3895a2dfb083fd3abc1c;hp=f27dec8312d12c8337aaca859b2a8192b9451e46;hpb=35cd30bf8587a216449fc7925d0ea90524c9eaf4;p=ghc-hetmet.git diff --git a/ghc/compiler/rename/RnEnv.lhs b/ghc/compiler/rename/RnEnv.lhs index f27dec8..118267f 100644 --- a/ghc/compiler/rename/RnEnv.lhs +++ b/ghc/compiler/rename/RnEnv.lhs @@ -149,15 +149,33 @@ mkImportedGlobalName mod_name occ new_cache = addToFM cache key name updateProvenances :: [Name] -> RnM d () +-- Update the provenances of everything that is in scope. +-- We must be careful not to disturb the Module package info +-- already in the cache. Why not? Consider +-- module A module M( f ) +-- import M( f ) import N( f) +-- import N +-- So f is defined in N, and M re-exports it. +-- When processing module A: +-- 1. We read M.hi first, and make a vanilla name N.f +-- (without reading N.hi). The package info says +-- for lack of anything better. +-- 2. Now we read N, which update the cache to record +-- the correct package for N.f. +-- 3. Finally we update provenances (once we've read all imports). +-- Step 3 must not destroy package info recorded in Step 2. + updateProvenances names = getNameSupplyRn `thenRn` \ (us, inst_ns, cache, ipcache) -> - setNameSupplyRn (us, inst_ns, update cache names, ipcache) + setNameSupplyRn (us, inst_ns, foldr update cache names, ipcache) where - update cache [] = cache - update cache (name:names) = WARN( not (key `elemFM` cache), ppr name ) - update (addToFM cache key name) names - where - key = (moduleName (nameModule name), nameOccName name) + update name cache = addToFM_C update_prov cache key name + where + key = (moduleName (nameModule name), nameOccName name) + + update_prov name_in_cache name_with_prov + = setNameProvenance name_in_cache (getNameProvenance name_with_prov) + mkImportedGlobalFromRdrName :: RdrName -> RnM d Name