Closed
Description
Spawned off of "fun note" at end of #7663.
When a unused import (either specific or glob) is followed by a glob import that shadows it (and thus causes the first to go unused), the unused import lint is incorrectly blaming/identifying the latter glob as being unused, and failing to identify the former import as being unused.
Nearly exhaustive and certainly exhausting test case (multuse.rs):
mod A {
pub fn p() { println("A::p"); }
}
mod B {
pub fn p() { println("B::p"); }
}
mod C {
pub fn q() { println("C::q"); }
}
mod D {
pub fn q() { println("D::q"); }
}
mod E {
pub fn r() { println("E::r"); }
}
mod F {
pub fn r() { println("E::r"); }
}
mod G {
pub fn s() { println("G::s"); }
pub fn t() { println("G::t"); }
}
mod H {
pub fn s() { println("H::s"); }
}
mod I {
pub fn u() { println("I::u"); }
pub fn v() { println("I::v"); }
}
mod J {
pub fn u() { println("J::u"); }
pub fn v() { println("J::v"); }
}
mod K {
pub fn w() { println("K::w"); }
}
mod L {
pub fn w() { println("L::w"); }
}
mod m {
use A::p; // <-- this `p` is unused; correctly warns
use B::p;
use C::q; // <-- this `q` is unused, but NO WARNING
use D::*; // <-- this `q` IS USED, yields false positive warning
use E::*; // <-- this `r` is overridden and unused; correctly warns
use F::r;
use G::*; // <-- this `s` is overridden, no warning since t is used, as expected for glob.
use H::*; // <-- this `s` is USED, yields false positive warning
use I::*; // <-- this `v` is overridden, no warning since u is used, as expected for glob
use J::v;
use K::*; // <-- all imports here are overriden, none used, but NO WARNING
use L::*; // <-- this `w` is USED, yields false positive warning
#[main]
fn my_main() {
p();
q();
r();
s();
t();
u();
v();
w();
}
}
Result of the run (to confirm what the comments next to the uses say):
% rustc /tmp/multuse.rs && /tmp/multuse
/tmp/multuse.rs:47:7: 47:11 warning: unused import [-W unused-imports (default)]
/tmp/multuse.rs:47 use A::p; // <-- this `p` is unused; correctly warns
^~~~
/tmp/multuse.rs:50:7: 50:12 warning: unused import [-W unused-imports (default)]
/tmp/multuse.rs:50 use D::*; // <-- this `q` IS USED, yields false positive warning
^~~~~
/tmp/multuse.rs:51:7: 51:12 warning: unused import [-W unused-imports (default)]
/tmp/multuse.rs:51 use E::*; // <-- this `r` is overridden and unused; correctly warns
^~~~~
/tmp/multuse.rs:54:7: 54:12 warning: unused import [-W unused-imports (default)]
/tmp/multuse.rs:54 use H::*; // <-- this `s` is USED, yields false positive warning
^~~~~
/tmp/multuse.rs:58:7: 58:12 warning: unused import [-W unused-imports (default)]
/tmp/multuse.rs:58 use L::*; // <-- this `w` is USED, yields false positive warning
^~~~~
warning: no debug symbols in executable (-arch x86_64)
B::p
D::q
E::r
H::s
G::t
I::u
J::v
L::w