Opened 7 months ago

Last modified 7 months ago

#8363 new bug

Order matters for unused import warnings when reexporting identifiers

Reported by: bergmark Owned by:
Priority: normal Milestone:
Component: Compiler Version: 7.7
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Difficulty: Unknown
Test Case: Blocked By:
Blocking: Related Tickets:

Description

Import order seem to change whether unused import warnings trigger when a module re-exports an identifier, with another module importing it and another module exporting the same identifier.

Reproduction:

module Foo ( (<$>) , g  ) where

import Control.Applicative

g :: Int
g = 1
module Main where

import Control.Applicative
import Foo

main :: IO ()
main = print =<< ((+2) <$> return g)
$ ghc -fwarn-unused-imports Main.hs
[1 of 2] Compiling Foo              ( Foo.hs, Foo.o )
[2 of 2] Compiling Main             ( Main.hs, Main.o )
Linking Main ...

If Main is not using g then this gives a warning that the import of Foo is redundant.

If we switch the order of the imports we do get the warning:

module Main where

import Foo
import Control.Applicative

main :: IO ()
main = print =<< ((+2) <$> return g)
> ghc -fwarn-unused-imports Main.hs
[1 of 2] Compiling Foo              ( Foo.hs, Foo.o )
[2 of 2] Compiling Main             ( Main.hs, Main.o )

Main.hs:4:1:
    Warning: The import of `Control.Applicative' is redundant
               except perhaps to import instances from `Control.Applicative'
             To import instances alone, use: import Control.Applicative()
Linking Main ...

I expected both versions of Main to produce the same warning.
Tested on GHC 7.7.20130824 and 7.4.2.

Change History (1)

comment:1 Changed 7 months ago by simonpj

Yes, you're right. In general it's a hard problem to find the minimal set of imports that are required. (It's a kind of set-covering problem.) GHC uses a cheap and cheerful heuristic that usually does reasonably well.

The code is very localised, in RnNames.warnUnusedImportDecls. If anyone can do better, go for it!

Simon

Note: See TracTickets for help on using tickets.