Fix over-zealous unused-import warning
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 2 May 2014 11:09:52 +0000 (12:09 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Mon, 5 May 2014 08:12:15 +0000 (09:12 +0100)
See Note [Un-warnable import decls] in RnNames.

Fixes Trac #9061.

compiler/rename/RnNames.lhs
testsuite/tests/module/T9061.hs [new file with mode: 0644]
testsuite/tests/module/all.T

index 7f6a840..678eb73 100644 (file)
@@ -1301,7 +1301,7 @@ type ImportDeclUsage
 warnUnusedImportDecls :: TcGblEnv -> RnM ()
 warnUnusedImportDecls gbl_env
   = do { uses <- readMutVar (tcg_used_rdrnames gbl_env)
-       ; let imports = filter explicit_import (tcg_rn_imports gbl_env)
+       ; let imports = filterOut un_warnable_import (tcg_rn_imports gbl_env)
              rdr_env = tcg_rdr_env gbl_env
 
        ; let usage :: [ImportDeclUsage]
@@ -1315,11 +1315,27 @@ warnUnusedImportDecls gbl_env
        ; whenGOptM Opt_D_dump_minimal_imports $
          printMinimalImports usage }
   where
-    explicit_import (L _ decl) = not (ideclImplicit decl)
-        -- Filter out the implicit Prelude import
-        -- which we do not want to bleat about
+    un_warnable_import (L _ decl)  -- See Note [Un-warnable import decls]
+       | ideclImplicit decl
+       = True
+       | Just (True, hides) <- ideclHiding decl
+       , not (null hides)
+       , pRELUDE_NAME == unLoc (ideclName decl)
+       = True
+       | otherwise
+       = False
 \end{code}
 
+Note [Un-warnable import decls]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+We do not warn about the implicit import of Prelude, since the user can't remove it
+
+We do not warn about
+   import Prelude hiding( x, y )
+because even if nothing else from Prelude is used, it may be essential to hide
+x,y to avoid name-shadowing warnings.  Example (Trac #9061)
+   import Prelude hiding( log )
+   f x = log where log = ()
 
 Note [The ImportMap]
 ~~~~~~~~~~~~~~~~~~~~
diff --git a/testsuite/tests/module/T9061.hs b/testsuite/tests/module/T9061.hs
new file mode 100644 (file)
index 0000000..1417dca
--- /dev/null
@@ -0,0 +1,6 @@
+{-# OPTIONS_GHC -fwarn-unused-imports #-}
+module T9061 where
+
+import Prelude hiding (log)
+
+f = log where log = ()
index 8eaa1d5..926cbb5 100644 (file)
@@ -334,3 +334,4 @@ test('T414', normal, compile_fail, [''])
 test('T414a', normal, compile, [''])
 test('T414b', normal, compile, [''])
 test('T3776', normal, compile, [''])
+test('T9061', normal, compile, [''])