summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/GHC/Driver/Make.hs31
-rw-r--r--testsuite/tests/cabal/t20242/BootNoHeader.cabal12
-rw-r--r--testsuite/tests/cabal/t20242/Foo.hs4
-rw-r--r--testsuite/tests/cabal/t20242/Foo.hs-boot1
-rw-r--r--testsuite/tests/cabal/t20242/Main.hs5
-rw-r--r--testsuite/tests/cabal/t20242/Makefile18
-rw-r--r--testsuite/tests/cabal/t20242/Setup.hs2
-rw-r--r--testsuite/tests/cabal/t20242/T20242.stderr5
-rw-r--r--testsuite/tests/cabal/t20242/all.T9
-rw-r--r--testsuite/tests/warnings/should_compile/UnusedPackages.stderr14
10 files changed, 79 insertions, 22 deletions
diff --git a/compiler/GHC/Driver/Make.hs b/compiler/GHC/Driver/Make.hs
index 736d5771f5..33cfbfe4f4 100644
--- a/compiler/GHC/Driver/Make.hs
+++ b/compiler/GHC/Driver/Make.hs
@@ -187,9 +187,11 @@ depanalE excluded_mods allow_dup_roots = do
(errs, mod_graph) <- depanalPartial excluded_mods allow_dup_roots
if isEmptyMessages errs
then do
- warnMissingHomeModules hsc_env mod_graph
+ let unused_home_mod_err = warnMissingHomeModules hsc_env mod_graph
+ unused_pkg_err = warnUnusedPackages hsc_env mod_graph
+ logDiagnostics (GhcDriverMessage <$> (unused_home_mod_err `unionMessages` unused_pkg_err))
setSession hsc_env { hsc_mod_graph = mod_graph }
- pure (errs, mod_graph)
+ pure (emptyMessages, mod_graph)
else do
-- We don't have a complete module dependency graph,
-- The graph may be disconnected and is unusable.
@@ -276,10 +278,11 @@ instantiationNodes unit_state = InstantiationNode <$> iuids_to_check
-- about module "C" not being listed in a command line.
--
-- The warning in enabled by `-Wmissing-home-modules`. See #13129
-warnMissingHomeModules :: GhcMonad m => HscEnv -> ModuleGraph -> m ()
+warnMissingHomeModules :: HscEnv -> ModuleGraph -> DriverMessages
warnMissingHomeModules hsc_env mod_graph =
- when (not (null missing)) $
- logDiagnostics (GhcDriverMessage <$> warn)
+ if null missing
+ then emptyMessages
+ else warn
where
dflags = hsc_dflags hsc_env
targets = map targetId (hsc_targets hsc_env)
@@ -347,7 +350,6 @@ load :: GhcMonad m => LoadHowMuch -> m SuccessFlag
load how_much = do
(errs, mod_graph) <- depanalE [] False -- #17459
success <- load' how_much (Just batchMsg) mod_graph
- warnUnusedPackages mod_graph
if isEmptyMessages errs
then pure success
else throwErrors (fmap GhcDriverMessage errs)
@@ -359,30 +361,29 @@ load how_much = do
-- actually loaded packages. All the packages, specified on command line,
-- but never loaded, are probably unused dependencies.
-warnUnusedPackages :: GhcMonad m => ModuleGraph -> m ()
-warnUnusedPackages mod_graph = do
- hsc_env <- getSession
-
+warnUnusedPackages :: HscEnv -> ModuleGraph -> DriverMessages
+warnUnusedPackages hsc_env mod_graph =
let dflags = hsc_dflags hsc_env
state = hsc_units hsc_env
diag_opts = initDiagOpts dflags
us = hsc_units hsc_env
-- Only need non-source imports here because SOURCE imports are always HPT
- let loadedPackages = concat $
+ loadedPackages = concat $
mapMaybe (\(fs, mn) -> lookupModulePackage us (unLoc mn) fs)
$ concatMap ms_imps (mgModSummaries mod_graph)
- let requestedArgs = mapMaybe packageArg (packageFlags dflags)
+ requestedArgs = mapMaybe packageArg (packageFlags dflags)
unusedArgs
= filter (\arg -> not $ any (matching state arg) loadedPackages)
requestedArgs
- let warn = singleMessage $ mkPlainMsgEnvelope diag_opts noSrcSpan (DriverUnusedPackages unusedArgs)
+ warn = singleMessage $ mkPlainMsgEnvelope diag_opts noSrcSpan (DriverUnusedPackages unusedArgs)
- when (not (null unusedArgs)) $
- logDiagnostics (GhcDriverMessage <$> warn)
+ in if null unusedArgs
+ then emptyMessages
+ else warn
where
packageArg (ExposePackage _ arg _) = Just arg
diff --git a/testsuite/tests/cabal/t20242/BootNoHeader.cabal b/testsuite/tests/cabal/t20242/BootNoHeader.cabal
new file mode 100644
index 0000000000..1a20184494
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/BootNoHeader.cabal
@@ -0,0 +1,12 @@
+cabal-version: 2.4
+name: BootNoHeader
+version: 0.1.0.0
+
+executable BootNoHeader
+ main-is: Main.hs
+ other-modules: Foo
+ build-depends: base
+ hs-source-dirs: .
+ default-language: Haskell2010
+
+ ghc-options: -Werror=unused-packages
diff --git a/testsuite/tests/cabal/t20242/Foo.hs b/testsuite/tests/cabal/t20242/Foo.hs
new file mode 100644
index 0000000000..c3707c7a24
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/Foo.hs
@@ -0,0 +1,4 @@
+module Foo where
+
+a :: Int
+a = 5
diff --git a/testsuite/tests/cabal/t20242/Foo.hs-boot b/testsuite/tests/cabal/t20242/Foo.hs-boot
new file mode 100644
index 0000000000..9aa298fba9
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/Foo.hs-boot
@@ -0,0 +1 @@
+a :: Int
diff --git a/testsuite/tests/cabal/t20242/Main.hs b/testsuite/tests/cabal/t20242/Main.hs
new file mode 100644
index 0000000000..de3cdee837
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/Main.hs
@@ -0,0 +1,5 @@
+module Main where
+
+import {-# SOURCE #-} Foo
+
+main = putStrLn "Hello, world!"
diff --git a/testsuite/tests/cabal/t20242/Makefile b/testsuite/tests/cabal/t20242/Makefile
new file mode 100644
index 0000000000..1eab3808e6
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/Makefile
@@ -0,0 +1,18 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+SETUP = ./Setup -v0
+
+T20242: clean
+ $(MAKE) clean
+ '$(TEST_HC)' $(TEST_HC_OPTS) -v0 --make Setup
+ $(SETUP) clean
+ $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)'
+ $(SETUP) build || true
+ifneq "$(CLEANUP)" ""
+ $(MAKE) clean
+endif
+
+clean :
+ $(RM) -r */dist Setup$(exeext) *.o *.hi
diff --git a/testsuite/tests/cabal/t20242/Setup.hs b/testsuite/tests/cabal/t20242/Setup.hs
new file mode 100644
index 0000000000..9a994af677
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/testsuite/tests/cabal/t20242/T20242.stderr b/testsuite/tests/cabal/t20242/T20242.stderr
new file mode 100644
index 0000000000..73c50e8c51
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/T20242.stderr
@@ -0,0 +1,5 @@
+
+Foo.hs-boot:1:1: error:
+ File name does not match module name:
+ Saw : ‘Main’
+ Expected: ‘Foo’
diff --git a/testsuite/tests/cabal/t20242/all.T b/testsuite/tests/cabal/t20242/all.T
new file mode 100644
index 0000000000..4e1c0387ee
--- /dev/null
+++ b/testsuite/tests/cabal/t20242/all.T
@@ -0,0 +1,9 @@
+if config.cleanup:
+ cleanup = 'CLEANUP=1'
+else:
+ cleanup = 'CLEANUP=0'
+
+test('T20242',
+ [extra_files(['Setup.hs', 'BootNoHeader.cabal','Foo.hs', 'Foo.hs-boot', 'Main.hs'])],
+ run_command,
+ ['$MAKE -s --no-print-directory T20242 ' + cleanup])
diff --git a/testsuite/tests/warnings/should_compile/UnusedPackages.stderr b/testsuite/tests/warnings/should_compile/UnusedPackages.stderr
index 4eea3bfc8b..ba6a76207f 100644
--- a/testsuite/tests/warnings/should_compile/UnusedPackages.stderr
+++ b/testsuite/tests/warnings/should_compile/UnusedPackages.stderr
@@ -1,9 +1,9 @@
-[1 of 1] Compiling Main ( UnusedPackages.hs, UnusedPackages.o )
-Linking UnusedPackages ...
<no location info>: warning: [-Wunused-packages]
- The following packages were specified via -package or -package-id flags,
- but were not needed for compilation:
- - ghc
- - process
- - bytestring
+ The following packages were specified via -package or -package-id flags,
+ but were not needed for compilation:
+ - ghc
+ - process
+ - bytestring
+[1 of 1] Compiling Main ( UnusedPackages.hs, UnusedPackages.o )
+Linking UnusedPackages ...