diff --git a/ghc/compiler/rename/RnEnv.lhs b/ghc/compiler/rename/RnEnv.lhs index f975e910a57b90e21e70ddd2df3555dc7aa66565..551c6c48f5a89c7854b33ac05a445c1959ec26e5 100644 --- a/ghc/compiler/rename/RnEnv.lhs +++ b/ghc/compiler/rename/RnEnv.lhs @@ -484,16 +484,29 @@ pprFixityProvenance (fixity, how_in_scope) = ppr how_in_scope -=============== Avails ================ +=============== ExportAvails ================ \begin{code} -mkExportAvails :: Bool -> Module -> [AvailInfo] -> ExportAvails -mkExportAvails unqualified_import mod_name avails +mkExportAvails :: Module -> Bool -> GlobalNameEnv -> [AvailInfo] -> ExportAvails +mkExportAvails mod_name unqual_imp name_env avails = (mod_avail_env, entity_avail_env) where - -- The "module M" syntax only applies to *unqualified* imports (1.4 Report, Section 5.1.1) - mod_avail_env | unqualified_import = unitFM mod_name avails - | otherwise = emptyFM - + mod_avail_env = unitFM mod_name unqual_avails + + -- unqual_avails is the Avails that are visible in *unqualfied* form + -- (1.4 Report, Section 5.1.1) + -- For example, in + -- import T hiding( f ) + -- we delete f from avails + + unqual_avails | not unqual_imp = [] -- Short cut when no unqualified imports + | otherwise = [prune avail | avail <- avails] + + prune (Avail n) | unqual_in_scope n = Avail n + prune (Avail n) | otherwise = NotAvailable + prune (AvailTC n ns) = AvailTC n (filter unqual_in_scope ns) + + unqual_in_scope n = Unqual (nameOccName n) `elemFM` name_env + entity_avail_env = listToUFM [ (name,avail) | avail <- avails, name <- availEntityNames avail] @@ -556,8 +569,8 @@ filterAvail ie@(IEThingWith want wants) avail@(AvailTC n ns) avail_occs = map nameOccName ns wanted_occs = map rdrNameOcc (want:wants) -filterAvail (IEThingAbs _) (AvailTC n ns) - | n `elem` ns = AvailTC n [n] +filterAvail (IEThingAbs _) (AvailTC n ns) = ASSERT( n `elem` ns ) + AvailTC n [n] filterAvail (IEThingAbs _) avail@(Avail n) = avail -- Type synonyms diff --git a/ghc/compiler/rename/RnNames.lhs b/ghc/compiler/rename/RnNames.lhs index a3ff9944313eba27d95399dbda64dfb91b0a41a6..f8cf4b11f828441ee4218e3c468a4aadaa74f8c8 100644 --- a/ghc/compiler/rename/RnNames.lhs +++ b/ghc/compiler/rename/RnNames.lhs @@ -313,7 +313,7 @@ qualifyImports this_mod qual_imp unqual_imp as_mod hides fixity_env = foldl (add_fixity name_env2) emptyFixityEnv fixities -- Create the export-availability info - export_avails = mkExportAvails unqual_imp qual_mod avails + export_avails = mkExportAvails qual_mod unqual_imp name_env2 avails in returnRn (RnEnv name_env2 fixity_env, export_avails) where