summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/GHC/Iface/Recomp.hs5
-rw-r--r--compiler/GHC/Rename/Names.hs7
-rw-r--r--compiler/GHC/Unit/State.hs13
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`)
+