2020-04-19 19:27:28 -05:00
|
|
|
// check-pass
|
2018-11-30 13:34:24 -06:00
|
|
|
// aux-build:underscore-imports.rs
|
2018-03-10 15:18:05 -06:00
|
|
|
|
|
|
|
#![warn(unused_imports, unused_extern_crates)]
|
|
|
|
|
2018-11-30 13:34:24 -06:00
|
|
|
#[macro_use]
|
|
|
|
extern crate underscore_imports as _;
|
|
|
|
|
|
|
|
do_nothing!(); // OK
|
|
|
|
|
2018-03-10 15:18:05 -06: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 18:20:25 -05:00
|
|
|
extern crate core as _; // OK
|
2018-03-10 15:18:05 -06: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() {}
|