diff options
-rw-r--r-- | compiler/GHC/Iface/Recomp.hs | 5 | ||||
-rw-r--r-- | compiler/GHC/Rename/Names.hs | 7 | ||||
-rw-r--r-- | compiler/GHC/Unit/State.hs | 13 |
3 files changed, 21 insertions, 4 deletions
diff --git a/compiler/GHC/Iface/Recomp.hs b/compiler/GHC/Iface/Recomp.hs index 9bfbe218d6..fc53b91d68 100644 --- a/compiler/GHC/Iface/Recomp.hs +++ b/compiler/GHC/Iface/Recomp.hs @@ -74,6 +74,7 @@ import Data.Either import qualified Data.Semigroup import GHC.List (uncons) import Data.Ord +import Data.Containers.ListUtils {- ----------------------------------------------- @@ -461,7 +462,7 @@ checkDependencies hsc_env summary iface let (hs, ps) = partitionEithers es res1 <- liftIO $ check_mods (sort hs) prev_dep_mods - let allPkgDeps = sortBy (comparing snd) (ps ++ bkpk_units) + let allPkgDeps = sortBy (comparing snd) $ nubOrdOn snd (ps ++ implicit_deps ++ bkpk_units) res2 <- liftIO $ check_packages allPkgDeps prev_dep_pkgs return (res1 `mappend` res2) where @@ -475,6 +476,8 @@ checkDependencies hsc_env summary iface bkpk_units = map (("Signature",) . indefUnit . instUnitInstanceOf . moduleUnit) (requirementMerges units (moduleName (mi_module iface))) + implicit_deps = map ("Implicit",) (implicitPackageDeps dflags) + classify _ (Found _ mod) | isHomeUnit home_unit (moduleUnit mod) = Right (Left (moduleName mod)) diff --git a/compiler/GHC/Rename/Names.hs b/compiler/GHC/Rename/Names.hs index 7fbbb7167e..4a8e80dca2 100644 --- a/compiler/GHC/Rename/Names.hs +++ b/compiler/GHC/Rename/Names.hs @@ -94,6 +94,7 @@ import qualified Data.Set as S import System.FilePath ((</>)) import System.IO +import GHC.Unit.State {- ************************************************************************ @@ -200,7 +201,11 @@ rnImports imports = do -- Safe Haskell: See Note [Tracking Trust Transitively] let (decls, rdr_env, imp_avails, hpc_usage) = combine (stuff1 ++ stuff2) -- Update imp_boot_mods if imp_direct_mods mentions any of them - let final_import_avail = clobberSourceImports imp_avails + let merged_import_avail = clobberSourceImports imp_avails + dflags <- getDynFlags + let final_import_avail = + merged_import_avail { imp_dep_direct_pkgs = S.fromList (implicitPackageDeps dflags) + `S.union` imp_dep_direct_pkgs merged_import_avail} return (decls, rdr_env, final_import_avail, hpc_usage) where diff --git a/compiler/GHC/Unit/State.hs b/compiler/GHC/Unit/State.hs index f3fb9d7645..32e35161b2 100644 --- a/compiler/GHC/Unit/State.hs +++ b/compiler/GHC/Unit/State.hs @@ -65,8 +65,8 @@ module GHC.Unit.State ( pprWithUnitState, -- * Utils - unwireUnit - ) + unwireUnit, + implicitPackageDeps) where import GHC.Prelude @@ -113,6 +113,7 @@ import qualified Data.Semigroup as Semigroup import qualified Data.Map as Map import qualified Data.Map.Strict as MapStrict import qualified Data.Set as Set +import GHC.LanguageExtensions -- --------------------------------------------------------------------------- -- The Unit state @@ -2153,3 +2154,11 @@ pprWithUnitState :: UnitState -> SDoc -> SDoc pprWithUnitState state = updSDocContext (\ctx -> ctx { sdocUnitIdForUser = \fs -> pprUnitIdForUser state (UnitId fs) }) + +-- | Add package dependencies on the wired-in packages we use +implicitPackageDeps :: DynFlags -> [UnitId] +implicitPackageDeps dflags + = [thUnitId | xopt TemplateHaskellQuotes dflags] + -- TODO: Should also include `base` and `ghc-prim` if we use those implicitly, but + -- it is possible to not depend on base (for example, see `ghc-prim`) + |