Fix unused-import warnings
authorDavid Eichmann <EichmannD@gmail.com>
Thu, 22 Nov 2018 19:48:05 +0000 (14:48 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 22 Nov 2018 21:10:06 +0000 (16:10 -0500)
This patch fixes a fairly long-standing bug (dating back to 2015) in
RdrName.bestImport, namely

   commit 9376249b6b78610db055a10d05f6592d6bbbea2f
   Author: Simon Peyton Jones <simonpj@microsoft.com>
   Date:   Wed Oct 28 17:16:55 2015 +0000

   Fix unused-import stuff in a better way

In that patch got the sense of the comparison back to front, and
thereby failed to implement the unused-import rules described in
  Note [Choosing the best import declaration] in RdrName

This led to Trac #13064 and #15393

Fixing this bug revealed a bunch of unused imports in libraries;
the ones in the GHC repo are part of this commit.

The two important changes are

* Fix the bug in bestImport

* Modified the rules by adding (a) in
     Note [Choosing the best import declaration] in RdrName
  Reason: the previosu rules made Trac #5211 go bad again.  And
  the new rule (a) makes sense to me.

In unravalling this I also ended up doing a few other things

* Refactor RnNames.ImportDeclUsage to use a [GlobalRdrElt] for the
  things that are used, rather than [AvailInfo]. This is simpler
  and more direct.

* Rename greParentName to greParent_maybe, to follow GHC
  naming conventions

* Delete dead code RdrName.greUsedRdrName

Bumps a few submodules.

Reviewers: hvr, goldfire, bgamari, simonmar, jrtc27

Subscribers: rwbarton, carter

Differential Revision: https://phabricator.haskell.org/D5312

85 files changed:
compiler/basicTypes/RdrName.hs
compiler/cmm/Bitmap.hs
compiler/cmm/CmmCommonBlockElim.hs
compiler/cmm/CmmLayoutStack.hs
compiler/cmm/CmmProcPoint.hs
compiler/cmm/Hoopl/Collections.hs
compiler/codeGen/StgCmmProf.hs
compiler/coreSyn/CoreOpt.hs
compiler/coreSyn/CorePrep.hs
compiler/coreSyn/CoreStats.hs
compiler/deSugar/DsBinds.hs
compiler/ghci/ByteCodeLink.hs
compiler/ghci/RtClosureInspect.hs
compiler/hsSyn/Convert.hs
compiler/hsSyn/HsBinds.hs
compiler/hsSyn/HsExtension.hs
compiler/hsSyn/HsImpExp.hs
compiler/hsSyn/HsTypes.hs
compiler/llvmGen/LlvmCodeGen/CodeGen.hs
compiler/main/Ar.hs
compiler/main/DynFlags.hs
compiler/main/DynamicLoading.hs
compiler/main/Finder.hs
compiler/main/GHC.hs
compiler/main/HscMain.hs
compiler/main/HscStats.hs
compiler/main/Packages.hs
compiler/nativeGen/RegAlloc/Linear/JoinToTargets.hs
compiler/nativeGen/RegAlloc/Linear/PPC/FreeRegs.hs
compiler/nativeGen/RegAlloc/Linear/SPARC/FreeRegs.hs
compiler/nativeGen/RegAlloc/Linear/X86/FreeRegs.hs
compiler/nativeGen/RegAlloc/Linear/X86_64/FreeRegs.hs
compiler/parser/RdrHsSyn.hs
compiler/rename/RnEnv.hs
compiler/rename/RnExpr.hs-boot
compiler/rename/RnNames.hs
compiler/rename/RnSource.hs
compiler/simplStg/RepType.hs
compiler/specialise/Specialise.hs
compiler/typecheck/ClsInst.hs
compiler/typecheck/TcBackpack.hs
compiler/typecheck/TcCanonical.hs
compiler/typecheck/TcDeriv.hs
compiler/typecheck/TcErrors.hs
compiler/typecheck/TcHoleErrors.hs
compiler/typecheck/TcHsSyn.hs
compiler/typecheck/TcInstDcls.hs-boot
compiler/typecheck/TcInteract.hs
compiler/typecheck/TcPatSyn.hs
compiler/typecheck/TcRnTypes.hs
compiler/typecheck/TcSMonad.hs
compiler/typecheck/TcType.hs
compiler/typecheck/TcTypeable.hs
compiler/types/TyCon.hs
compiler/utils/OrdList.hs
compiler/utils/Outputable.hs
compiler/utils/UniqSet.hs
ghc/GHCi/Leak.hs
hadrian/hadrian.cabal
hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
libraries/Cabal
libraries/base/Data/Functor/Classes.hs
libraries/base/Data/Functor/Compose.hs
libraries/base/Data/Functor/Contravariant.hs
libraries/base/Data/Functor/Product.hs
libraries/base/Data/Functor/Sum.hs
libraries/base/Data/Semigroup.hs
libraries/base/GHC/Event/PSQ.hs
libraries/base/GHC/Generics.hs
libraries/base/GHC/Show.hs
libraries/base/GHC/StaticPtr.hs
libraries/bytestring
libraries/ghc-prim/GHC/Magic.hs
libraries/ghci/GHCi/CreateBCO.hs
testsuite/tests/driver/T4437.hs
testsuite/tests/module/mod177.stderr
testsuite/tests/rename/should_compile/T13064.hs [new file with mode: 0644]
testsuite/tests/rename/should_compile/T13064.stderr [new file with mode: 0644]
testsuite/tests/rename/should_compile/T4239.stdout
testsuite/tests/rename/should_compile/all.T
utils/check-api-annotations/check-api-annotations.cabal
utils/check-ppr/check-ppr.cabal
utils/ghc-cabal/ghc-cabal.cabal
utils/ghctags/Main.hs
utils/ghctags/ghctags.cabal

index 45f2324..6a3db51 100644 (file)
@@ -53,14 +53,14 @@ module RdrName (
 
         -- * GlobalRdrElts
         gresFromAvails, gresFromAvail, localGREsFromAvail, availFromGRE,
-        greUsedRdrName, greRdrNames, greSrcSpan, greQualModName,
+        greRdrNames, greSrcSpan, greQualModName,
         gresToAvailInfo,
 
         -- ** Global 'RdrName' mapping elements: 'GlobalRdrElt', 'Provenance', 'ImportSpec'
         GlobalRdrElt(..), isLocalGRE, isRecFldGRE, greLabel,
         unQualOK, qualSpecOK, unQualSpecOK,
         pprNameProvenance,
-        Parent(..),
+        Parent(..), greParent_maybe,
         ImportSpec(..), ImpDeclSpec(..), ImpItemSpec(..),
         importSpecLoc, importSpecModule, isExplicitItem, bestImport,
 
@@ -657,18 +657,6 @@ greQualModName gre@(GRE { gre_name = name, gre_lcl = lcl, gre_imp = iss })
  | (is:_) <- iss                          = is_as (is_decl is)
  | otherwise                              = pprPanic "greQualModName" (ppr gre)
 
-greUsedRdrName :: GlobalRdrElt -> RdrName
--- For imported things, return a RdrName to add to the used-RdrName
--- set, which is used to generate unused-import-decl warnings.
--- Return a Qual RdrName if poss, so that identifies the most
--- specific ImportSpec.  See Trac #10890 for some good examples.
-greUsedRdrName gre@GRE{ gre_name = name, gre_lcl = lcl, gre_imp = iss }
-  | lcl, Just mod <- nameModule_maybe name = Qual (moduleName mod)     occ
-  | not (null iss), is <- bestImport iss   = Qual (is_as (is_decl is)) occ
-  | otherwise                              = pprTrace "greUsedRdrName" (ppr gre) (Unqual occ)
-  where
-    occ = greOccName gre
-
 greRdrNames :: GlobalRdrElt -> [RdrName]
 greRdrNames gre@GRE{ gre_lcl = lcl, gre_imp = iss }
   = (if lcl then [unqual] else []) ++ concatMap do_spec (map is_decl iss)
@@ -696,11 +684,11 @@ mkParent _ (Avail _)           = NoParent
 mkParent n (AvailTC m _ _) | n == m    = NoParent
                          | otherwise = ParentIs m
 
-greParentName :: GlobalRdrElt -> Maybe Name
-greParentName gre = case gre_par gre of
-                      NoParent -> Nothing
-                      ParentIs n -> Just n
-                      FldParent n _ -> Just n
+greParent_maybe :: GlobalRdrElt -> Maybe Name
+greParent_maybe gre = case gre_par gre of
+                        NoParent      -> Nothing
+                        ParentIs n    -> Just n
+                        FldParent n _ -> Just n
 
 -- | Takes a list of distinct GREs and folds them
 -- into AvailInfos. This is more efficient than mapping each individual
@@ -716,7 +704,7 @@ gresToAvailInfo gres
     add :: NameEnv AvailInfo -> GlobalRdrElt -> NameEnv AvailInfo
     add env gre = extendNameEnv_Acc comb availFromGRE env
                     (fromMaybe (gre_name gre)
-                               (greParentName gre)) gre
+                               (greParent_maybe gre)) gre
 
       where
         -- We want to insert the child `k` into a list of children but
@@ -1192,10 +1180,7 @@ instance Ord ImpItemSpec where
 
 
 bestImport :: [ImportSpec] -> ImportSpec
--- Given a non-empty bunch of ImportSpecs, return the one that
--- imported the item most specifically (e.g. by name), using
--- textually-first as a tie breaker. This is used when reporting
--- redundant imports
+-- See Note [Choosing the best import declaration]
 bestImport iss
   = case sortBy best iss of
       (is:_) -> is
@@ -1203,17 +1188,76 @@ bestImport iss
   where
     best :: ImportSpec -> ImportSpec -> Ordering
     -- Less means better
+    -- Unqualified always wins over qualified; then
+    -- import-all wins over import-some; then
+    -- earlier declaration wins over later
     best (ImpSpec { is_item = item1, is_decl = d1 })
          (ImpSpec { is_item = item2, is_decl = d2 })
-      = best_item item1 item2 `thenCmp` (is_dloc d1 `compare` is_dloc d2)
+      = (is_qual d1 `compare` is_qual d2) `thenCmp`
+        (best_item item1 item2)           `thenCmp`
+        (is_dloc d1 `compare` is_dloc d2)
 
     best_item :: ImpItemSpec -> ImpItemSpec -> Ordering
     best_item ImpAll ImpAll = EQ
-    best_item ImpAll (ImpSome {}) = GT
-    best_item (ImpSome {}) ImpAll = LT
+    best_item ImpAll (ImpSome {}) = LT
+    best_item (ImpSome {}) ImpAll = GT
     best_item (ImpSome { is_explicit = e1 })
-              (ImpSome { is_explicit = e2 }) = e2 `compare` e1
-     -- False < True, so if e1 is explicit and e2 is not, we get LT
+              (ImpSome { is_explicit = e2 }) = e1 `compare` e2
+     -- False < True, so if e1 is explicit and e2 is not, we get GT
+
+{- Note [Choosing the best import declaration]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+When reporting unused import declarations we use the following rules.
+   (see [wiki:Commentary/Compiler/UnusedImports])
+
+Say that an import-item is either
+  * an entire import-all decl (eg import Foo), or
+  * a particular item in an import list (eg import Foo( ..., x, ...)).
+The general idea is that for each /occurrence/ of an imported name, we will
+attribute that use to one import-item. Once we have processed all the
+occurrences, any import items with no uses attributed to them are unused,
+and are warned about. More precisely:
+
+1. For every RdrName in the program text, find its GlobalRdrElt.
+
+2. Then, from the [ImportSpec] (gre_imp) of that GRE, choose one
+   the "chosen import-item", and mark it "used". This is done
+   by 'bestImport'
+
+3. After processing all the RdrNames, bleat about any
+   import-items that are unused.
+   This is done in RnNames.warnUnusedImportDecls.
+
+The function 'bestImport' returns the dominant import among the
+ImportSpecs it is given, implementing Step 2.  We say import-item A
+dominates import-item B if we choose A over B. In general, we try to
+choose the import that is most likely to render other imports
+unnecessary.  Here is the dominance relationship we choose:
+
+    a) import Foo dominates import qualified Foo.
+
+    b) import Foo dominates import Foo(x).
+
+    c) Otherwise choose the textually first one.
+
+Rationale for (a).  Consider
+   import qualified M  -- Import #1
+   import M( x )       -- Import #2
+   foo = M.x + x
+
+The unqualified 'x' can only come from import #2.  The qualified 'M.x'
+could come from either, but bestImport picks import #2, because it is
+more likely to be useful in other imports, as indeed it is in this
+case (see Trac #5211 for a concrete example).
+
+But the rules are not perfect; consider
+   import qualified M  -- Import #1
+   import M( x )       -- Import #2
+   foo = M.x + M.y
+
+The M.x will use import #2, but M.y can only use import #1.
+-}
+
 
 unQualSpecOK :: ImportSpec -> Bool
 -- ^ Is in scope unqualified?
