2020-04-20 00:27:28 +00:00
|
|
|
// check-pass
|
2018-11-30 19:34:24 +00:00
|
|
|
// aux-build:underscore-imports.rs
|
2018-03-10 21:18:05 +00:00
|
|
|
|
|
|
|
#![warn(unused_imports, unused_extern_crates)]
|
|
|
|
|
2018-11-30 19:34:24 +00:00
|
|
|
#[macro_use]
|
|
|
|
extern crate underscore_imports as _;
|
|
|
|
|
|
|
|
do_nothing!(); // OK
|
|
|
|
|
2018-03-10 21:18:05 +00:00
|
|
|
struct S;
|
|
|
|
|
|
|
|
mod m {
|
|
|
|
pub trait Tr1 {
|
|
|
|
fn tr1_is_in_scope(&self) {}
|
|
|
|
}
|
|
|
|
pub trait Tr2 {
|
|
|
|
fn tr2_is_in_scope(&self) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Tr1 for ::S {}
|
|
|
|
impl Tr2 for ::S {}
|
|
|
|
}
|
|
|
|
|
|
|
|
mod unused {
|
|
|
|
use m::Tr1 as _; //~ WARN unused import
|
|
|
|
use S as _; //~ WARN unused import
|
2018-08-18 23:20:25 +00:00
|
|
|
extern crate core as _; // OK
|
2018-03-10 21:18:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mod outer {
|
|
|
|
mod middle {
|
|
|
|
pub use m::Tr1 as _;
|
|
|
|
pub use m::Tr2 as _; // OK, no name conflict
|
|
|
|
struct Tr1; // OK, no name conflict
|
|
|
|
fn check() {
|
|
|
|
// Both traits are in scope
|
|
|
|
::S.tr1_is_in_scope();
|
|
|
|
::S.tr2_is_in_scope();
|
|
|
|
}
|
|
|
|
|
|
|
|
mod inner {
|
|
|
|
// `_` imports are fetched by glob imports
|
|
|
|
use super::*;
|
|
|
|
fn check() {
|
|
|
|
// Both traits are in scope
|
|
|
|
::S.tr1_is_in_scope();
|
|
|
|
::S.tr2_is_in_scope();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// `_` imports are fetched by glob imports
|
|
|
|
use self::middle::*;
|
|
|
|
fn check() {
|
|
|
|
// Both traits are in scope
|
|
|
|
::S.tr1_is_in_scope();
|
|
|
|
::S.tr2_is_in_scope();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|