From: Simon Peyton Jones Date: Fri, 10 Jun 2011 18:54:49 +0000 (+0100) Subject: Merge branch 'master' of http://darcs.haskell.org/ghc X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=7b5b3b0cab463e108a0132435a28ef19d17cb32b;hp=-c Merge branch 'master' of darcs.haskell.org/ghc --- 7b5b3b0cab463e108a0132435a28ef19d17cb32b diff --combined compiler/rename/RnNames.lhs index d8d8f3b,3867e17..ee6001b --- a/compiler/rename/RnNames.lhs +++ b/compiler/rename/RnNames.lhs @@@ -828,14 -828,14 +828,14 @@@ it re-exports @GHC@, which includes @ta type ExportAccum -- The type of the accumulating parameter of -- the main worker function in rnExports = ([LIE Name], -- Export items with Names - ExportOccMap, -- Tracks exported occurrence names + ExportOccMap, -- Tracks exported occurrence names [AvailInfo]) -- The accumulated exported stuff -- Not nub'd! emptyExportAccum :: ExportAccum emptyExportAccum = ([], emptyOccEnv, []) -type ExportOccMap = OccEnv (Name, IE RdrName) +type ExportOccMap = OccEnv (Name, IE Name) -- Tracks what a particular exported OccName -- in an export list refers to, and which item -- it came from. It's illegal to export two distinct things @@@ -912,7 -912,7 +912,7 @@@ exports_from_avail (Just rdr_items) rdr exports_from_item :: ExportAccum -> LIE RdrName -> RnM ExportAccum exports_from_item acc@(ie_names, occs, exports) - (L loc ie@(IEModuleContents mod)) + (L loc (IEModuleContents mod)) | let earlier_mods = [ mod | (L _ (IEModuleContents mod)) <- ie_names ] , mod `elem` earlier_mods -- Duplicate export of M = do { warn_dup_exports <- doptM Opt_WarnDuplicateExports ; @@@ -937,7 -937,7 +937,7 @@@ -- The qualified and unqualified version of all of -- these names are, in effect, used by this export - ; occs' <- check_occs ie occs names + ; occs' <- check_occs (IEModuleContents mod) occs names -- This check_occs not only finds conflicts -- between this item and others, but also -- internally within this item. That is, if @@@ -958,7 -958,7 +958,7 @@@ then return acc -- Avoid error cascade else do - occs' <- check_occs ie occs (availNames avail) + occs' <- check_occs new_ie occs (availNames avail) return (L loc new_ie : lie_names, occs', avail : exports) @@@ -1054,8 -1054,8 +1054,8 @@@ isModuleExported implicit_prelude mod ( Imported is -> any unQualSpecOK is && any (qualSpecOK mod) is ------------------------------- -check_occs :: IE RdrName -> ExportOccMap -> [Name] -> RnM ExportOccMap -check_occs ie occs names +check_occs :: IE Name -> ExportOccMap -> [Name] -> RnM ExportOccMap +check_occs ie occs names -- 'names' are the entities specifed by 'ie' = foldlM check occs names where check occs name @@@ -1066,7 -1066,7 +1066,7 @@@ | name == name' -- Duplicate export -- But we don't want to warn if the same thing is exported -- by two different module exports. See ticket #4478. - -> do unless (diffModules ie ie') $ do + -> do unless (dupExport_ok name ie ie') $ do warn_dup_exports <- doptM Opt_WarnDuplicateExports warnIf warn_dup_exports (dupExportWarn name_occ ie ie') return occs @@@ -1077,38 -1077,9 +1077,38 @@@ return occs } where name_occ = nameOccName name - -- True if the two IE RdrName are different module exports. - diffModules (IEModuleContents n1) (IEModuleContents n2) = n1 /= n2 - diffModules _ _ = False + + +dupExport_ok :: Name -> IE Name -> IE Name -> Bool +-- The Name is exported by both IEs. Is that ok? +-- "No" iff the name is mentioned explicitly in both IEs +-- "Yes" otherwise +-- +-- Example of "no": module M( f, f ) +-- +-- Example of "yes" +-- module M( module A, module B ) where +-- import A( f ) +-- import B( f ) +-- +-- Example of "yes" (Trac #2436) +-- module M( C(..), T(..) ) where +-- class C a where { data T a } +-- instace C Int where { data T Int = TInt } +-- +-- Example of "yes" (Trac #2436) +-- module Foo ( T ) where +-- data family T a +-- module Bar ( T(..), module Foo ) where +-- import Foo +-- data instance T Int = TInt + +dupExport_ok n ie1 ie2 + = not (explicit_in ie1 && explicit_in ie2) + where + explicit_in (IEModuleContents _) = False + explicit_in (IEThingAll n') = n == n' + explicit_in _ = True \end{code} %********************************************************* @@@ -1285,7 -1256,9 +1285,9 @@@ warnUnusedImportDecls gbl_en ; ifDOptM Opt_D_dump_minimal_imports $ printMinimalImports usage } where - explicit_import (L loc _) = isGoodSrcSpan loc + explicit_import (L loc _) = case loc of + UnhelpfulSpan _ -> False + RealSrcSpan _ -> True -- Filter out the implicit Prelude import -- which we do not want to bleat about \end{code} @@@ -1557,7 -1530,7 +1559,7 @@@ typeItemErr name wherest = sep [ ptext (sLit "Using 'type' tag on") <+> quotes (ppr name) <+> wherestr, ptext (sLit "Use -XTypeFamilies to enable this extension") ] -exportClashErr :: GlobalRdrEnv -> Name -> Name -> IE RdrName -> IE RdrName +exportClashErr :: GlobalRdrEnv -> Name -> Name -> IE Name -> IE Name -> Message exportClashErr global_env name1 name2 ie1 ie2 = vcat [ ptext (sLit "Conflicting exports for") <+> quotes (ppr occ) <> colon @@@ -1601,7 -1574,7 +1603,7 @@@ addDupDeclErr names@(name : _ where sorted_names = sortWith nameSrcLoc names -dupExportWarn :: OccName -> IE RdrName -> IE RdrName -> SDoc +dupExportWarn :: OccName -> IE Name -> IE Name -> SDoc dupExportWarn occ_name ie1 ie2 = hsep [quotes (ppr occ_name), ptext (sLit "is exported by"), quotes (ppr ie1),