index e6ac15f..42acc5f 100644 (file)
@@ -21,7 +21,6 @@ import SMRep
 import DynFlags
 import Util
 
-import Data.Foldable (foldl')
 import Data.Bits
 
 {-|
index 1af9a84..b43d689 100644 (file)
@@ -29,7 +29,6 @@ import qualified TrieMap as TM
 import UniqFM
 import Unique
 import Control.Arrow (first, second)
-import Data.List (foldl')
 
 -- -----------------------------------------------------------------------------
 -- Eliminate common blocks
index 1d6c209..3b3f49e 100644 (file)
@@ -37,7 +37,7 @@ import qualified Data.Set as Set
 import Control.Monad.Fix
 import Data.Array as Array
 import Data.Bits
-import Data.List (nub, foldl')
+import Data.List (nub)
 
 {- Note [Stack Layout]
 
index bef8f38..427de3b 100644 (file)
@@ -19,7 +19,7 @@ import CmmUtils
 import CmmInfo
 import CmmLive
 import CmmSwitch
-import Data.List (sortBy, foldl')
+import Data.List (sortBy)
 import Maybes
 import Control.Monad
 import Outputable
index d7f53a0..4c5516b 100644 (file)
@@ -17,7 +17,7 @@ import GhcPrelude
 import qualified Data.IntMap.Strict as M
 import qualified Data.IntSet as S
 
-import Data.List (foldl', foldl1')
+import Data.List (foldl1')
 
 class IsSet set where
   type ElemOf set
index 15c31ca..172b77c 100644 (file)
@@ -35,7 +35,6 @@ import Cmm
 import CmmUtils
 import CLabel
 
-import qualified Module
 import CostCentre
 import DynFlags
 import FastString
index aebd0e3..f4fc94d 100644 (file)
@@ -32,7 +32,7 @@ import PprCore  ( pprCoreBindings, pprRules )
 import OccurAnal( occurAnalyseExpr, occurAnalysePgm )
 import Literal  ( Literal(LitString) )
 import Id
-import Var      ( varType, isNonCoVarId )
+import Var      ( isNonCoVarId )
 import VarSet
 import VarEnv
 import DataCon
index 58a7162..cf37a8d 100644 (file)
@@ -60,7 +60,7 @@ import Name             ( NamedThing(..), nameSrcSpan )
 import SrcLoc           ( SrcSpan(..), realSrcLocSpan, mkRealSrcLoc )
 import Data.Bits
 import MonadUtils       ( mapAccumLM )
-import Data.List        ( mapAccumL, foldl' )
+import Data.List        ( mapAccumL )
 import Control.Monad
 import CostCentre       ( CostCentre, ccFromThisModule )
 import qualified Data.Set as S
index 826ffe1..fde107b 100644 (file)
@@ -21,8 +21,6 @@ import Var
 import Type (Type, typeSize)
 import Id (isJoinId)
 
-import Data.List (foldl')
-
 data CoreStats = CS { cs_tm :: !Int    -- Terms
                     , cs_ty :: !Int    -- Types
                     , cs_co :: !Int    -- Coercions
index 447fea4..f322e14 100644 (file)
@@ -53,7 +53,7 @@ import Name
 import VarSet
 import Rules
 import VarEnv
-import Var( EvVar, varType )
+import Var( EvVar )
 import Outputable
 import Module
 import SrcLoc
index e7eb710..9a5fb39 100644 (file)
@@ -41,7 +41,6 @@ import Util
 -- Standard libraries
 import Data.Array.Unboxed
 import Foreign.Ptr
-import GHC.IO           ( IO(..) )
 import GHC.Exts
 
 {-
index 167ea1b..f4d09cc 100644 (file)
@@ -57,16 +57,15 @@ import TysWiredIn
 import DynFlags
 import Outputable as Ppr
 import GHC.Char
-import GHC.Exts
 import GHC.Exts.Heap
-import GHC.IO ( IO(..) )
 import SMRep ( roundUpTo )
 
 import Control.Monad
-import Data.Array.Base
 import Data.Maybe
 import Data.List
 #if defined(INTEGER_GMP)
+import GHC.Exts
+import Data.Array.Base
 import GHC.Integer.GMP.Internals
 #endif
 import qualified Data.Sequence as Seq
index 8bd33d6..92fc77e 100644 (file)
@@ -22,7 +22,6 @@ import RdrName
 import qualified Name
 import Module
 import RdrHsSyn
-import qualified OccName
 import OccName
 import SrcLoc
 import Type
index 98f503b..c541a12 100644 (file)
@@ -44,7 +44,6 @@ import DynFlags
 import Data.Data hiding ( Fixity )
 import Data.List hiding ( foldr )
 import Data.Ord
-import Data.Foldable ( Foldable(..) )
 
 {-
 ************************************************************************
index 43653a5..2dff478 100644 (file)
@@ -18,7 +18,6 @@ module HsExtension where
 
 import GhcPrelude
 
-import GHC.Exts (Constraint)
 import Data.Data hiding ( Fixity )
 import PlaceHolder
 import Name
index 39bd9b7..d97be4b 100644 (file)
@@ -281,6 +281,9 @@ ieWrappedName (IEName    (L _ n)) = n
 ieWrappedName (IEPattern (L _ n)) = n
 ieWrappedName (IEType    (L _ n)) = n
 
+lieWrappedName :: LIEWrappedName name -> name
+lieWrappedName (L _ n) = ieWrappedName n
+
 ieLWrappedName :: LIEWrappedName name -> Located name
 ieLWrappedName (L l n) = L l (ieWrappedName n)
 
index f0f71be..1d44bff 100644 (file)
@@ -90,7 +90,6 @@ import FastString
 import Maybes( isJust )
 
 import Data.Data hiding ( Fixity, Prefix, Infix )
-import Data.List ( foldl' )
 import Data.Maybe ( fromMaybe )
 
 {-
index bb82049..6071bd8 100644 (file)
@@ -38,7 +38,6 @@ import Util
 import Control.Monad.Trans.Class
 import Control.Monad.Trans.Writer
 
-import Data.Semigroup   ( Semigroup )
 import qualified Data.Semigroup as Semigroup
 import Data.List ( nub )
 import Data.Maybe ( catMaybes )
index 814b71e..1f1b44e 100644 (file)
@@ -34,7 +34,6 @@ module Ar
 
 import GhcPrelude
 
-import Data.Semigroup (Semigroup)
 import Data.List (mapAccumL, isPrefixOf)
 import Data.Monoid ((<>))
 import Data.Binary.Get
index 654c347..a93da7b 100644 (file)
@@ -248,7 +248,9 @@ import qualified EnumSet
 import GHC.Foreign (withCString, peekCString)
 import qualified GHC.LanguageExtensions as LangExt
 
+#if defined(GHCI)
 import Foreign (Ptr) -- needed for 2nd stage
+#endif
 
 -- Note [Updating flag description in the User's Guide]
 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index 764bf2d..7420f7c 100644 (file)
@@ -25,7 +25,6 @@ module DynamicLoading (
     ) where
 
 import GhcPrelude
-import HscTypes         ( HscEnv )
 import DynFlags
 
 #if defined(GHCI)
@@ -63,6 +62,7 @@ import GHC.Exts          ( unsafeCoerce# )
 
 #else
 
+import HscTypes         ( HscEnv )
 import Module           ( ModuleName, moduleNameString )
 import Panic
 
@@ -76,12 +76,13 @@ import Control.Monad    ( unless )
 -- actual compilation starts. Idempotent operation. Should be re-called if
 -- pluginModNames or pluginModNameOpts changes.
 initializePlugins :: HscEnv -> DynFlags -> IO DynFlags
-initializePlugins hsc_env df
 #if !defined(GHCI)
+initializePlugins _ df
   = do let pluginMods = pluginModNames df
        unless (null pluginMods) (pluginError pluginMods)
        return df
 #else
+initializePlugins hsc_env df
   | map lpModuleName (plugins df) == pluginModNames df -- plugins not changed
      && all (\p -> lpArguments p == argumentsForPlugin p (pluginModNameOpts df))
             (plugins df) -- arguments not changed
index 3e2c963..57d608b 100644 (file)
@@ -50,7 +50,6 @@ import System.Directory
 import System.FilePath
 import Control.Monad
 import Data.Time
-import Data.List        ( foldl' )
 
 
 type FileExt = String   -- Filename extension
index cf9c74f..da5ef8b 100644 (file)
@@ -291,7 +291,6 @@ import GhcPrelude hiding (init)
 import ByteCodeTypes
 import InteractiveEval
 import InteractiveEvalTypes
-import TcRnDriver       ( runTcInteractive )
 import GHCi
 import GHCi.RemoteTypes
 
@@ -359,7 +358,6 @@ import Data.Set (Set)
 import qualified Data.Sequence as Seq
 import System.Directory ( doesFileExist )
 import Data.Maybe
-import Data.List        ( find )
 import Data.Time
 import Data.Typeable    ( Typeable )
 import Data.Word        ( Word8 )
index 837e903..d7cebd0 100644 (file)
@@ -85,7 +85,6 @@ module HscMain
 import GhcPrelude
 
 import Data.Data hiding (Fixity, TyCon)
-import DynFlags         (addPluginModuleName)
 import Id
 import GHCi             ( addSptEntry )
 import GHCi.RemoteTypes ( ForeignHValue )
index 0bd83ce..72f4534 100644 (file)
@@ -17,7 +17,6 @@ import SrcLoc
 import Util
 
 import Data.Char
-import Data.Foldable (foldl')
 
 -- | Source Statistics
 ppSourceStats :: Bool -> Located (HsModule GhcPs) -> SDoc
index 78d5961..2ee2136 100644 (file)
@@ -95,7 +95,6 @@ import Data.List as List
 import Data.Map (Map)
 import Data.Set (Set)
 import Data.Monoid (First(..))
-import Data.Semigroup   ( Semigroup )
 import qualified Data.Semigroup as Semigroup
 import qualified Data.Map as Map
 import qualified Data.Map.Strict as MapStrict
index fb002e2..546d48a 100644 (file)
@@ -27,8 +27,6 @@ import Unique
 import UniqFM
 import UniqSet
 
-import Data.Foldable (foldl')
-
 -- | For a jump instruction at the end of a block, generate fixup code so its
 --      vregs are in the correct regs for its destination.
 --
index 5815482..24577c4 100644 (file)
@@ -13,7 +13,6 @@ import Platform
 
 import Data.Word
 import Data.Bits
-import Data.Foldable (foldl')
 
 -- The PowerPC has 32 integer and 32 floating point registers.
 -- This is 32bit PowerPC, so Word64 is inefficient - two Word32s are much
index 653b270..09003cf 100644 (file)
@@ -15,7 +15,6 @@ import Platform
 
 import Data.Word
 import Data.Bits
-import Data.Foldable (foldl')
 
 
 --------------------------------------------------------------------------------
index 65a566d..b8af046 100644 (file)
@@ -13,7 +13,6 @@ import Platform
 
 import Data.Word
 import Data.Bits
-import Data.Foldable (foldl')
 
 newtype FreeRegs = FreeRegs Word32
     deriving Show
index 713b053..3a6e340 100644 (file)
@@ -11,7 +11,6 @@ import Reg
 import Panic
 import Platform
 
-import Data.Foldable (foldl')
 import Data.Word
 import Data.Bits
 
index 2faa58b..ef8b10e 100644 (file)
@@ -106,7 +106,6 @@ import FastString
 import Maybes
 import Util
 import ApiAnnotation
-import HsExtension      ( noExt )
 import Data.List
 import DynFlags ( WarningFlag(..) )
 
index c28f47e..87f8be7 100644 (file)
@@ -77,7 +77,6 @@ import ListSetOps       ( minusList )
 import qualified GHC.LanguageExtensions as LangExt
 import RnUnbound
 import RnUtils
-import Data.Maybe (isJust)
 import qualified Data.Semigroup as Semi
 import Data.Either      ( partitionEithers )
 import Data.List        (find)
@@ -638,21 +637,21 @@ lookupSubBndrOcc_helper must_have_parent warn_if_deprec parent rdr_name
             NoParent -> Nothing
 
         picked_gres :: [GlobalRdrElt] -> DisambigInfo
+        -- For Unqual, find GREs that are in scope qualified or unqualified
+        -- For Qual,   find GREs that are in scope with that qualification
         picked_gres gres
           | isUnqual rdr_name
-              = mconcat (map right_parent gres)
+          = mconcat (map right_parent gres)
           | otherwise
-              = mconcat (map right_parent (pickGREs rdr_name gres))
-
+          = mconcat (map right_parent (pickGREs rdr_name gres))
 
         right_parent :: GlobalRdrElt -> DisambigInfo
         right_parent p
-          | Just cur_parent <- getParent p
-            = if parent == cur_parent
-                then DisambiguatedOccurrence p
-                else NoOccurrence
-          | otherwise
-            = UniqueOccurrence p
+          = case getParent p of
+               Just cur_parent
+                  | parent == cur_parent -> DisambiguatedOccurrence p
+                  | otherwise            -> NoOccurrence
+               Nothing                   -> UniqueOccurrence p
 
 
 -- This domain specific datatype is used to record why we decided it was
index a944d71..b325eeb 100644 (file)
@@ -5,7 +5,6 @@ import NameSet     ( FreeVars )
 import TcRnTypes
 import SrcLoc      ( Located )
 import Outputable  ( Outputable )
-import HsExtension ( GhcPs, GhcRn )
 
 rnLExpr :: LHsExpr GhcPs
         -> RnM (LHsExpr GhcRn, FreeVars)
index 8ded9c2..09fa815 100644 (file)
@@ -63,13 +63,11 @@ import qualified GHC.LanguageExtensions as LangExt
 
 import Control.Monad
 import Data.Either      ( partitionEithers, isRight, rights )
--- import qualified Data.Foldable as Foldable
 import Data.Map         ( Map )
 import qualified Data.Map as Map
 import Data.Ord         ( comparing )
 import Data.List        ( partition, (\\), find, sortBy )
 import qualified Data.Set as S
--- import qualified Data.Set as Set
 import System.FilePath  ((</>))
 
 import System.IO
@@ -1094,8 +1092,8 @@ gresFromIE decl_spec (L loc ie, avail)
   = gresFromAvail prov_fn avail
   where
     is_explicit = case ie of
-                    IEThingAll _ (L _ name) -> \n -> n == ieWrappedName name
-                    _                       -> \_ -> True
+                    IEThingAll _ name -> \n -> n == lieWrappedName name
+                    _                 -> \_ -> True
     prov_fn name
       = Just (ImpSpec { is_decl = decl_spec, is_item = item_spec })
       where
@@ -1217,44 +1215,11 @@ reportUnusedNames _export_decls gbl_env
     is_unused_local :: GlobalRdrElt -> Bool
     is_unused_local gre = isLocalGRE gre && isExternalName (gre_name gre)
 
-{-
-*********************************************************
-*                                                       *
-\subsection{Unused imports}
-*                                                       *
-*********************************************************
-
-This code finds which import declarations are unused.  The
-specification and implementation notes are here:
-  http://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/UnusedImports
--}
-
-type ImportDeclUsage
-   = ( LImportDecl GhcRn   -- The import declaration
-     , [AvailInfo]        -- What *is* used (normalised)
-     , [Name] )       -- What is imported but *not* used
-
-warnUnusedImportDecls :: TcGblEnv -> RnM ()
-warnUnusedImportDecls gbl_env
-  = do { uses <- readMutVar (tcg_used_gres gbl_env)
-       ; let user_imports = filterOut (ideclImplicit . unLoc) (tcg_rn_imports gbl_env)
-                            -- This whole function deals only with *user* imports
-                            -- both for warning about unnecessary ones, and for
-                            -- deciding the minimal ones
-             rdr_env = tcg_rdr_env gbl_env
-             fld_env = mkFieldEnv rdr_env
-
-       ; let usage :: [ImportDeclUsage]
-             usage = findImportUsage user_imports uses
-
-       ; traceRn "warnUnusedImportDecls" $
-                       (vcat [ text "Uses:" <+> ppr uses
-                       , text "Import usage" <+> ppr usage])
-       ; whenWOptM Opt_WarnUnusedImports $
-         mapM_ (warnUnusedImport Opt_WarnUnusedImports fld_env) usage
-
-       ; whenGOptM Opt_D_dump_minimal_imports $
-         printMinimalImports usage }
+{- *********************************************************************
+*                                                                      *
+              Missing signatures
+*                                                                      *
+********************************************************************* -}
 
 -- | Warn the user about top level binders that lack type signatures.
 -- Called /after/ type inference, so that we can report the
@@ -1312,29 +1277,50 @@ warnMissingSignatures gbl_env
 
        ; add_sig_warns }
 
+
 {-
-Note [The ImportMap]
-~~~~~~~~~~~~~~~~~~~~
-The ImportMap is a short-lived intermediate data structure records, for
-each import declaration, what stuff brought into scope by that
-declaration is actually used in the module.
+*********************************************************
+*                                                       *
+\subsection{Unused imports}
+*                                                       *
+*********************************************************
 
-The SrcLoc is the location of the END of a particular 'import'
-declaration.  Why *END*?  Because we don't want to get confused
-by the implicit Prelude import. Consider (Trac #7476) the module
-    import Foo( foo )
-    main = print foo
-There is an implicit 'import Prelude(print)', and it gets a SrcSpan
-of line 1:1 (just the point, not a span). If we use the *START* of
-the SrcSpan to identify the import decl, we'll confuse the implicit
-import Prelude with the explicit 'import Foo'.  So we use the END.
-It's just a cheap hack; we could equally well use the Span too.
+This code finds which import declarations are unused.  The
+specification and implementation notes are here:
+  http://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/UnusedImports
 
-The AvailInfos are the things imported from that decl (just a list,
-not normalised).
+See also Note [Choosing the best import declaration] in RdrName
 -}
 
-type ImportMap = Map SrcLoc [AvailInfo]  -- See [The ImportMap]
+type ImportDeclUsage
+   = ( LImportDecl GhcRn   -- The import declaration
+     , [GlobalRdrElt]      -- What *is* used (normalised)
+     , [Name] )            -- What is imported but *not* used
+
+warnUnusedImportDecls :: TcGblEnv -> RnM ()
+warnUnusedImportDecls gbl_env
+  = do { uses <- readMutVar (tcg_used_gres gbl_env)
+       ; let user_imports = filterOut
+                              (ideclImplicit . unLoc)
+                              (tcg_rn_imports gbl_env)
+                -- This whole function deals only with *user* imports
+                -- both for warning about unnecessary ones, and for
+                -- deciding the minimal ones
+             rdr_env = tcg_rdr_env gbl_env
+             fld_env = mkFieldEnv rdr_env
+
+       ; let usage :: [ImportDeclUsage]
+             usage = findImportUsage user_imports uses
+
+       ; traceRn "warnUnusedImportDecls" $
+                       (vcat [ text "Uses:" <+> ppr uses
+                             , text "Import usage" <+> ppr usage])
+
+       ; whenWOptM Opt_WarnUnusedImports $
+         mapM_ (warnUnusedImport Opt_WarnUnusedImports fld_env) usage
+
+       ; whenGOptM Opt_D_dump_minimal_imports $
+         printMinimalImports usage }
 
 findImportUsage :: [LImportDecl GhcRn]
                 -> [GlobalRdrElt]
@@ -1344,16 +1330,17 @@ findImportUsage imports used_gres
   = map unused_decl imports
   where
     import_usage :: ImportMap
-    import_usage
-      = foldr extendImportMap Map.empty used_gres
+    import_usage = mkImportMap used_gres
 
     unused_decl decl@(L loc (ImportDecl { ideclHiding = imps }))
-      = (decl, nubAvails used_avails, nameSetElemsStable unused_imps)
+      = (decl, used_gres, nameSetElemsStable unused_imps)
       where
-        used_avails = Map.lookup (srcSpanEnd loc) import_usage `orElse` []
-                      -- srcSpanEnd: see Note [The ImportMap]
-        used_names   = availsToNameSetWithSelectors used_avails
-        used_parents = mkNameSet [n | AvailTC n _ _ <- used_avails]
+        used_gres = Map.lookup (srcSpanEnd loc) import_usage
+                               -- srcSpanEnd: see Note [The ImportMap]
+                    `orElse` []
+
+        used_names   = mkNameSet (map      gre_name        used_gres)
+        used_parents = mkNameSet (mapMaybe greParent_maybe used_gres)
 
         unused_imps   -- Not trivial; see eg Trac #7454
           = case imps of
@@ -1362,19 +1349,16 @@ findImportUsage imports used_gres
               _other -> emptyNameSet -- No explicit import list => no unused-name list
 
         add_unused :: IE GhcRn -> NameSet -> NameSet
-        add_unused (IEVar _ (L _ n))      acc
-                                       = add_unused_name (ieWrappedName n) acc
-        add_unused (IEThingAbs _ (L _ n)) acc
-                                       = add_unused_name (ieWrappedName n) acc
-        add_unused (IEThingAll _ (L _ n)) acc
-                                       = add_unused_all  (ieWrappedName n) acc
-        add_unused (IEThingWith _ (L _ p) wc ns fs) acc =
-          add_wc_all (add_unused_with (ieWrappedName p) xs acc)
-          where xs = map (ieWrappedName . unLoc) ns
-                          ++ map (flSelector . unLoc) fs
+        add_unused (IEVar _ n)      acc = add_unused_name (lieWrappedName n) acc
+        add_unused (IEThingAbs _ n) acc = add_unused_name (lieWrappedName n) acc
+        add_unused (IEThingAll _ n) acc = add_unused_all  (lieWrappedName n) acc
+        add_unused (IEThingWith _ p wc ns fs) acc =
+          add_wc_all (add_unused_with pn xs acc)
+          where pn = lieWrappedName p
+                xs = map lieWrappedName ns ++ map (flSelector . unLoc) fs
                 add_wc_all = case wc of
                             NoIEWildcard -> id
-                            IEWildcard _ -> add_unused_all (ieWrappedName p)
+                            IEWildcard _ -> add_unused_all pn
         add_unused _ acc = acc
 
         add_unused_name n acc
@@ -1394,49 +1378,86 @@ findImportUsage imports used_gres
        -- Num is not itself mentioned.  Hence the two cases in add_unused_with.
     unused_decl (L _ (XImportDecl _)) = panic "unused_decl"
 
-extendImportMap :: GlobalRdrElt -> ImportMap -> ImportMap
+
+{- Note [The ImportMap]
+~~~~~~~~~~~~~~~~~~~~~~~
+The ImportMap is a short-lived intermediate data structure records, for
+each import declaration, what stuff brought into scope by that
+declaration is actually used in the module.
+
+The SrcLoc is the location of the END of a particular 'import'
+declaration.  Why *END*?  Because we don't want to get confused
+by the implicit Prelude import. Consider (Trac #7476) the module
+    import Foo( foo )
+    main = print foo
+There is an implicit 'import Prelude(print)', and it gets a SrcSpan
+of line 1:1 (just the point, not a span). If we use the *START* of
+the SrcSpan to identify the import decl, we'll confuse the implicit
+import Prelude with the explicit 'import Foo'.  So we use the END.
+It's just a cheap hack; we could equally well use the Span too.
+
+The [GlobalRdrElt] are the things imported from that decl.
+-}
+
+type ImportMap = Map SrcLoc [GlobalRdrElt]  -- See [The ImportMap]
+     -- If loc :-> gres, then
+     --   'loc' = the end loc of the bestImport of each GRE in 'gres'
+
+mkImportMap :: [GlobalRdrElt] -> ImportMap
 -- For each of a list of used GREs, find all the import decls that brought
 -- it into scope; choose one of them (bestImport), and record
 -- the RdrName in that import decl's entry in the ImportMap
-extendImportMap gre imp_map
-   = add_imp gre (bestImport (gre_imp gre)) imp_map
+mkImportMap gres
+  = foldr add_one Map.empty gres
   where
-    add_imp :: GlobalRdrElt -> ImportSpec -> ImportMap -> ImportMap
-    add_imp gre (ImpSpec { is_decl = imp_decl_spec }) imp_map
-      = Map.insertWith add decl_loc [avail] imp_map
-      where
-        add _ avails = avail : avails -- add is really just a specialised (++)
-        decl_loc = srcSpanEnd (is_dloc imp_decl_spec)
-                   -- For srcSpanEnd see Note [The ImportMap]
-        avail    = availFromGRE gre
+    add_one gre@(GRE { gre_imp = imp_specs }) imp_map
+       = Map.insertWith add decl_loc [gre] imp_map
+       where
+          best_imp_spec = bestImport imp_specs
+          decl_loc      = srcSpanEnd (is_dloc (is_decl best_imp_spec))
+                        -- For srcSpanEnd see Note [The ImportMap]
+          add _ gres = gre : gres
 
 warnUnusedImport :: WarningFlag -> NameEnv (FieldLabelString, Name)
                  -> ImportDeclUsage -> RnM ()
 warnUnusedImport flag fld_env (L loc decl, used, unused)
+
+  -- Do not warn for 'import M()'
   | Just (False,L _ []) <- ideclHiding decl
-                = return ()            -- Do not warn for 'import M()'
+  = return ()
 
+  -- Note [Do not warn about Prelude hiding]
   | Just (True, L _ hides) <- ideclHiding decl
   , not (null hides)
   , pRELUDE_NAME == unLoc (ideclName decl)
-                = return ()            -- Note [Do not warn about Prelude hiding]
-  | null used   = addWarnAt (Reason flag) loc msg1 -- Nothing used; drop entire decl
-  | null unused = return ()            -- Everything imported is used; nop
-  | otherwise   = addWarnAt (Reason flag) loc msg2 -- Some imports are unused
+  = return ()
+
+  -- Nothing used; drop entire declaration
+  | null used
+  = addWarnAt (Reason flag) loc msg1
+
+  -- Everything imported is used; nop
+  | null unused
+  = return ()
+
+  -- Some imports are unused
+  | otherwise
+  = addWarnAt (Reason flag) loc  msg2
+
   where
-    msg1 = vcat [pp_herald <+> quotes pp_mod <+> pp_not_used,
-                 nest 2 (text "except perhaps to import instances from"
-                                   <+> quotes pp_mod),
-                 text "To import instances alone, use:"
+    msg1 = vcat [ pp_herald <+> quotes pp_mod <+> is_redundant
+                , nest 2 (text "except perhaps to import instances from"
+                                   <+> quotes pp_mod)
+                , text "To import instances alone, use:"
                                    <+> text "import" <+> pp_mod <> parens Outputable.empty ]
-    msg2 = sep [pp_herald <+> quotes sort_unused,
-                    text "from module" <+> quotes pp_mod <+> pp_not_used]
+    msg2 = sep [ pp_herald <+> quotes sort_unused
+               , text "from module" <+> quotes pp_mod <+> is_redundant]
     pp_herald  = text "The" <+> pp_qual <+> text "import of"
     pp_qual
       | ideclQualified decl = text "qualified"
       | otherwise           = Outputable.empty
-    pp_mod      = ppr (unLoc (ideclName decl))
-    pp_not_used = text "is redundant"
+    pp_mod       = ppr (unLoc (ideclName decl))
+    is_redundant = text "is redundant"
 
     -- In warning message, pretty-print identifiers unqualified unconditionally
     -- to improve the consistent for ambiguous/unambiguous identifiers.
@@ -1446,8 +1467,9 @@ warnUnusedImport flag fld_env (L loc decl, used, unused)
                                Nothing  -> pprNameUnqualified n
 
     -- Print unused names in a deterministic (lexicographic) order
+    sort_unused :: SDoc
     sort_unused = pprWithCommas ppr_possible_field $
-                    sortBy (comparing nameOccName) unused
+                  sortBy (comparing nameOccName) unused
 
 {-
 Note [Do not warn about Prelude hiding]
@@ -1475,7 +1497,7 @@ decls, and simply trim their import lists.  NB that
 getMinimalImports :: [ImportDeclUsage] -> RnM [LImportDecl GhcRn]
 getMinimalImports = mapM mk_minimal
   where
-    mk_minimal (L l decl, used, unused)
+    mk_minimal (L l decl, used_gres, unused)
       | null unused
       , Just (False, _) <- ideclHiding decl
       = return (L l decl)
@@ -1484,7 +1506,8 @@ getMinimalImports = mapM mk_minimal
                             , ideclSource  = is_boot
                             , ideclPkgQual = mb_pkg } = decl
            ; iface <- loadSrcInterface doc mod_name is_boot (fmap sl_fs mb_pkg)
-           ; let lies = map (L l) (concatMap (to_ie iface) used)
+           ; let used_avails = gresToAvailInfo used_gres
+                 lies = map (L l) (concatMap (to_ie iface) used_avails)
            ; return (L l (decl { ideclHiding = Just (False, L l lies) })) }
       where
         doc = text "Compute minimal imports for" <+> ppr decl
index 48739cd..5ecb1a6 100644 (file)
@@ -67,7 +67,7 @@ import Control.Arrow ( first )
 import Data.List ( mapAccumL )
 import qualified Data.List.NonEmpty as NE
 import Data.List.NonEmpty ( NonEmpty(..) )
-import Data.Maybe ( isNothing, maybe, fromMaybe )
+import Data.Maybe ( isNothing, fromMaybe )
 import qualified Data.Set as Set ( difference, fromList, toList, null )
 
 {- | @rnSourceDecl@ "renames" declarations.
index eb148b1..4d437d3 100644 (file)
@@ -37,7 +37,7 @@ import Util
 import TysPrim
 import {-# SOURCE #-} TysWiredIn ( anyTypeOfKind )
 
-import Data.List (foldl', sort)
+import Data.List (sort)
 import qualified Data.IntSet as IS
 
 {- **********************************************************************
index 6f775df..67e57c8 100644 (file)
@@ -27,7 +27,6 @@ import Rules
 import CoreOpt          ( collectBindersPushingCo )
 import CoreUtils        ( exprIsTrivial, applyTypeToArgs, mkCast )
 import CoreFVs
-import FV               ( InterestingVarFun )
 import CoreArity        ( etaExpandToJoinPointRule )
 import UniqSupply
 import Name
index 03adfde..37057a1 100644 (file)
@@ -29,9 +29,7 @@ import Id
 import Type
 import MkCore ( mkStringExprFS, mkNaturalExpr )
 
-import Unique ( hasKey )
 import Name   ( Name )
-import Var    ( DFunId )
 import DataCon
 import TyCon
 import Class
index 31055fd..73f39ed 100644 (file)
@@ -65,7 +65,7 @@ import RnModIface
 import Util
 
 import Control.Monad
-import Data.List (find, foldl')
+import Data.List (find)
 
 import {-# SOURCE #-} TcRnDriver
 
index b576fc3..46e5d82 100644 (file)
@@ -43,7 +43,7 @@ import Bag
 import MonadUtils
 import Control.Monad
 import Data.Maybe ( isJust )
-import Data.List  ( zip4, foldl' )
+import Data.List  ( zip4 )
 import BasicTypes
 
 import Data.Bifunctor ( bimap )
index bb9c76b..4ee0f23 100644 (file)
@@ -26,7 +26,7 @@ import TcValidity( allDistinctTyVars )
 import TcClassDcl( instDeclCtxt3, tcATDefault, tcMkDeclCtxt )
 import TcEnv
 import TcGenDeriv                       -- Deriv stuff
-import TcValidity
+import TcValidity( checkValidInstHead )
 import InstEnv
 import Inst
 import FamInstEnv
index 5496f16..6443fbd 100644 (file)
@@ -64,7 +64,7 @@ import qualified Data.Set as Set
 
 import {-# SOURCE #-} TcHoleErrors ( findValidHoleFits )
 
-import Data.Semigroup   ( Semigroup )
+-- import Data.Semigroup   ( Semigroup )
 import qualified Data.Semigroup as Semigroup
 
 
index 1dee603..843ec84 100644 (file)
@@ -44,7 +44,6 @@ import HscTypes        ( ModIface(..) )
 import LoadIface       ( loadInterfaceForNameMaybe )
 
 import PrelInfo (knownKeyNames)
-import Name (isBuiltInSyntax)
 
 
 {-
index 99e2172..69f51b8 100644 (file)
@@ -59,7 +59,6 @@ import TcEvidence
 import TysPrim
 import TyCon
 import TysWiredIn
-import TyCoRep( CoercionHole(..) )
 import Type
 import Coercion
 import ConLike
index e724090..ea0f50f 100644 (file)
@@ -9,7 +9,6 @@ import HsSyn
 import TcRnTypes
 import TcEnv( InstInfo )
 import TcDeriv
-import HsExtension ( GhcRn )
 
 -- We need this because of the mutual recursion
 -- between TcTyClsDecls and TcInstDcls
index 32b4718..0833b33 100644 (file)
@@ -27,7 +27,7 @@ import Class
 import TyCon
 import FunDeps
 import FamInst
-import ClsInst( ClsInstResult(..), InstanceWhat(..), safeOverlap )
+import ClsInst( InstanceWhat(..), safeOverlap )
 import FamInstEnv
 import Unify ( tcUnifyTyWithTFs, ruleMatchTyKiX )
 
@@ -40,7 +40,7 @@ import Bag
 import MonadUtils ( concatMapM, foldlM )
 
 import CoreSyn
-import Data.List( partition, foldl', deleteFirstsBy )
+import Data.List( partition, deleteFirstsBy )
 import SrcLoc
 import VarEnv
 
index 4a770b5..5fad219 100644 (file)
@@ -17,15 +17,13 @@ import GhcPrelude
 
 import HsSyn
 import TcPat
-import Type( mkEmptyTCvSubst, tidyTyCoVarBinders, tidyTypes, tidyType )
+import Type( tidyTyCoVarBinders, tidyTypes, tidyType )
 import TcRnMonad
 import TcSigs( emptyPragEnv, completeSigFromId )
-import TcType( mkMinimalBySCs )
 import TcEnv
 import TcMType
 import TcHsSyn
 import TysPrim
-import TysWiredIn  ( runtimeRepTy )
 import Name
 import SrcLoc
 import PatSyn
index 9d150b5..04f17cc 100644 (file)
@@ -156,7 +156,7 @@ import TcEvidence
 import Type
 import Class    ( Class )
 import TyCon    ( TyCon, TyConFlavour, tyConKind )
-import TyCoRep  ( CoercionHole(..), coHoleCoVar )
+import TyCoRep  ( coHoleCoVar )
 import Coercion ( Coercion, mkHoleCo )
 import ConLike  ( ConLike(..) )
 import DataCon  ( DataCon, dataConUserType, dataConOrigArgTys )
@@ -557,7 +557,8 @@ data TcGblEnv
 
         tcg_dus       :: DefUses,   -- ^ What is defined in this module and what is used.
         tcg_used_gres :: TcRef [GlobalRdrElt],  -- ^ Records occurrences of imported entities
-          -- See Note [Tracking unused binding and imports]
+          -- One entry for each occurrence; but may have different GREs for
+          -- the same Name See Note [Tracking unused binding and imports]
 
         tcg_keep :: TcRef NameSet,
           -- ^ Locally-defined top-level names to keep alive.
index 68a514f..adcfdbe 100644 (file)
@@ -143,7 +143,6 @@ import Kind
 import TcType
 import DynFlags
 import Type
-import TyCoRep( coHoleCoVar )
 import Coercion
 import Unify
 
@@ -175,7 +174,7 @@ import Control.Monad
 import qualified Control.Monad.Fail as MonadFail
 import MonadUtils
 import Data.IORef
-import Data.List ( foldl', partition, mapAccumL )
+import Data.List ( partition, mapAccumL )
 
 #if defined(DEBUG)
 import Digraph
index d454f4c..1e596ba 100644 (file)
@@ -224,7 +224,7 @@ import FastString
 import ErrUtils( Validity(..), MsgDoc, isValid )
 import qualified GHC.LanguageExtensions as LangExt
 
-import Data.List  ( mapAccumL, foldl' )
+import Data.List  ( mapAccumL )
 import Data.Functor.Identity( Identity(..) )
 import Data.IORef
 import Data.List.NonEmpty( NonEmpty(..) )
index 05d49ae..90a4a83 100644 (file)
@@ -31,7 +31,6 @@ import Type
 import Kind ( isTYPEApp )
 import TyCon
 import DataCon
-import Name ( getOccName )
 import Module
 import HsSyn
 import DynFlags
index 98dbf4b..a40a02d 100644 (file)
@@ -137,7 +137,8 @@ import {-# SOURCE #-} TysWiredIn ( runtimeRepTyCon, constraintKind
                                  , vecCountTyCon, vecElemTyCon, liftedTypeKind
                                  , mkFunKind, mkForAllKind )
 import {-# SOURCE #-} DataCon    ( DataCon, dataConExTyCoVars, dataConFieldLabels
-                                 , dataConTyCon, dataConFullSig )
+                                 , dataConTyCon, dataConFullSig
+                                 , isUnboxedSumCon )
 
 import Binary
 import Var
@@ -159,7 +160,6 @@ import Util
 import Unique( tyConRepNameUnique, dataConTyRepNameUnique )
 import UniqSet
 import Module
-import {-# SOURCE #-} DataCon
 
 import qualified Data.Data as Data
 
index 8e4dae7..064712b 100644 (file)
@@ -19,7 +19,6 @@ import GhcPrelude
 
 import Outputable
 
-import Data.Semigroup   ( Semigroup )
 import qualified Data.Semigroup as Semigroup
 
 infixl 5  `appOL`
index 28fd487..bb3b9d3 100644 (file)
@@ -108,7 +108,6 @@ import Panic
 import GHC.Serialized
 import GHC.LanguageExtensions (Extension)
 
-import Control.Exception (finally)
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS
 import Data.Char
index 82b5e9f..1c45f74 100644 (file)
@@ -52,7 +52,6 @@ import UniqFM
 import Unique
 import Data.Coerce
 import Outputable
-import Data.Foldable (foldl')
 import Data.Data
 import qualified Data.Semigroup as Semi
 
index 47fed9c..8135c37 100644 (file)
@@ -7,7 +7,7 @@ module GHCi.Leak
 
 import Control.Monad
 import Data.Bits
-import DynFlags (settings, sTargetPlatform)
+import DynFlags ( sTargetPlatform )
 import Foreign.Ptr (ptrToIntPtr, intPtrToPtr)
 import GHC
 import GHC.Exts (anyToAddr#)
index fec927a..422217b 100644 (file)
@@ -114,7 +114,7 @@ executable hadrian
     other-extensions:    MultiParamTypeClasses
                        , TypeFamilies
     build-depends:       base                 >= 4.8     && < 5
-                       , Cabal                >= 2.4     && < 2.5
+                       , Cabal                >= 2.5     && < 2.6
                        , containers           == 0.5.*
                        , directory            >= 1.2     && < 1.4
                        , extra                >= 1.4.7
index e0edb78..bb2f0be 100644 (file)
@@ -63,7 +63,7 @@ parsePackageData pkg = do
         libDeps = collectDeps (C.condLibrary gpd)
         exeDeps = map (collectDeps . Just . snd) (C.condExecutables gpd)
         allDeps = concat (libDeps : exeDeps)
-        sorted  = sort [ C.unPackageName p | C.Dependency p _ <- allDeps ]
+        sorted  = sort [ C.unPackageName p | C.Dependency p _ <- allDeps ]
         deps    = nubOrd sorted \\ [name]
         depPkgs = catMaybes $ map findPackageByName deps
     return $ PackageData name version (C.synopsis pd) (C.description pd) depPkgs gpd
index 836ba04..3da088e 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 836ba04516516ec3740a9a584e514e0fed1d50d9
+Subproject commit 3da088e281f5cbc8a731e18ceb698cfea2e45004
index 0ae7b66..e719c8f 100644 (file)
@@ -69,7 +69,6 @@ import Control.Applicative (Alternative((<|>)), Const(Const))
 import Data.Functor.Identity (Identity(Identity))
 import Data.Proxy (Proxy(Proxy))
 import Data.List.NonEmpty (NonEmpty(..))
-import Data.Monoid (mappend)
 import Data.Ord (Down(Down))
 
 import GHC.Read (expectP, list, paren)
index 8ceadb8..4ddd12c 100644 (file)
@@ -27,8 +27,6 @@ import Data.Functor.Classes
 import Control.Applicative
 import Data.Coerce (coerce)
 import Data.Data (Data)
-import Data.Foldable (Foldable(foldMap))
-import Data.Traversable (Traversable(traverse))
 import GHC.Generics (Generic, Generic1)
 import Text.Read (Read(..), readListDefault, readListPrecDefault)
 
index 68a9993..fa03069 100644 (file)
@@ -54,7 +54,6 @@ import Data.Functor.Sum
 import Data.Functor.Compose
 
 import Data.Monoid (Alt(..))
-import Data.Semigroup (Semigroup(..))
 import Data.Proxy
 import GHC.Generics
 
index d98d31e..8ed983b 100644 (file)
@@ -26,10 +26,7 @@ import Control.Monad (MonadPlus(..))
 import Control.Monad.Fix (MonadFix(..))
 import Control.Monad.Zip (MonadZip(mzipWith))
 import Data.Data (Data)
-import Data.Foldable (Foldable(foldMap))
 import Data.Functor.Classes
-import Data.Monoid (mappend)
-import Data.Traversable (Traversable(traverse))
 import GHC.Generics (Generic, Generic1)
 import Text.Read (Read(..), readListDefault, readListPrecDefault)
 
index 68e60fe..337db02 100644 (file)
@@ -23,9 +23,7 @@ module Data.Functor.Sum (
 
 import Control.Applicative ((<|>))
 import Data.Data (Data)
-import Data.Foldable (Foldable(foldMap))
 import Data.Functor.Classes
-import Data.Traversable (Traversable(traverse))
 import GHC.Generics (Generic, Generic1)
 import Text.Read (Read(..), readListDefault, readListPrecDefault)
 
index fad1b20..918351f 100644 (file)
@@ -117,9 +117,6 @@ import           Data.Bifunctor
 import           Data.Bitraversable
 import           Data.Coerce
 import           Data.Data
-import           Data.Monoid         (All (..), Any (..), Dual (..), Endo (..),
-                                      Product (..), Sum (..))
--- import qualified Data.Monoid         as Monoid
 import           GHC.Generics
 
 -- | A generalization of 'Data.List.cycle' to an arbitrary 'Semigroup'.
index 6e13839..55a39fc 100644 (file)
@@ -49,7 +49,6 @@ import GHC.Event.Unique
 import GHC.Word (Word64)
 import GHC.Num (Num(..))
 import GHC.Real (fromIntegral)
-import GHC.Types (Int)
 
 #include "MachDeps.h"
 
index c4e09aa..0492464 100644 (file)
@@ -747,7 +747,7 @@ import GHC.Show    ( Show(..), showString )
 
 -- Needed for metadata
 import Data.Proxy   ( Proxy(..) )
-import GHC.TypeLits ( Nat, Symbol, KnownSymbol, KnownNat, symbolVal, natVal )
+import GHC.TypeLits ( KnownSymbol, KnownNat, symbolVal, natVal )
 
 --------------------------------------------------------------------------------
 -- Representation types
index a41bf81..faaa629 100644 (file)
@@ -53,7 +53,6 @@ import GHC.Base
 import GHC.List ((!!), foldr1, break)
 import GHC.Num
 import GHC.Stack.Types
-import GHC.Types (TypeLitSort (..))
 
 
 -- | The @shows@ functions return a function that prepends the
index 14ff3e0..ee5ba78 100644 (file)
@@ -49,7 +49,6 @@ module GHC.StaticPtr
 
 import Foreign.C.Types     (CInt(..))
 import Foreign.Marshal     (allocaArray, peekArray)
-import GHC.Exts            (addrToAny#)
 import GHC.Ptr             (Ptr(..), nullPtr)
 import GHC.Fingerprint     (Fingerprint(..))
 import GHC.Prim
index ce3c6a0..847563a 160000 (submodule)
@@ -1 +1 @@
-Subproject commit ce3c6a01cd9e2438358108e3e4b515304b5ce5a6
+Subproject commit 847563a2e5ce84714688429c4fee8df5c8568cb0
index 8bc8852..2cc3212 100644 (file)
@@ -30,7 +30,15 @@ module GHC.Magic ( inline, noinline, lazy, oneShot, runRW# ) where
 --        See Note [magicIds] in MkId.hs
 --------------------------------------------------
 
-import GHC.Prim
+-- Here import TYPE explicitely from GHC.Types and not from GHC.Prim. This is
+-- because TYPE is not exported by the source Haskell module generated by
+-- genprimops which Haddock will typecheck.
+-- Likewise, realWorld# is not generated by genprimops so we use CPP and only
+-- import/use it when not building haddock docs.
+#if !defined(__HADDOCK_VERSION__)
+import GHC.Prim (realWorld#)
+#endif
+import GHC.Prim (State#, RealWorld)
 import GHC.CString ()
 import GHC.Types (RuntimeRep, TYPE)
 
index 3ebcf0e..96fc441 100644 (file)
@@ -26,7 +26,7 @@ import Foreign hiding (newArray)
 import GHC.Arr          ( Array(..) )
 import GHC.Exts
 import GHC.IO
-import Control.Exception (throwIO, ErrorCall(..))
+import Control.Exception ( ErrorCall(..) )
 
 createBCOs :: [ResolvedBCO] -> IO [HValueRef]
 createBCOs bcos = do
index 2818851..5ae4230 100644 (file)
@@ -39,7 +39,6 @@ expectedGhcOnlyExtensions :: [String]
 expectedGhcOnlyExtensions = ["RelaxedLayout",
                              "AlternativeLayoutRule",
                              "AlternativeLayoutRuleTransitional",
-                             "DerivingVia",
                              "EmptyDataDeriving",
                              "GeneralisedNewtypeDeriving"]
 
index 2f9ffbb..ea9306a 100644 (file)
@@ -1,5 +1,5 @@
 
-mod177.hs:5:1: warning: [-Wunused-imports (in -Wextra)]
+mod177.hs:4:1: warning: [-Wunused-imports (in -Wextra)]
     The import of ‘Data.Maybe’ is redundant
       except perhaps to import instances from ‘Data.Maybe’
     To import instances alone, use: import Data.Maybe()
diff --git a/testsuite/tests/rename/should_compile/T13064.hs b/testsuite/tests/rename/should_compile/T13064.hs
new file mode 100644 (file)
index 0000000..6c8d79f
--- /dev/null
@@ -0,0 +1,8 @@
+{-# OPTIONS_GHC -Wunused-imports #-}
+module T13064 where
+
+import Control.Applicative
+import Prelude (IO, pure)   -- Import of 'pure' is redundant
+
+foo :: IO ()
+foo = () <$ pure ()
diff --git a/testsuite/tests/rename/should_compile/T13064.stderr b/testsuite/tests/rename/should_compile/T13064.stderr
new file mode 100644 (file)
index 0000000..3175a85
--- /dev/null
@@ -0,0 +1,3 @@
+
+T13064.hs:5:1: warning: [-Wunused-imports (in -Wextra)]
+    The import of ‘pure’ from module ‘Prelude’ is redundant
index a1f53d2..d8f8909 100644 (file)
@@ -1 +1 @@
-import T4239A ( (·), type (:+++)((:---), X, (:+++)) )
+import T4239A ( (·), type (:+++)((:---), (:+++), X) )
index a3f862f..86f04d0 100644 (file)
@@ -161,3 +161,4 @@ test('T14881', [], multimod_compile, ['T14881', '-W'])
 test('T14487', [], multimod_compile, ['T14487', '-v0'])
 test('T14747', [], multimod_compile, ['T14747', '-v0'])
 test('T15149', [], multimod_compile, ['T15149', '-v0'])
+test('T13064', normal, compile, [''])
index 3d07608..bc9698c 100644 (file)
@@ -24,6 +24,6 @@ Executable check-api-annotations
 
     Build-Depends: base       >= 4   && < 5,
                    containers,
-                   Cabal      >= 2.4.0 && < 2.5,
+                   Cabal      >= 2.5 && < 2.6,
                    directory,
                    ghc
index 2da21d7..4257a88 100644 (file)
@@ -25,7 +25,7 @@ Executable check-ppr
     Build-Depends: base       >= 4   && < 5,
                    bytestring,
                    containers,
-                   Cabal      >= 2.4 && < 2.5,
+                   Cabal      >= 2.5 && < 2.6,
                    directory,
                    filepath,
                    ghc
index baa7a17..c2512c1 100644 (file)
@@ -21,7 +21,7 @@ Executable ghc-cabal
 
     Build-Depends: base       >= 3   && < 5,
                    bytestring >= 0.10 && < 0.11,
-                   Cabal      >= 2.4 && < 2.5,
+                   Cabal      >= 2.5 && < 2.6,
                    directory  >= 1.1 && < 1.4,
                    filepath   >= 1.2 && < 1.5
 
index e774b80..6020f41 100644 (file)
@@ -183,7 +183,7 @@ flagsFromCabal :: FilePath -> IO [String]
 flagsFromCabal distPref = do
   lbi <- getPersistBuildConfig distPref
   let pd = localPkgDescr lbi
-  case componentNameTargets' pd lbi CLibName of
+  case componentNameTargets' pd lbi (CLibName LMainLibName) of
     [target] ->
       let clbi = targetCLBI target
           CLib lib = getComponent pd (componentLocalName clbi)
index f74bc4f..23de152 100644 (file)
@@ -18,6 +18,6 @@ Executable ghctags
 
     Build-Depends: base       >= 4   && < 5,
                    containers,
-                   Cabal      >= 2.4 && <2.5,
+                   Cabal      >= 2.5 && <2.6,
                    ghc