diff options
Diffstat (limited to 'src/test/ui/imports')
248 files changed, 5534 insertions, 0 deletions
diff --git a/src/test/ui/imports/absolute-paths-in-nested-use-groups.rs b/src/test/ui/imports/absolute-paths-in-nested-use-groups.rs new file mode 100644 index 000000000..96b513167 --- /dev/null +++ b/src/test/ui/imports/absolute-paths-in-nested-use-groups.rs @@ -0,0 +1,11 @@ +#![allow(unused_imports)] + +mod foo {} + +use foo::{ + ::bar, //~ ERROR crate root in paths can only be used in start position + super::bar, //~ ERROR `super` in paths can only be used in start position + self::bar, //~ ERROR `self` in paths can only be used in start position +}; + +fn main() {} diff --git a/src/test/ui/imports/absolute-paths-in-nested-use-groups.stderr b/src/test/ui/imports/absolute-paths-in-nested-use-groups.stderr new file mode 100644 index 000000000..e41590ac4 --- /dev/null +++ b/src/test/ui/imports/absolute-paths-in-nested-use-groups.stderr @@ -0,0 +1,21 @@ +error[E0433]: failed to resolve: crate root in paths can only be used in start position + --> $DIR/absolute-paths-in-nested-use-groups.rs:6:5 + | +LL | ::bar, + | ^ crate root in paths can only be used in start position + +error[E0433]: failed to resolve: `super` in paths can only be used in start position + --> $DIR/absolute-paths-in-nested-use-groups.rs:7:5 + | +LL | super::bar, + | ^^^^^ `super` in paths can only be used in start position + +error[E0433]: failed to resolve: `self` in paths can only be used in start position + --> $DIR/absolute-paths-in-nested-use-groups.rs:8:5 + | +LL | self::bar, + | ^^^^ `self` in paths can only be used in start position + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0433`. diff --git a/src/test/ui/imports/auxiliary/gensymed.rs b/src/test/ui/imports/auxiliary/gensymed.rs new file mode 100644 index 000000000..bbb19f5ec --- /dev/null +++ b/src/test/ui/imports/auxiliary/gensymed.rs @@ -0,0 +1,3 @@ +// edition:2018 + +mod std {} diff --git a/src/test/ui/imports/auxiliary/glob-conflict.rs b/src/test/ui/imports/auxiliary/glob-conflict.rs new file mode 100644 index 000000000..c83db64c6 --- /dev/null +++ b/src/test/ui/imports/auxiliary/glob-conflict.rs @@ -0,0 +1,13 @@ +mod m1 { + pub fn f() {} +} +mod m2 { + pub fn f(_: u8) {} +} + +pub use m1::*; +pub use m2::*; + +pub mod glob { + pub use *; +} diff --git a/src/test/ui/imports/auxiliary/import_crate_var.rs b/src/test/ui/imports/auxiliary/import_crate_var.rs new file mode 100644 index 000000000..a273b103a --- /dev/null +++ b/src/test/ui/imports/auxiliary/import_crate_var.rs @@ -0,0 +1,7 @@ +pub fn f() {} + +#[macro_export] +macro_rules! m { () => { + use $crate; + import_crate_var::f(); +} } diff --git a/src/test/ui/imports/auxiliary/issue-36881-aux.rs b/src/test/ui/imports/auxiliary/issue-36881-aux.rs new file mode 100644 index 000000000..e373b6438 --- /dev/null +++ b/src/test/ui/imports/auxiliary/issue-36881-aux.rs @@ -0,0 +1 @@ +pub trait Foo {} diff --git a/src/test/ui/imports/auxiliary/issue-52891.rs b/src/test/ui/imports/auxiliary/issue-52891.rs new file mode 100644 index 000000000..075981183 --- /dev/null +++ b/src/test/ui/imports/auxiliary/issue-52891.rs @@ -0,0 +1,33 @@ +pub mod a { + pub mod inner { + } +} + +pub mod b { + pub mod inner { + } +} + +pub mod c {} + +pub mod d {} + +pub mod e {} + +pub mod f {} + +pub mod g {} + +pub mod h {} + +pub mod i {} + +pub mod j {} + +pub mod k {} + +pub mod l {} + +pub mod m {} + +pub mod n {} diff --git a/src/test/ui/imports/auxiliary/issue-55811.rs b/src/test/ui/imports/auxiliary/issue-55811.rs new file mode 100644 index 000000000..877e4cdb0 --- /dev/null +++ b/src/test/ui/imports/auxiliary/issue-55811.rs @@ -0,0 +1,5 @@ +mod m {} + +// These two imports should not conflict when this crate is loaded from some other crate. +use m::{}; +use m::{}; diff --git a/src/test/ui/imports/auxiliary/issue-56125.rs b/src/test/ui/imports/auxiliary/issue-56125.rs new file mode 100644 index 000000000..8e0797582 --- /dev/null +++ b/src/test/ui/imports/auxiliary/issue-56125.rs @@ -0,0 +1,11 @@ +pub mod issue_56125 {} + +pub mod last_segment { + pub mod issue_56125 {} +} + +pub mod non_last_segment { + pub mod non_last_segment { + pub mod issue_56125 {} + } +} diff --git a/src/test/ui/imports/auxiliary/issue-59764.rs b/src/test/ui/imports/auxiliary/issue-59764.rs new file mode 100644 index 000000000..a92eed968 --- /dev/null +++ b/src/test/ui/imports/auxiliary/issue-59764.rs @@ -0,0 +1,18 @@ +pub mod foo { + #[macro_export] + macro_rules! makro { + ($foo:ident) => { + fn $foo() { } + } + } + + pub fn baz() {} + + pub fn foobar() {} + + pub mod barbaz { + pub fn barfoo() {} + } +} + +pub fn foobaz() {} diff --git a/src/test/ui/imports/auxiliary/overlapping_pub_trait_source.rs b/src/test/ui/imports/auxiliary/overlapping_pub_trait_source.rs new file mode 100644 index 000000000..2a25d60ac --- /dev/null +++ b/src/test/ui/imports/auxiliary/overlapping_pub_trait_source.rs @@ -0,0 +1,13 @@ +/* This crate declares an item as both `prelude::*` and `m::Tr`. + * The compiler should always suggest `m::Tr`. */ + +pub struct S; + +pub mod prelude { + pub use crate::m::Tr as _; +} + +pub mod m { + pub trait Tr { fn method(&self); } + impl Tr for crate::S { fn method(&self) {} } +} diff --git a/src/test/ui/imports/auxiliary/two_macros.rs b/src/test/ui/imports/auxiliary/two_macros.rs new file mode 100644 index 000000000..92c211467 --- /dev/null +++ b/src/test/ui/imports/auxiliary/two_macros.rs @@ -0,0 +1,5 @@ +#[macro_export] +macro_rules! m { ($($t:tt)*) => { $($t)* } } + +#[macro_export] +macro_rules! n { ($($t:tt)*) => { $($t)* } } diff --git a/src/test/ui/imports/auxiliary/unnamed_pub_trait_source.rs b/src/test/ui/imports/auxiliary/unnamed_pub_trait_source.rs new file mode 100644 index 000000000..d73c9a795 --- /dev/null +++ b/src/test/ui/imports/auxiliary/unnamed_pub_trait_source.rs @@ -0,0 +1,13 @@ +/* This crate declares an item that is unnamed. + * Its only public path is through `prelude::*`. */ + +pub struct S; + +mod m { + pub trait Tr { fn method(&self); } + impl Tr for crate::S { fn method(&self) {} } +} + +pub mod prelude { + pub use crate::m::Tr as _; +} diff --git a/src/test/ui/imports/double-import.rs b/src/test/ui/imports/double-import.rs new file mode 100644 index 000000000..e7325368b --- /dev/null +++ b/src/test/ui/imports/double-import.rs @@ -0,0 +1,15 @@ +// This tests that conflicting imports shows both `use` lines +// when reporting the error. + +mod sub1 { + pub fn foo() {} // implementation 1 +} + +mod sub2 { + pub fn foo() {} // implementation 2 +} + +use sub1::foo; +use sub2::foo; //~ ERROR the name `foo` is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/double-import.stderr b/src/test/ui/imports/double-import.stderr new file mode 100644 index 000000000..82f5eb83e --- /dev/null +++ b/src/test/ui/imports/double-import.stderr @@ -0,0 +1,17 @@ +error[E0252]: the name `foo` is defined multiple times + --> $DIR/double-import.rs:13:5 + | +LL | use sub1::foo; + | --------- previous import of the value `foo` here +LL | use sub2::foo; + | ^^^^^^^^^ `foo` reimported here + | + = note: `foo` must be defined only once in the value namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use sub2::foo as other_foo; + | ~~~~~~~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/duplicate.rs b/src/test/ui/imports/duplicate.rs new file mode 100644 index 000000000..db6538969 --- /dev/null +++ b/src/test/ui/imports/duplicate.rs @@ -0,0 +1,51 @@ +mod a { + pub fn foo() {} +} + +mod b { + pub fn foo() {} +} + +mod c { + pub use a::foo; +} + +mod d { + use a::foo; + use a::foo; //~ ERROR the name `foo` is defined multiple times +} + +mod e { + pub use a::*; + pub use c::*; // ok +} + +mod f { + pub use a::*; + pub use b::*; +} + +mod g { + pub use a::*; + pub use f::*; +} + +fn main() { + e::foo(); + f::foo(); //~ ERROR `foo` is ambiguous + g::foo(); +} + +mod ambiguous_module_errors { + pub mod m1 { pub use super::m1 as foo; pub fn bar() {} } + pub mod m2 { pub use super::m2 as foo; } + + use self::m1::*; + use self::m2::*; + + use self::foo::bar; //~ ERROR `foo` is ambiguous + + fn f() { + foo::bar(); //~ ERROR `foo` is ambiguous + } +} diff --git a/src/test/ui/imports/duplicate.stderr b/src/test/ui/imports/duplicate.stderr new file mode 100644 index 000000000..997a2741b --- /dev/null +++ b/src/test/ui/imports/duplicate.stderr @@ -0,0 +1,74 @@ +error[E0252]: the name `foo` is defined multiple times + --> $DIR/duplicate.rs:15:9 + | +LL | use a::foo; + | ------ previous import of the value `foo` here +LL | use a::foo; + | ^^^^^^ `foo` reimported here + | + = note: `foo` must be defined only once in the value namespace of this module + +error[E0659]: `foo` is ambiguous + --> $DIR/duplicate.rs:46:15 + | +LL | use self::foo::bar; + | ^^^ ambiguous name + | + = note: ambiguous because of multiple glob imports of a name in the same module +note: `foo` could refer to the module imported here + --> $DIR/duplicate.rs:43:9 + | +LL | use self::m1::*; + | ^^^^^^^^^^^ + = help: consider adding an explicit import of `foo` to disambiguate +note: `foo` could also refer to the module imported here + --> $DIR/duplicate.rs:44:9 + | +LL | use self::m2::*; + | ^^^^^^^^^^^ + = help: consider adding an explicit import of `foo` to disambiguate + +error[E0659]: `foo` is ambiguous + --> $DIR/duplicate.rs:35:8 + | +LL | f::foo(); + | ^^^ ambiguous name + | + = note: ambiguous because of multiple glob imports of a name in the same module +note: `foo` could refer to the function imported here + --> $DIR/duplicate.rs:24:13 + | +LL | pub use a::*; + | ^^^^ + = help: consider adding an explicit import of `foo` to disambiguate +note: `foo` could also refer to the function imported here + --> $DIR/duplicate.rs:25:13 + | +LL | pub use b::*; + | ^^^^ + = help: consider adding an explicit import of `foo` to disambiguate + +error[E0659]: `foo` is ambiguous + --> $DIR/duplicate.rs:49:9 + | +LL | foo::bar(); + | ^^^ ambiguous name + | + = note: ambiguous because of multiple glob imports of a name in the same module +note: `foo` could refer to the module imported here + --> $DIR/duplicate.rs:43:9 + | +LL | use self::m1::*; + | ^^^^^^^^^^^ + = help: consider adding an explicit import of `foo` to disambiguate +note: `foo` could also refer to the module imported here + --> $DIR/duplicate.rs:44:9 + | +LL | use self::m2::*; + | ^^^^^^^^^^^ + = help: consider adding an explicit import of `foo` to disambiguate + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0252, E0659. +For more information about an error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/export-glob-imports-target.rs b/src/test/ui/imports/export-glob-imports-target.rs new file mode 100644 index 000000000..4df807ea4 --- /dev/null +++ b/src/test/ui/imports/export-glob-imports-target.rs @@ -0,0 +1,22 @@ +// run-pass + +#![allow(non_upper_case_globals)] +#![allow(dead_code)] +// Test that a glob-export functions as an import +// when referenced within its own local scope. + +// Modified to not use export since it's going away. --pcw + +// pretty-expanded FIXME #23616 + +mod foo { + use foo::bar::*; + pub mod bar { + pub static a : isize = 10; + } + pub fn zum() { + let _b = a; + } +} + +pub fn main() { } diff --git a/src/test/ui/imports/export-multi.rs b/src/test/ui/imports/export-multi.rs new file mode 100644 index 000000000..02bdbe8af --- /dev/null +++ b/src/test/ui/imports/export-multi.rs @@ -0,0 +1,12 @@ +// run-pass +// pretty-expanded FIXME #23616 + +use m::f; +use m::g; + +mod m { + pub fn f() { } + pub fn g() { } +} + +pub fn main() { f(); g(); m::f(); m::g(); } diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.rs b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.rs new file mode 100644 index 000000000..1c0d3b4b9 --- /dev/null +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.rs @@ -0,0 +1,6 @@ +extern crate self; //~ ERROR `extern crate self;` requires renaming + +#[macro_use] //~ ERROR `#[macro_use]` is not supported on `extern crate self` +extern crate self as foo; + +fn main() {} diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.stderr b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.stderr new file mode 100644 index 000000000..127765727 --- /dev/null +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.stderr @@ -0,0 +1,19 @@ +error: `extern crate self;` requires renaming + --> $DIR/extern-crate-self-fail.rs:1:1 + | +LL | extern crate self; + | ^^^^^^^^^^^^^^^^^^ + | +help: rename the `self` crate to be able to import it + | +LL | extern crate self as name; + | ~~~~~~~~~~~~~~~~~~~~~~~~~~ + +error: `#[macro_use]` is not supported on `extern crate self` + --> $DIR/extern-crate-self-fail.rs:3:1 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-alias.rs b/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-alias.rs new file mode 100644 index 000000000..796835228 --- /dev/null +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-alias.rs @@ -0,0 +1,16 @@ +// run-pass + +// Test that a macro can correctly expand the alias +// in an `extern crate self as ALIAS` item. + +fn the_answer() -> usize { 42 } + +macro_rules! alias_self { + ($alias:ident) => { extern crate self as $alias; } +} + +alias_self!(the_alias); + +fn main() { + assert_eq!(the_alias::the_answer(), 42); +} diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-item.rs b/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-item.rs new file mode 100644 index 000000000..244293be7 --- /dev/null +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-item.rs @@ -0,0 +1,12 @@ +// build-pass (FIXME(62277): could be check-pass?) + +// Test that `extern crate self;` is accepted +// syntactically as an item for use in a macro. + +macro_rules! accept_item { ($x:item) => {} } + +accept_item! { + extern crate self; +} + +fn main() {} diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-self.rs b/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-self.rs new file mode 100644 index 000000000..009a92e87 --- /dev/null +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-macro-self.rs @@ -0,0 +1,16 @@ +// run-pass + +// Test that a macro can correctly expand `self` in +// an `extern crate self as ALIAS` item. + +fn the_answer() -> usize { 42 } + +macro_rules! extern_something { + ($alias:ident) => { extern crate $alias as the_alias; } +} + +extern_something!(self); + +fn main() { + assert_eq!(the_alias::the_answer(), 42); +} diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-pass.rs b/src/test/ui/imports/extern-crate-self/extern-crate-self-pass.rs new file mode 100644 index 000000000..9cebb622e --- /dev/null +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-pass.rs @@ -0,0 +1,13 @@ +// build-pass (FIXME(62277): could be check-pass?) + +extern crate self as foo; + +struct S; + +mod m { + fn check() { + foo::S; // OK + } +} + +fn main() {} diff --git a/src/test/ui/imports/extern-crate-used.rs b/src/test/ui/imports/extern-crate-used.rs new file mode 100644 index 000000000..8198c1816 --- /dev/null +++ b/src/test/ui/imports/extern-crate-used.rs @@ -0,0 +1,32 @@ +// Extern crate items are marked as used if they are used +// through extern prelude entries introduced by them. + +// edition:2018 + +#![deny(unused_extern_crates)] + +// Shouldn't suggest changing to `use`, as new name +// would no longer be added to the prelude which could cause +// compilation errors for imports that use the new name in +// other modules. See #57672. +extern crate core as iso1; +extern crate core as iso2; +extern crate core as iso3; +extern crate core as iso4; + +// Doesn't introduce its extern prelude entry, so it's still considered unused. +extern crate core; //~ ERROR unused extern crate + +mod m { + use iso1::any as are_you_okay1; + use ::iso2::any as are_you_okay2; + type AreYouOkay1 = dyn iso3::any::Any; + type AreYouOkay2 = dyn (::iso4::any::Any); + + use core::any as are_you_okay3; + use ::core::any as are_you_okay4; + type AreYouOkay3 = dyn core::any::Any; + type AreYouOkay4 = dyn (::core::any::Any); +} + +fn main() {} diff --git a/src/test/ui/imports/extern-crate-used.stderr b/src/test/ui/imports/extern-crate-used.stderr new file mode 100644 index 000000000..1b9a2e472 --- /dev/null +++ b/src/test/ui/imports/extern-crate-used.stderr @@ -0,0 +1,14 @@ +error: unused extern crate + --> $DIR/extern-crate-used.rs:18:1 + | +LL | extern crate core; + | ^^^^^^^^^^^^^^^^^^ help: remove it + | +note: the lint level is defined here + --> $DIR/extern-crate-used.rs:6:9 + | +LL | #![deny(unused_extern_crates)] + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/imports/extern-prelude-extern-crate-absolute-expanded.rs b/src/test/ui/imports/extern-prelude-extern-crate-absolute-expanded.rs new file mode 100644 index 000000000..30d87f90b --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-absolute-expanded.rs @@ -0,0 +1,16 @@ +// build-pass (FIXME(62277): could be check-pass?) +// edition:2018 + +macro_rules! define_iso { () => { + extern crate std as iso; +}} + +::iso::thread_local! { + static S: u8 = 0; +} + +define_iso!(); + +fn main() { + let s = S; +} diff --git a/src/test/ui/imports/extern-prelude-extern-crate-cfg.rs b/src/test/ui/imports/extern-prelude-extern-crate-cfg.rs new file mode 100644 index 000000000..cfae08fcc --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-cfg.rs @@ -0,0 +1,16 @@ +// build-pass (FIXME(62277): could be check-pass?) +// compile-flags:--cfg my_feature + +#![no_std] + +#[cfg(my_feature)] +extern crate std; + +mod m { + #[cfg(my_feature)] + fn conditional() { + std::vec::Vec::<u8>::new(); // OK + } +} + +fn main() {} diff --git a/src/test/ui/imports/extern-prelude-extern-crate-fail.rs b/src/test/ui/imports/extern-prelude-extern-crate-fail.rs new file mode 100644 index 000000000..feb1ab09d --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-fail.rs @@ -0,0 +1,22 @@ +// aux-build:two_macros.rs +// compile-flags:--extern non_existent + +mod n { + extern crate two_macros; +} + +mod m { + fn check() { + two_macros::m!(); //~ ERROR failed to resolve: use of undeclared crate or module `two_macros` + } +} + +macro_rules! define_std_as_non_existent { + () => { + extern crate std as non_existent; + //~^ ERROR `extern crate` items cannot shadow names passed with `--extern` + } +} +define_std_as_non_existent!(); + +fn main() {} diff --git a/src/test/ui/imports/extern-prelude-extern-crate-fail.stderr b/src/test/ui/imports/extern-prelude-extern-crate-fail.stderr new file mode 100644 index 000000000..f7e37449e --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-fail.stderr @@ -0,0 +1,20 @@ +error: macro-expanded `extern crate` items cannot shadow names passed with `--extern` + --> $DIR/extern-prelude-extern-crate-fail.rs:16:9 + | +LL | extern crate std as non_existent; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | define_std_as_non_existent!(); + | ----------------------------- in this macro invocation + | + = note: this error originates in the macro `define_std_as_non_existent` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0433]: failed to resolve: use of undeclared crate or module `two_macros` + --> $DIR/extern-prelude-extern-crate-fail.rs:10:9 + | +LL | two_macros::m!(); + | ^^^^^^^^^^ use of undeclared crate or module `two_macros` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0433`. diff --git a/src/test/ui/imports/extern-prelude-extern-crate-pass.rs b/src/test/ui/imports/extern-prelude-extern-crate-pass.rs new file mode 100644 index 000000000..c87d58f63 --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-pass.rs @@ -0,0 +1,12 @@ +// build-pass (FIXME(62277): could be check-pass?) +// aux-build:two_macros.rs + +extern crate two_macros; + +mod m { + fn check() { + two_macros::m!(); // OK + } +} + +fn main() {} diff --git a/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs new file mode 100644 index 000000000..6ff3ab736 --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs @@ -0,0 +1,26 @@ +// aux-build:two_macros.rs + +macro_rules! define_vec { + () => { + extern crate std as Vec; + } +} + +define_vec!(); + +mod m { + fn check() { + Vec::panic!(); //~ ERROR `Vec` is ambiguous + } +} + +macro_rules! define_other_core { + () => { + extern crate std as core; + //~^ ERROR macro-expanded `extern crate` items cannot shadow names passed with `--extern` + } +} + +define_other_core!(); + +fn main() {} diff --git a/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr new file mode 100644 index 000000000..c31c88403 --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr @@ -0,0 +1,36 @@ +error: macro-expanded `extern crate` items cannot shadow names passed with `--extern` + --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:19:9 + | +LL | extern crate std as core; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | define_other_core!(); + | -------------------- in this macro invocation + | + = note: this error originates in the macro `define_other_core` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0659]: `Vec` is ambiguous + --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:13:9 + | +LL | Vec::panic!(); + | ^^^ ambiguous name + | + = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution +note: `Vec` could refer to the crate imported here + --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:5:9 + | +LL | extern crate std as Vec; + | ^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | define_vec!(); + | ------------- in this macro invocation +note: `Vec` could also refer to the struct defined here + --> $SRC_DIR/std/src/prelude/mod.rs:LL:COL + | +LL | pub use super::v1::*; + | ^^^^^^^^^^^^ + = note: this error originates in the macro `define_vec` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/extern-prelude-extern-crate-shadowing.rs b/src/test/ui/imports/extern-prelude-extern-crate-shadowing.rs new file mode 100644 index 000000000..9e69a27d7 --- /dev/null +++ b/src/test/ui/imports/extern-prelude-extern-crate-shadowing.rs @@ -0,0 +1,12 @@ +// build-pass (FIXME(62277): could be check-pass?) +// aux-build:two_macros.rs + +extern crate two_macros as core; + +mod m { + fn check() { + core::m!(); // OK + } +} + +fn main() {} diff --git a/src/test/ui/imports/gensymed.rs b/src/test/ui/imports/gensymed.rs new file mode 100644 index 000000000..7b53f0c53 --- /dev/null +++ b/src/test/ui/imports/gensymed.rs @@ -0,0 +1,9 @@ +// check-pass +// edition:2018 +// aux-build:gensymed.rs + +extern crate gensymed; + +use gensymed::*; + +fn main() {} diff --git a/src/test/ui/imports/glob-conflict-cross-crate.rs b/src/test/ui/imports/glob-conflict-cross-crate.rs new file mode 100644 index 000000000..d84c243f2 --- /dev/null +++ b/src/test/ui/imports/glob-conflict-cross-crate.rs @@ -0,0 +1,8 @@ +// aux-build:glob-conflict.rs + +extern crate glob_conflict; + +fn main() { + glob_conflict::f(); //~ ERROR cannot find function `f` in crate `glob_conflict` + glob_conflict::glob::f(); //~ ERROR cannot find function `f` in module `glob_conflict::glob` +} diff --git a/src/test/ui/imports/glob-conflict-cross-crate.stderr b/src/test/ui/imports/glob-conflict-cross-crate.stderr new file mode 100644 index 000000000..0e3b4222f --- /dev/null +++ b/src/test/ui/imports/glob-conflict-cross-crate.stderr @@ -0,0 +1,15 @@ +error[E0425]: cannot find function `f` in crate `glob_conflict` + --> $DIR/glob-conflict-cross-crate.rs:6:20 + | +LL | glob_conflict::f(); + | ^ not found in `glob_conflict` + +error[E0425]: cannot find function `f` in module `glob_conflict::glob` + --> $DIR/glob-conflict-cross-crate.rs:7:26 + | +LL | glob_conflict::glob::f(); + | ^ not found in `glob_conflict::glob` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/imports/glob-cycles.rs b/src/test/ui/imports/glob-cycles.rs new file mode 100644 index 000000000..f354cc885 --- /dev/null +++ b/src/test/ui/imports/glob-cycles.rs @@ -0,0 +1,18 @@ +// check-pass + +mod foo { + pub use bar::*; + pub use main as f; +} + +mod bar { + pub use foo::*; +} + +pub use foo::*; +pub use baz::*; +mod baz { + pub use super::*; +} + +pub fn main() {} diff --git a/src/test/ui/imports/glob-resolve1.rs b/src/test/ui/imports/glob-resolve1.rs new file mode 100644 index 000000000..904b77117 --- /dev/null +++ b/src/test/ui/imports/glob-resolve1.rs @@ -0,0 +1,39 @@ +// Make sure that globs only bring in public things. + +use bar::*; + +mod bar { + use self::fpriv as import; + fn fpriv() {} + extern "C" { + fn epriv(); + } + enum A { + A1, + } + pub enum B { + B1, + } + + struct C; + + type D = isize; +} + +fn foo<T>() {} + +fn main() { + fpriv(); //~ ERROR cannot find function `fpriv` in this scope + epriv(); //~ ERROR cannot find function `epriv` in this scope + B; //~ ERROR expected value, found enum `B` + C; //~ ERROR cannot find value `C` in this scope + import(); //~ ERROR: cannot find function `import` in this scope + + foo::<A>(); //~ ERROR: cannot find type `A` in this scope + foo::<C>(); //~ ERROR: cannot find type `C` in this scope + foo::<D>(); //~ ERROR: cannot find type `D` in this scope +} + +mod other { + pub fn import() {} +} diff --git a/src/test/ui/imports/glob-resolve1.stderr b/src/test/ui/imports/glob-resolve1.stderr new file mode 100644 index 000000000..3b66a5e31 --- /dev/null +++ b/src/test/ui/imports/glob-resolve1.stderr @@ -0,0 +1,114 @@ +error[E0425]: cannot find function `fpriv` in this scope + --> $DIR/glob-resolve1.rs:26:5 + | +LL | fpriv(); + | ^^^^^ not found in this scope + | +note: function `bar::fpriv` exists but is inaccessible + --> $DIR/glob-resolve1.rs:7:5 + | +LL | fn fpriv() {} + | ^^^^^^^^^^ not accessible + +error[E0425]: cannot find function `epriv` in this scope + --> $DIR/glob-resolve1.rs:27:5 + | +LL | epriv(); + | ^^^^^ not found in this scope + | +note: function `bar::epriv` exists but is inaccessible + --> $DIR/glob-resolve1.rs:9:9 + | +LL | fn epriv(); + | ^^^^^^^^^^^ not accessible + +error[E0423]: expected value, found enum `B` + --> $DIR/glob-resolve1.rs:28:5 + | +LL | B; + | ^ + | +note: the enum is defined here + --> $DIR/glob-resolve1.rs:14:5 + | +LL | / pub enum B { +LL | | B1, +LL | | } + | |_____^ +help: you might have meant to use the following enum variant + | +LL | B::B1; + | ~~~~~ + +error[E0425]: cannot find value `C` in this scope + --> $DIR/glob-resolve1.rs:29:5 + | +LL | C; + | ^ not found in this scope + | +note: unit struct `bar::C` exists but is inaccessible + --> $DIR/glob-resolve1.rs:18:5 + | +LL | struct C; + | ^^^^^^^^^ not accessible + +error[E0425]: cannot find function `import` in this scope + --> $DIR/glob-resolve1.rs:30:5 + | +LL | import(); + | ^^^^^^ not found in this scope + | +help: consider importing this function + | +LL | use other::import; + | + +error[E0412]: cannot find type `A` in this scope + --> $DIR/glob-resolve1.rs:32:11 + | +LL | pub enum B { + | ---------- similarly named enum `B` defined here +... +LL | foo::<A>(); + | ^ help: an enum with a similar name exists: `B` + | +note: enum `bar::A` exists but is inaccessible + --> $DIR/glob-resolve1.rs:11:5 + | +LL | enum A { + | ^^^^^^ not accessible + +error[E0412]: cannot find type `C` in this scope + --> $DIR/glob-resolve1.rs:33:11 + | +LL | pub enum B { + | ---------- similarly named enum `B` defined here +... +LL | foo::<C>(); + | ^ help: an enum with a similar name exists: `B` + | +note: struct `bar::C` exists but is inaccessible + --> $DIR/glob-resolve1.rs:18:5 + | +LL | struct C; + | ^^^^^^^^^ not accessible + +error[E0412]: cannot find type `D` in this scope + --> $DIR/glob-resolve1.rs:34:11 + | +LL | pub enum B { + | ---------- similarly named enum `B` defined here +... +LL | foo::<D>(); + | ^ help: an enum with a similar name exists: `B` + | +note: type alias `bar::D` exists but is inaccessible + --> $DIR/glob-resolve1.rs:20:5 + | +LL | type D = isize; + | ^^^^^^^^^^^^^^^ not accessible + +error: aborting due to 8 previous errors + +Some errors have detailed explanations: E0412, E0423, E0425. +For more information about an error, try `rustc --explain E0412`. diff --git a/src/test/ui/imports/glob-shadowing.rs b/src/test/ui/imports/glob-shadowing.rs new file mode 100644 index 000000000..3a33b592b --- /dev/null +++ b/src/test/ui/imports/glob-shadowing.rs @@ -0,0 +1,34 @@ +#![feature(decl_macro)] + +mod m { + pub macro env($e: expr) { $e } + pub macro fenv() { 0 } +} + +mod glob_in_normal_module { + use m::*; + fn check() { + let x = env!("PATH"); //~ ERROR `env` is ambiguous + } +} + +mod glob_in_block_module { + fn block() { + use m::*; + fn check() { + let x = env!("PATH"); //~ ERROR `env` is ambiguous + } + } +} + +mod glob_shadows_item { + pub macro fenv($e: expr) { $e } + fn block() { + use m::*; + fn check() { + let x = fenv!(); //~ ERROR `fenv` is ambiguous + } + } +} + +fn main() {} diff --git a/src/test/ui/imports/glob-shadowing.stderr b/src/test/ui/imports/glob-shadowing.stderr new file mode 100644 index 000000000..aff2eff68 --- /dev/null +++ b/src/test/ui/imports/glob-shadowing.stderr @@ -0,0 +1,54 @@ +error[E0659]: `env` is ambiguous + --> $DIR/glob-shadowing.rs:11:17 + | +LL | let x = env!("PATH"); + | ^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution + = note: `env` could refer to a macro from prelude +note: `env` could also refer to the macro imported here + --> $DIR/glob-shadowing.rs:9:9 + | +LL | use m::*; + | ^^^^ + = help: consider adding an explicit import of `env` to disambiguate + = help: or use `self::env` to refer to this macro unambiguously + +error[E0659]: `env` is ambiguous + --> $DIR/glob-shadowing.rs:19:21 + | +LL | let x = env!("PATH"); + | ^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution + = note: `env` could refer to a macro from prelude +note: `env` could also refer to the macro imported here + --> $DIR/glob-shadowing.rs:17:13 + | +LL | use m::*; + | ^^^^ + = help: consider adding an explicit import of `env` to disambiguate + +error[E0659]: `fenv` is ambiguous + --> $DIR/glob-shadowing.rs:29:21 + | +LL | let x = fenv!(); + | ^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution +note: `fenv` could refer to the macro imported here + --> $DIR/glob-shadowing.rs:27:13 + | +LL | use m::*; + | ^^^^ + = help: consider adding an explicit import of `fenv` to disambiguate +note: `fenv` could also refer to the macro defined here + --> $DIR/glob-shadowing.rs:25:5 + | +LL | pub macro fenv($e: expr) { $e } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: use `self::fenv` to refer to this macro unambiguously + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/glob-use-std.rs b/src/test/ui/imports/glob-use-std.rs new file mode 100644 index 000000000..ef06cc570 --- /dev/null +++ b/src/test/ui/imports/glob-use-std.rs @@ -0,0 +1,11 @@ +// Issue #7580 + +// run-fail +// error-pattern:panic works +// ignore-emscripten no processes + +use std::*; + +fn main() { + panic!("panic works") +} diff --git a/src/test/ui/imports/import-crate-var.rs b/src/test/ui/imports/import-crate-var.rs new file mode 100644 index 000000000..aac5a15d3 --- /dev/null +++ b/src/test/ui/imports/import-crate-var.rs @@ -0,0 +1,8 @@ +// aux-build:import_crate_var.rs + +#[macro_use] extern crate import_crate_var; + +fn main() { + m!(); + //~^ ERROR `$crate` may not be imported +} diff --git a/src/test/ui/imports/import-crate-var.stderr b/src/test/ui/imports/import-crate-var.stderr new file mode 100644 index 000000000..f1f1dfbdb --- /dev/null +++ b/src/test/ui/imports/import-crate-var.stderr @@ -0,0 +1,10 @@ +error: `$crate` may not be imported + --> $DIR/import-crate-var.rs:6:5 + | +LL | m!(); + | ^^^^ + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to previous error + diff --git a/src/test/ui/imports/import-crate-with-invalid-spans/auxiliary/crate_with_invalid_spans.rs b/src/test/ui/imports/import-crate-with-invalid-spans/auxiliary/crate_with_invalid_spans.rs new file mode 100644 index 000000000..b76c1680b --- /dev/null +++ b/src/test/ui/imports/import-crate-with-invalid-spans/auxiliary/crate_with_invalid_spans.rs @@ -0,0 +1,20 @@ +#![crate_type = "rlib"] +// no-prefer-dynamic + +// compile-flags: -g + +#[macro_use] +mod crate_with_invalid_spans_macros; + +pub fn exported_generic<T>(x: T, y: u32) -> (T, u32) { + // Using the add1 macro will produce an invalid span, because the `y` passed + // to the macro will have a span from this file, but the rest of the code + // generated from the macro will have spans from the macro-defining file. + // The AST node for the (1 + y) expression generated by the macro will then + // take it's `lo` span bound from the `1` literal in the macro-defining file + // and it's `hi` bound from `y` in this file, which should be lower than the + // `lo` and even lower than the lower bound of the SourceFile it is supposedly + // contained in because the SourceFile for this file was allocated earlier than + // the SourceFile of the macro-defining file. + return (x, add1!(y)); +} diff --git a/src/test/ui/imports/import-crate-with-invalid-spans/auxiliary/crate_with_invalid_spans_macros.rs b/src/test/ui/imports/import-crate-with-invalid-spans/auxiliary/crate_with_invalid_spans_macros.rs new file mode 100644 index 000000000..63611c242 --- /dev/null +++ b/src/test/ui/imports/import-crate-with-invalid-spans/auxiliary/crate_with_invalid_spans_macros.rs @@ -0,0 +1,7 @@ +macro_rules! add1 { + ($e:expr) => ({ + let a = 1 + $e; + let b = $e + 1; + a + b - 1 + }) +} diff --git a/src/test/ui/imports/import-crate-with-invalid-spans/main.rs b/src/test/ui/imports/import-crate-with-invalid-spans/main.rs new file mode 100644 index 000000000..64a4deca8 --- /dev/null +++ b/src/test/ui/imports/import-crate-with-invalid-spans/main.rs @@ -0,0 +1,13 @@ +// run-pass +// aux-build:crate_with_invalid_spans.rs + +// pretty-expanded FIXME #23616 + +extern crate crate_with_invalid_spans; + +fn main() { + // The AST of `exported_generic` stored in crate_with_invalid_spans's + // metadata should contain an invalid span where span.lo() > span.hi(). + // Let's make sure the compiler doesn't crash when encountering this. + let _ = crate_with_invalid_spans::exported_generic(32u32, 7u32); +} diff --git a/src/test/ui/imports/import-from-missing.rs b/src/test/ui/imports/import-from-missing.rs new file mode 100644 index 000000000..8eae70020 --- /dev/null +++ b/src/test/ui/imports/import-from-missing.rs @@ -0,0 +1,12 @@ +use spam::{ham, eggs}; //~ ERROR unresolved import `spam::eggs` [E0432] + //~^ no `eggs` in `spam` + +mod spam { + pub fn ham() { } +} + +fn main() { + ham(); + // Expect eggs to pass because the compiler inserts a fake name for it + eggs(); +} diff --git a/src/test/ui/imports/import-from-missing.stderr b/src/test/ui/imports/import-from-missing.stderr new file mode 100644 index 000000000..4254bfb5e --- /dev/null +++ b/src/test/ui/imports/import-from-missing.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `spam::eggs` + --> $DIR/import-from-missing.rs:1:17 + | +LL | use spam::{ham, eggs}; + | ^^^^ no `eggs` in `spam` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/import-from.rs b/src/test/ui/imports/import-from.rs new file mode 100644 index 000000000..2817977b3 --- /dev/null +++ b/src/test/ui/imports/import-from.rs @@ -0,0 +1,11 @@ +// run-pass +// pretty-expanded FIXME #23616 + +use spam::{ham, eggs}; + +mod spam { + pub fn ham() { } + pub fn eggs() { } +} + +pub fn main() { ham(); eggs(); } diff --git a/src/test/ui/imports/import-glob-0-rpass.rs b/src/test/ui/imports/import-glob-0-rpass.rs new file mode 100644 index 000000000..9c6a87279 --- /dev/null +++ b/src/test/ui/imports/import-glob-0-rpass.rs @@ -0,0 +1,29 @@ +// run-pass +#![allow(dead_code)] +use module_of_many_things::*; +use dug::too::greedily::and::too::deep::*; + +mod module_of_many_things { + pub fn f1() { println!("f1"); } + pub fn f2() { println!("f2"); } + fn f3() { println!("f3"); } + pub fn f4() { println!("f4"); } +} + +mod dug { + pub mod too { + pub mod greedily { + pub mod and { + pub mod too { + pub mod deep { + pub fn nameless_fear() { println!("Boo!"); } + pub fn also_redstone() { println!("Whatever."); } + } + } + } + } + } +} + + +pub fn main() { f1(); f2(); f4(); nameless_fear(); also_redstone(); } diff --git a/src/test/ui/imports/import-glob-0.rs b/src/test/ui/imports/import-glob-0.rs new file mode 100644 index 000000000..37a0d1545 --- /dev/null +++ b/src/test/ui/imports/import-glob-0.rs @@ -0,0 +1,16 @@ +use module_of_many_things::*; + +mod module_of_many_things { + pub fn f1() { println!("f1"); } + pub fn f2() { println!("f2"); } + fn f3() { println!("f3"); } + pub fn f4() { println!("f4"); } +} + + +fn main() { + f1(); + f2(); + f999(); //~ ERROR cannot find function `f999` in this scope + f4(); +} diff --git a/src/test/ui/imports/import-glob-0.stderr b/src/test/ui/imports/import-glob-0.stderr new file mode 100644 index 000000000..820ff1bb5 --- /dev/null +++ b/src/test/ui/imports/import-glob-0.stderr @@ -0,0 +1,9 @@ +error[E0425]: cannot find function `f999` in this scope + --> $DIR/import-glob-0.rs:14:5 + | +LL | f999(); + | ^^^^ not found in this scope + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/imports/import-glob-1.rs b/src/test/ui/imports/import-glob-1.rs new file mode 100644 index 000000000..fcc0b63f1 --- /dev/null +++ b/src/test/ui/imports/import-glob-1.rs @@ -0,0 +1,27 @@ +// run-pass +#![allow(dead_code)] +#![allow(unused_imports)] +// This should resolve fine. Prior to fix, the last import +// was being tried too early, and marked as unrsolved before +// the glob import had a chance to be resolved. + +mod bar { + pub use self::middle::*; + + mod middle { + pub use self::baz::Baz; + + mod baz { + pub enum Baz { + Baz1, + Baz2 + } + } + } +} + +mod foo { + use bar::Baz::{Baz1, Baz2}; +} + +fn main() {} diff --git a/src/test/ui/imports/import-glob-circular.rs b/src/test/ui/imports/import-glob-circular.rs new file mode 100644 index 000000000..e47fa870c --- /dev/null +++ b/src/test/ui/imports/import-glob-circular.rs @@ -0,0 +1,19 @@ +mod circ1 { + pub use circ2::f2; + pub fn f1() { println!("f1"); } + pub fn common() -> usize { return 0; } +} + +mod circ2 { + pub use circ1::f1; + pub fn f2() { println!("f2"); } + pub fn common() -> usize { return 1; } +} + +mod test { + use circ1::*; + + fn test() { f1066(); } //~ ERROR cannot find function `f1066` in this scope +} + +fn main() {} diff --git a/src/test/ui/imports/import-glob-circular.stderr b/src/test/ui/imports/import-glob-circular.stderr new file mode 100644 index 000000000..86bbea579 --- /dev/null +++ b/src/test/ui/imports/import-glob-circular.stderr @@ -0,0 +1,9 @@ +error[E0425]: cannot find function `f1066` in this scope + --> $DIR/import-glob-circular.rs:16:17 + | +LL | fn test() { f1066(); } + | ^^^^^ not found in this scope + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/imports/import-glob-crate.rs b/src/test/ui/imports/import-glob-crate.rs new file mode 100644 index 000000000..501392b78 --- /dev/null +++ b/src/test/ui/imports/import-glob-crate.rs @@ -0,0 +1,19 @@ +// run-pass +use std::mem::*; + +pub fn main() { + assert_eq!(size_of::<u8>(), 1); + let (mut x, mut y) = (1, 2); + swap(&mut x, &mut y); + assert_eq!(x, 2); + assert_eq!(y, 1); +} + +#[allow(unused)] +fn f() { + mod foo { pub use *; } + mod bar { pub use ::*; } + + foo::main(); + bar::main(); +} diff --git a/src/test/ui/imports/import-in-block.rs b/src/test/ui/imports/import-in-block.rs new file mode 100644 index 000000000..19703904e --- /dev/null +++ b/src/test/ui/imports/import-in-block.rs @@ -0,0 +1,13 @@ +// run-pass +// pretty-expanded FIXME #23616 + +pub fn main() { + use std::mem::replace; + let mut x = 5; + let _ = replace(&mut x, 6); + { + use std::mem::*; + let mut y = 6; + swap(&mut x, &mut y); + } +} diff --git a/src/test/ui/imports/import-loop-2.rs b/src/test/ui/imports/import-loop-2.rs new file mode 100644 index 000000000..14a85dd08 --- /dev/null +++ b/src/test/ui/imports/import-loop-2.rs @@ -0,0 +1,13 @@ +// error-pattern:import + +mod a { + pub use b::x; +} + +mod b { + pub use a::x; + + fn main() { let y = x; } +} + +fn main() {} diff --git a/src/test/ui/imports/import-loop-2.stderr b/src/test/ui/imports/import-loop-2.stderr new file mode 100644 index 000000000..1abfcde03 --- /dev/null +++ b/src/test/ui/imports/import-loop-2.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `a::x` + --> $DIR/import-loop-2.rs:8:13 + | +LL | pub use a::x; + | ^^^^ no `x` in `a` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/import-loop.rs b/src/test/ui/imports/import-loop.rs new file mode 100644 index 000000000..b48783401 --- /dev/null +++ b/src/test/ui/imports/import-loop.rs @@ -0,0 +1,9 @@ +// error-pattern:import + +use y::x; + +mod y { + pub use y::x; +} + +fn main() { } diff --git a/src/test/ui/imports/import-loop.stderr b/src/test/ui/imports/import-loop.stderr new file mode 100644 index 000000000..b87bfb1be --- /dev/null +++ b/src/test/ui/imports/import-loop.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `y::x` + --> $DIR/import-loop.rs:6:13 + | +LL | pub use y::x; + | ^^^^ no `x` in `y` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/import-prefix-macro-1.rs b/src/test/ui/imports/import-prefix-macro-1.rs new file mode 100644 index 000000000..91cfd3768 --- /dev/null +++ b/src/test/ui/imports/import-prefix-macro-1.rs @@ -0,0 +1,16 @@ +mod a { + pub mod b { + pub mod c { + pub struct S; + pub struct Z; + } + } +} + +macro_rules! import { + ($p: path) => (use $p {S, Z}); //~ERROR expected one of `::`, `;`, or `as`, found `{` +} + +import! { a::b::c } + +fn main() {} diff --git a/src/test/ui/imports/import-prefix-macro-1.stderr b/src/test/ui/imports/import-prefix-macro-1.stderr new file mode 100644 index 000000000..8868ee3ae --- /dev/null +++ b/src/test/ui/imports/import-prefix-macro-1.stderr @@ -0,0 +1,13 @@ +error: expected one of `::`, `;`, or `as`, found `{` + --> $DIR/import-prefix-macro-1.rs:11:27 + | +LL | ($p: path) => (use $p {S, Z}); + | ^^^^^^ expected one of `::`, `;`, or `as` +... +LL | import! { a::b::c } + | ------------------- in this macro invocation + | + = note: this error originates in the macro `import` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to previous error + diff --git a/src/test/ui/imports/import-prefix-macro-2.rs b/src/test/ui/imports/import-prefix-macro-2.rs new file mode 100644 index 000000000..952d161e8 --- /dev/null +++ b/src/test/ui/imports/import-prefix-macro-2.rs @@ -0,0 +1,16 @@ +mod a { + pub mod b { + pub mod c { + pub struct S; + pub struct Z; + } + } +} + +macro_rules! import { + ($p: path) => (use ::$p {S, Z}); //~ERROR expected identifier, found `a::b::c` +} + +import! { a::b::c } + +fn main() {} diff --git a/src/test/ui/imports/import-prefix-macro-2.stderr b/src/test/ui/imports/import-prefix-macro-2.stderr new file mode 100644 index 000000000..23f8d5764 --- /dev/null +++ b/src/test/ui/imports/import-prefix-macro-2.stderr @@ -0,0 +1,13 @@ +error: expected identifier, found `a::b::c` + --> $DIR/import-prefix-macro-2.rs:11:26 + | +LL | ($p: path) => (use ::$p {S, Z}); + | ^^ expected identifier +... +LL | import! { a::b::c } + | ------------------- in this macro invocation + | + = note: this error originates in the macro `import` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to previous error + diff --git a/src/test/ui/imports/import-prefix-macro.rs b/src/test/ui/imports/import-prefix-macro.rs new file mode 100644 index 000000000..d770bb0da --- /dev/null +++ b/src/test/ui/imports/import-prefix-macro.rs @@ -0,0 +1,27 @@ +// run-pass +#![allow(unused_variables)] +mod a { + pub mod b { + pub mod c { + pub struct S; + pub struct Z; + } + pub struct W; + } +} + +macro_rules! import { + (1 $p: path) => (use $p;); + (2 $p: path) => (use $p::{Z};); + (3 $p: path) => (use $p::*;); +} + +import! { 1 a::b::c::S } +import! { 2 a::b::c } +import! { 3 a::b } + +fn main() { + let s = S; + let z = Z; + let w = W; +} diff --git a/src/test/ui/imports/import-rename.rs b/src/test/ui/imports/import-rename.rs new file mode 100644 index 000000000..9ad2b34b8 --- /dev/null +++ b/src/test/ui/imports/import-rename.rs @@ -0,0 +1,13 @@ +// run-pass +#![allow(unused_variables)] +use foo::{x, y as fooy}; +use Maybe::{Yes as MaybeYes}; + +pub enum Maybe { Yes, No } +mod foo { + use super::Maybe::{self as MaybeFoo}; + pub fn x(a: MaybeFoo) {} + pub fn y(a: i32) { println!("{}", a); } +} + +pub fn main() { x(MaybeYes); fooy(10); } diff --git a/src/test/ui/imports/import-rpass.rs b/src/test/ui/imports/import-rpass.rs new file mode 100644 index 000000000..de8bf6261 --- /dev/null +++ b/src/test/ui/imports/import-rpass.rs @@ -0,0 +1,12 @@ +// run-pass +mod foo { + pub fn x(y: isize) { println!("{}", y); } +} + +mod bar { + use foo::x; + use foo::x as z; + pub fn thing() { x(10); z(10); } +} + +pub fn main() { bar::thing(); } diff --git a/src/test/ui/imports/import-trailing-comma.rs b/src/test/ui/imports/import-trailing-comma.rs new file mode 100644 index 000000000..f65c5c866 --- /dev/null +++ b/src/test/ui/imports/import-trailing-comma.rs @@ -0,0 +1,13 @@ +// run-pass +// pretty-expanded FIXME #23616 + +use foo::bar::{baz, quux,}; + +mod foo { + pub mod bar { + pub fn baz() { } + pub fn quux() { } + } +} + +pub fn main() { baz(); quux(); } diff --git a/src/test/ui/imports/import-trait-method.rs b/src/test/ui/imports/import-trait-method.rs new file mode 100644 index 000000000..97dd68f1e --- /dev/null +++ b/src/test/ui/imports/import-trait-method.rs @@ -0,0 +1,7 @@ +trait Foo { + fn foo(); +} + +use Foo::foo; //~ ERROR not directly importable + +fn main() { foo(); } diff --git a/src/test/ui/imports/import-trait-method.stderr b/src/test/ui/imports/import-trait-method.stderr new file mode 100644 index 000000000..3c26907d3 --- /dev/null +++ b/src/test/ui/imports/import-trait-method.stderr @@ -0,0 +1,9 @@ +error[E0253]: `foo` is not directly importable + --> $DIR/import-trait-method.rs:5:5 + | +LL | use Foo::foo; + | ^^^^^^^^ cannot be imported directly + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0253`. diff --git a/src/test/ui/imports/import.rs b/src/test/ui/imports/import.rs new file mode 100644 index 000000000..3170dd2fa --- /dev/null +++ b/src/test/ui/imports/import.rs @@ -0,0 +1,17 @@ +use zed::bar; +use zed::baz; //~ ERROR unresolved import `zed::baz` [E0432] + //~| no `baz` in `zed` + //~| HELP a similar name exists in the module + //~| SUGGESTION bar + + +mod zed { + pub fn bar() { println!("bar"); } + use foo; //~ ERROR unresolved import `foo` [E0432] + //~^ no `foo` in the root +} + +fn main() { + zed::foo(); //~ ERROR `foo` is private + bar(); +} diff --git a/src/test/ui/imports/import.stderr b/src/test/ui/imports/import.stderr new file mode 100644 index 000000000..797712e2d --- /dev/null +++ b/src/test/ui/imports/import.stderr @@ -0,0 +1,31 @@ +error[E0432]: unresolved import `zed::baz` + --> $DIR/import.rs:2:5 + | +LL | use zed::baz; + | ^^^^^--- + | | | + | | help: a similar name exists in the module: `bar` + | no `baz` in `zed` + +error[E0432]: unresolved import `foo` + --> $DIR/import.rs:10:9 + | +LL | use foo; + | ^^^ no `foo` in the root + +error[E0603]: unresolved item import `foo` is private + --> $DIR/import.rs:15:10 + | +LL | zed::foo(); + | ^^^ private unresolved item import + | +note: the unresolved item import `foo` is defined here + --> $DIR/import.rs:10:9 + | +LL | use foo; + | ^^^ + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0432, E0603. +For more information about an error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/import2-rpass.rs b/src/test/ui/imports/import2-rpass.rs new file mode 100644 index 000000000..7b70f799e --- /dev/null +++ b/src/test/ui/imports/import2-rpass.rs @@ -0,0 +1,9 @@ +// run-pass + +use zed::bar; + +mod zed { + pub fn bar() { println!("bar"); } +} + +pub fn main() { bar(); } diff --git a/src/test/ui/imports/import2.rs b/src/test/ui/imports/import2.rs new file mode 100644 index 000000000..036d6bc07 --- /dev/null +++ b/src/test/ui/imports/import2.rs @@ -0,0 +1,10 @@ +use baz::zed::bar; //~ ERROR unresolved import `baz::zed` [E0432] + //~^ could not find `zed` in `baz` + +mod baz {} +mod zed { + pub fn bar() { println!("bar3"); } +} +fn main() { + bar(); +} diff --git a/src/test/ui/imports/import2.stderr b/src/test/ui/imports/import2.stderr new file mode 100644 index 000000000..da888979c --- /dev/null +++ b/src/test/ui/imports/import2.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `baz::zed` + --> $DIR/import2.rs:1:10 + | +LL | use baz::zed::bar; + | ^^^ could not find `zed` in `baz` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/import3-rpass.rs b/src/test/ui/imports/import3-rpass.rs new file mode 100644 index 000000000..17797aed3 --- /dev/null +++ b/src/test/ui/imports/import3-rpass.rs @@ -0,0 +1,13 @@ +// run-pass +#![allow(unused_imports)] + +use baz::zed; +use baz::zed::bar; + +mod baz { + pub mod zed { + pub fn bar() { println!("bar2"); } + } +} + +pub fn main() { bar(); } diff --git a/src/test/ui/imports/import3.rs b/src/test/ui/imports/import3.rs new file mode 100644 index 000000000..2c6ac9a00 --- /dev/null +++ b/src/test/ui/imports/import3.rs @@ -0,0 +1,4 @@ +// error-pattern: unresolved +use main::bar; + +fn main() { println!("foo"); } diff --git a/src/test/ui/imports/import3.stderr b/src/test/ui/imports/import3.stderr new file mode 100644 index 000000000..ca75c9c18 --- /dev/null +++ b/src/test/ui/imports/import3.stderr @@ -0,0 +1,11 @@ +error[E0432]: unresolved import `main` + --> $DIR/import3.rs:2:5 + | +LL | use main::bar; + | ^^^^ maybe a missing crate `main`? + | + = help: consider adding `extern crate main` to use the `main` crate + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/import4-rpass.rs b/src/test/ui/imports/import4-rpass.rs new file mode 100644 index 000000000..4fda53861 --- /dev/null +++ b/src/test/ui/imports/import4-rpass.rs @@ -0,0 +1,9 @@ +// run-pass + +use zed::bar; + +mod zed { + pub fn bar() { println!("bar"); } +} + +pub fn main() { let _zed = 42; bar(); } diff --git a/src/test/ui/imports/import4.rs b/src/test/ui/imports/import4.rs new file mode 100644 index 000000000..ba3b7fbf5 --- /dev/null +++ b/src/test/ui/imports/import4.rs @@ -0,0 +1,7 @@ +// error-pattern: import + + +mod a { pub use b::foo; } +mod b { pub use a::foo; } + +fn main() { println!("loop"); } diff --git a/src/test/ui/imports/import4.stderr b/src/test/ui/imports/import4.stderr new file mode 100644 index 000000000..e0b478f1a --- /dev/null +++ b/src/test/ui/imports/import4.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `a::foo` + --> $DIR/import4.rs:5:17 + | +LL | mod b { pub use a::foo; } + | ^^^^^^ no `foo` in `a` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/import5.rs b/src/test/ui/imports/import5.rs new file mode 100644 index 000000000..be2a55c2d --- /dev/null +++ b/src/test/ui/imports/import5.rs @@ -0,0 +1,10 @@ +// run-pass +use foo::bar; +mod foo { + pub use foo::zed::bar; + pub mod zed { + pub fn bar() { println!("foo"); } + } +} + +pub fn main() { bar(); } diff --git a/src/test/ui/imports/import6.rs b/src/test/ui/imports/import6.rs new file mode 100644 index 000000000..e11b28531 --- /dev/null +++ b/src/test/ui/imports/import6.rs @@ -0,0 +1,15 @@ +// run-pass +#![allow(unused_imports)] + +use foo::zed; +use bar::baz; + +mod foo { + pub mod zed { + pub fn baz() { println!("baz"); } + } +} +mod bar { + pub use foo::zed::baz; +} +pub fn main() { baz(); } diff --git a/src/test/ui/imports/import7.rs b/src/test/ui/imports/import7.rs new file mode 100644 index 000000000..aca7fbdc4 --- /dev/null +++ b/src/test/ui/imports/import7.rs @@ -0,0 +1,18 @@ +// run-pass +#![allow(unused_imports)] + +use foo::zed; +use bar::baz; + +mod foo { + pub mod zed { + pub fn baz() { println!("baz"); } + } +} +mod bar { + pub use foo::zed::baz; + pub mod foo { + pub mod zed {} + } +} +pub fn main() { baz(); } diff --git a/src/test/ui/imports/import8.rs b/src/test/ui/imports/import8.rs new file mode 100644 index 000000000..87f0986ba --- /dev/null +++ b/src/test/ui/imports/import8.rs @@ -0,0 +1,10 @@ +// run-pass + +use foo::x; +use foo::x as z; + +mod foo { + pub fn x(y: isize) { println!("{}", y); } +} + +pub fn main() { x(10); z(10); } diff --git a/src/test/ui/imports/imports.rs b/src/test/ui/imports/imports.rs new file mode 100644 index 000000000..acb2b32b5 --- /dev/null +++ b/src/test/ui/imports/imports.rs @@ -0,0 +1,66 @@ +// run-pass +#![allow(unused)] + +// Like other items, private imports can be imported and used non-lexically in paths. +mod a { + use a as foo; + use self::foo::foo as bar; + + mod b { + use super::bar; + } +} + +mod foo { pub fn f() {} } +mod bar { pub fn f() {} } + +pub fn f() -> bool { true } + +// Items and explicit imports shadow globs. +fn g() { + use foo::*; + use bar::*; + fn f() -> bool { true } + let _: bool = f(); +} + +fn h() { + use foo::*; + use bar::*; + use f; + let _: bool = f(); +} + +// Here, there appears to be shadowing but isn't because of namespaces. +mod b { + use foo::*; // This imports `f` in the value namespace. + use super::b as f; // This imports `f` only in the type namespace, + fn test() { self::f(); } // so the glob isn't shadowed. +} + +// Here, there is shadowing in one namespace, but not the other. +mod c { + mod test { + pub fn f() {} + pub mod f {} + } + use self::test::*; // This glob-imports `f` in both namespaces. + mod f { pub fn f() {} } // This shadows the glob only in the value namespace. + + fn test() { + self::f(); // Check that the glob-imported value isn't shadowed. + self::f::f(); // Check that the glob-imported module is shadowed. + } +} + +// Unused names can be ambiguous. +mod d { + pub use foo::*; // This imports `f` in the value namespace. + pub use bar::*; // This also imports `f` in the value namespace. +} + +mod e { + pub use d::*; // n.b. Since `e::f` is not used, this is not considered to be a use of `d::f`. +} + +fn main() {} diff --git a/src/test/ui/imports/inaccessible_type_aliases.rs b/src/test/ui/imports/inaccessible_type_aliases.rs new file mode 100644 index 000000000..c3d4214e2 --- /dev/null +++ b/src/test/ui/imports/inaccessible_type_aliases.rs @@ -0,0 +1,14 @@ +mod a { + type Foo = u64; + type Bar = u64; +} + +mod b { + type Foo = u64; +} + +fn main() { + let x: Foo = 100; //~ ERROR: cannot find type `Foo` in this scope + let y: Bar = 100; //~ ERROR: cannot find type `Bar` in this scope + println!("x: {}, y: {}", x, y); +} diff --git a/src/test/ui/imports/inaccessible_type_aliases.stderr b/src/test/ui/imports/inaccessible_type_aliases.stderr new file mode 100644 index 000000000..ef2242460 --- /dev/null +++ b/src/test/ui/imports/inaccessible_type_aliases.stderr @@ -0,0 +1,30 @@ +error[E0412]: cannot find type `Foo` in this scope + --> $DIR/inaccessible_type_aliases.rs:11:12 + | +LL | let x: Foo = 100; + | ^^^ not found in this scope + | +note: these type aliases exist but are inaccessible + --> $DIR/inaccessible_type_aliases.rs:2:5 + | +LL | type Foo = u64; + | ^^^^^^^^^^^^^^^ `a::Foo`: not accessible +... +LL | type Foo = u64; + | ^^^^^^^^^^^^^^^ `b::Foo`: not accessible + +error[E0412]: cannot find type `Bar` in this scope + --> $DIR/inaccessible_type_aliases.rs:12:12 + | +LL | let y: Bar = 100; + | ^^^ not found in this scope + | +note: type alias `a::Bar` exists but is inaccessible + --> $DIR/inaccessible_type_aliases.rs:3:5 + | +LL | type Bar = u64; + | ^^^^^^^^^^^^^^^ not accessible + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0412`. diff --git a/src/test/ui/imports/issue-13404.rs b/src/test/ui/imports/issue-13404.rs new file mode 100644 index 000000000..c5af827d5 --- /dev/null +++ b/src/test/ui/imports/issue-13404.rs @@ -0,0 +1,10 @@ +use a::f; +use b::f; //~ ERROR: unresolved import `b::f` [E0432] + //~^ no `f` in `b` + +mod a { pub fn f() {} } +mod b { } + +fn main() { + f(); +} diff --git a/src/test/ui/imports/issue-13404.stderr b/src/test/ui/imports/issue-13404.stderr new file mode 100644 index 000000000..1f50debb0 --- /dev/null +++ b/src/test/ui/imports/issue-13404.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `b::f` + --> $DIR/issue-13404.rs:2:5 + | +LL | use b::f; + | ^^^^ no `f` in `b` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-1697.rs b/src/test/ui/imports/issue-1697.rs new file mode 100644 index 000000000..5cd76d21f --- /dev/null +++ b/src/test/ui/imports/issue-1697.rs @@ -0,0 +1,6 @@ +// Testing that we don't fail abnormally after hitting the errors + +use unresolved::*; //~ ERROR unresolved import `unresolved` [E0432] + //~^ maybe a missing crate `unresolved`? + +fn main() {} diff --git a/src/test/ui/imports/issue-1697.stderr b/src/test/ui/imports/issue-1697.stderr new file mode 100644 index 000000000..019ef9ad5 --- /dev/null +++ b/src/test/ui/imports/issue-1697.stderr @@ -0,0 +1,11 @@ +error[E0432]: unresolved import `unresolved` + --> $DIR/issue-1697.rs:3:5 + | +LL | use unresolved::*; + | ^^^^^^^^^^ maybe a missing crate `unresolved`? + | + = help: consider adding `extern crate unresolved` to use the `unresolved` crate + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-18083.rs b/src/test/ui/imports/issue-18083.rs new file mode 100644 index 000000000..36420ec14 --- /dev/null +++ b/src/test/ui/imports/issue-18083.rs @@ -0,0 +1,25 @@ +// check-pass +#![allow(dead_code)] +#![allow(unused_imports)] +// These crossed imports should resolve fine, and not block on +// each other and be reported as unresolved. + +mod a { + use b::{B}; + pub use self::inner::A; + + mod inner { + pub struct A; + } +} + +mod b { + use a::{A}; + pub use self::inner::B; + + mod inner { + pub struct B; + } +} + +fn main() {} diff --git a/src/test/ui/imports/issue-19498.rs b/src/test/ui/imports/issue-19498.rs new file mode 100644 index 000000000..5fe6742f5 --- /dev/null +++ b/src/test/ui/imports/issue-19498.rs @@ -0,0 +1,13 @@ +use self::A; +use self::B; +mod A {} //~ ERROR the name `A` is defined multiple times +//~| `A` redefined here +pub mod B {} //~ ERROR the name `B` is defined multiple times +//~| `B` redefined here +mod C { + use C::D; + mod D {} //~ ERROR the name `D` is defined multiple times + //~| `D` redefined here +} + +fn main() {} diff --git a/src/test/ui/imports/issue-19498.stderr b/src/test/ui/imports/issue-19498.stderr new file mode 100644 index 000000000..9d2602209 --- /dev/null +++ b/src/test/ui/imports/issue-19498.stderr @@ -0,0 +1,47 @@ +error[E0255]: the name `A` is defined multiple times + --> $DIR/issue-19498.rs:3:1 + | +LL | use self::A; + | ------- previous import of the module `A` here +LL | use self::B; +LL | mod A {} + | ^^^^^ `A` redefined here + | + = note: `A` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use self::A as OtherA; + | ~~~~~~~~~~~~~~~~~ + +error[E0255]: the name `B` is defined multiple times + --> $DIR/issue-19498.rs:5:1 + | +LL | use self::B; + | ------- previous import of the module `B` here +... +LL | pub mod B {} + | ^^^^^^^^^ `B` redefined here + | + = note: `B` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use self::B as OtherB; + | ~~~~~~~~~~~~~~~~~ + +error[E0255]: the name `D` is defined multiple times + --> $DIR/issue-19498.rs:9:5 + | +LL | use C::D; + | ---- previous import of the module `D` here +LL | mod D {} + | ^^^^^ `D` redefined here + | + = note: `D` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use C::D as OtherD; + | ~~~~~~~~~~~~~~ + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0255`. diff --git a/src/test/ui/imports/issue-24081.rs b/src/test/ui/imports/issue-24081.rs new file mode 100644 index 000000000..10983ce11 --- /dev/null +++ b/src/test/ui/imports/issue-24081.rs @@ -0,0 +1,18 @@ +use std::ops::Add; +use std::ops::Sub; +use std::ops::Mul; +use std::ops::Div; +use std::ops::Rem; + +type Add = bool; //~ ERROR the name `Add` is defined multiple times +//~| `Add` redefined here +struct Sub { x: f32 } //~ ERROR the name `Sub` is defined multiple times +//~| `Sub` redefined here +enum Mul { A, B } //~ ERROR the name `Mul` is defined multiple times +//~| `Mul` redefined here +mod Div { } //~ ERROR the name `Div` is defined multiple times +//~| `Div` redefined here +trait Rem { } //~ ERROR the name `Rem` is defined multiple times +//~| `Rem` redefined here + +fn main() {} diff --git a/src/test/ui/imports/issue-24081.stderr b/src/test/ui/imports/issue-24081.stderr new file mode 100644 index 000000000..e5ed6b10a --- /dev/null +++ b/src/test/ui/imports/issue-24081.stderr @@ -0,0 +1,78 @@ +error[E0255]: the name `Add` is defined multiple times + --> $DIR/issue-24081.rs:7:1 + | +LL | use std::ops::Add; + | ------------- previous import of the trait `Add` here +... +LL | type Add = bool; + | ^^^^^^^^^^^^^^^^ `Add` redefined here + | + = note: `Add` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std::ops::Add as OtherAdd; + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + +error[E0255]: the name `Sub` is defined multiple times + --> $DIR/issue-24081.rs:9:1 + | +LL | use std::ops::Sub; + | ------------- previous import of the trait `Sub` here +... +LL | struct Sub { x: f32 } + | ^^^^^^^^^^ `Sub` redefined here + | + = note: `Sub` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std::ops::Sub as OtherSub; + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + +error[E0255]: the name `Mul` is defined multiple times + --> $DIR/issue-24081.rs:11:1 + | +LL | use std::ops::Mul; + | ------------- previous import of the trait `Mul` here +... +LL | enum Mul { A, B } + | ^^^^^^^^ `Mul` redefined here + | + = note: `Mul` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std::ops::Mul as OtherMul; + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + +error[E0255]: the name `Div` is defined multiple times + --> $DIR/issue-24081.rs:13:1 + | +LL | use std::ops::Div; + | ------------- previous import of the trait `Div` here +... +LL | mod Div { } + | ^^^^^^^ `Div` redefined here + | + = note: `Div` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std::ops::Div as OtherDiv; + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + +error[E0255]: the name `Rem` is defined multiple times + --> $DIR/issue-24081.rs:15:1 + | +LL | use std::ops::Rem; + | ------------- previous import of the trait `Rem` here +... +LL | trait Rem { } + | ^^^^^^^^^ `Rem` redefined here + | + = note: `Rem` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std::ops::Rem as OtherRem; + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0255`. diff --git a/src/test/ui/imports/issue-24883.rs b/src/test/ui/imports/issue-24883.rs new file mode 100644 index 000000000..819a20ddb --- /dev/null +++ b/src/test/ui/imports/issue-24883.rs @@ -0,0 +1,17 @@ +// check-pass + +mod a { + pub mod b { pub struct Foo; } + + pub mod c { + use super::b; + pub struct Bar(pub b::Foo); + } + + pub use self::c::*; +} + +fn main() { + let _ = a::c::Bar(a::b::Foo); + let _ = a::Bar(a::b::Foo); +} diff --git a/src/test/ui/imports/issue-25396.rs b/src/test/ui/imports/issue-25396.rs new file mode 100644 index 000000000..301658d23 --- /dev/null +++ b/src/test/ui/imports/issue-25396.rs @@ -0,0 +1,29 @@ +#![allow(non_camel_case_types)] + +use foo::baz; +use bar::baz; //~ ERROR the name `baz` is defined multiple times + +use foo::Quux; +use bar::Quux; //~ ERROR the name `Quux` is defined multiple times + +use foo::blah; +use bar::blah; //~ ERROR the name `blah` is defined multiple times + +use foo::WOMP; +use bar::WOMP; //~ ERROR the name `WOMP` is defined multiple times + +fn main() {} + +mod foo { + pub mod baz {} + pub trait Quux { } + pub type blah = (f64, u32); + pub const WOMP: u8 = 5; +} + +mod bar { + pub mod baz {} + pub type Quux = i32; + pub struct blah { x: i8 } + pub const WOMP: i8 = -5; +} diff --git a/src/test/ui/imports/issue-25396.stderr b/src/test/ui/imports/issue-25396.stderr new file mode 100644 index 000000000..518d2be78 --- /dev/null +++ b/src/test/ui/imports/issue-25396.stderr @@ -0,0 +1,59 @@ +error[E0252]: the name `baz` is defined multiple times + --> $DIR/issue-25396.rs:4:5 + | +LL | use foo::baz; + | -------- previous import of the module `baz` here +LL | use bar::baz; + | ^^^^^^^^ `baz` reimported here + | + = note: `baz` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use bar::baz as other_baz; + | ~~~~~~~~~~~~~~~~~~~~~ + +error[E0252]: the name `Quux` is defined multiple times + --> $DIR/issue-25396.rs:7:5 + | +LL | use foo::Quux; + | --------- previous import of the trait `Quux` here +LL | use bar::Quux; + | ^^^^^^^^^ `Quux` reimported here + | + = note: `Quux` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use bar::Quux as OtherQuux; + | ~~~~~~~~~~~~~~~~~~~~~~ + +error[E0252]: the name `blah` is defined multiple times + --> $DIR/issue-25396.rs:10:5 + | +LL | use foo::blah; + | --------- previous import of the type `blah` here +LL | use bar::blah; + | ^^^^^^^^^ `blah` reimported here + | + = note: `blah` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use bar::blah as other_blah; + | ~~~~~~~~~~~~~~~~~~~~~~~ + +error[E0252]: the name `WOMP` is defined multiple times + --> $DIR/issue-25396.rs:13:5 + | +LL | use foo::WOMP; + | --------- previous import of the value `WOMP` here +LL | use bar::WOMP; + | ^^^^^^^^^ `WOMP` reimported here + | + = note: `WOMP` must be defined only once in the value namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use bar::WOMP as OtherWOMP; + | ~~~~~~~~~~~~~~~~~~~~~~ + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-26873-multifile/A/B.rs b/src/test/ui/imports/issue-26873-multifile/A/B.rs new file mode 100644 index 000000000..ab7b0d816 --- /dev/null +++ b/src/test/ui/imports/issue-26873-multifile/A/B.rs @@ -0,0 +1,4 @@ +// run-pass +use super::*; + +pub struct S; diff --git a/src/test/ui/imports/issue-26873-multifile/A/C.rs b/src/test/ui/imports/issue-26873-multifile/A/C.rs new file mode 100644 index 000000000..b287283df --- /dev/null +++ b/src/test/ui/imports/issue-26873-multifile/A/C.rs @@ -0,0 +1,6 @@ +// run-pass +use super::*; + +use super::B::S; + +pub struct T { i: i32 } diff --git a/src/test/ui/imports/issue-26873-multifile/A/mod.rs b/src/test/ui/imports/issue-26873-multifile/A/mod.rs new file mode 100644 index 000000000..0f18772bf --- /dev/null +++ b/src/test/ui/imports/issue-26873-multifile/A/mod.rs @@ -0,0 +1,5 @@ +// run-pass +pub mod B; +pub mod C; + +pub use self::C::T; diff --git a/src/test/ui/imports/issue-26873-multifile/compiletest-ignore-dir b/src/test/ui/imports/issue-26873-multifile/compiletest-ignore-dir new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/src/test/ui/imports/issue-26873-multifile/compiletest-ignore-dir diff --git a/src/test/ui/imports/issue-26873-multifile/issue-26873-multifile.rs b/src/test/ui/imports/issue-26873-multifile/issue-26873-multifile.rs new file mode 100644 index 000000000..da2acf6c9 --- /dev/null +++ b/src/test/ui/imports/issue-26873-multifile/issue-26873-multifile.rs @@ -0,0 +1,11 @@ +// run-pass +#![allow(dead_code)] +#![allow(unused_imports)] +#![allow(non_snake_case)] + +// ignore-pretty issue #37195 + +#[path = "issue-26873-multifile/mod.rs"] +mod multifile; + +fn main() {} diff --git a/src/test/ui/imports/issue-26873-multifile/issue-26873-onefile.rs b/src/test/ui/imports/issue-26873-multifile/issue-26873-onefile.rs new file mode 100644 index 000000000..f06c6499e --- /dev/null +++ b/src/test/ui/imports/issue-26873-multifile/issue-26873-onefile.rs @@ -0,0 +1,25 @@ +// run-pass +#![allow(dead_code)] +#![allow(unused_imports)] +#![allow(non_snake_case)] + +mod A { + pub mod B { + use super::*; + + pub struct S; + } + + pub mod C { + use super::*; + use super::B::S; + + pub struct T; + } + + pub use self::C::T; +} + +use A::*; + +fn main() {} diff --git a/src/test/ui/imports/issue-26873-multifile/mod.rs b/src/test/ui/imports/issue-26873-multifile/mod.rs new file mode 100644 index 000000000..a1ba53f91 --- /dev/null +++ b/src/test/ui/imports/issue-26873-multifile/mod.rs @@ -0,0 +1,4 @@ +// run-pass +mod A; + +use self::A::*; diff --git a/src/test/ui/imports/issue-26886.rs b/src/test/ui/imports/issue-26886.rs new file mode 100644 index 000000000..6e6d406c6 --- /dev/null +++ b/src/test/ui/imports/issue-26886.rs @@ -0,0 +1,8 @@ +use std::sync::{self, Arc}; +use std::sync::Arc; //~ ERROR the name `Arc` is defined multiple times + //~| `Arc` must be defined only once in the type namespace of this module +use std::sync; //~ ERROR the name `sync` is defined multiple times + //~| `sync` must be defined only once in the type namespace of this module + +fn main() { +} diff --git a/src/test/ui/imports/issue-26886.stderr b/src/test/ui/imports/issue-26886.stderr new file mode 100644 index 000000000..e2b925ec5 --- /dev/null +++ b/src/test/ui/imports/issue-26886.stderr @@ -0,0 +1,24 @@ +error[E0252]: the name `Arc` is defined multiple times + --> $DIR/issue-26886.rs:2:5 + | +LL | use std::sync::{self, Arc}; + | --- previous import of the type `Arc` here +LL | use std::sync::Arc; + | ^^^^^^^^^^^^^^ `Arc` reimported here + | + = note: `Arc` must be defined only once in the type namespace of this module + +error[E0252]: the name `sync` is defined multiple times + --> $DIR/issue-26886.rs:4:5 + | +LL | use std::sync::{self, Arc}; + | ---- previous import of the module `sync` here +... +LL | use std::sync; + | ^^^^^^^^^ `sync` reimported here + | + = note: `sync` must be defined only once in the type namespace of this module + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-28134.rs b/src/test/ui/imports/issue-28134.rs new file mode 100644 index 000000000..ef2a5d634 --- /dev/null +++ b/src/test/ui/imports/issue-28134.rs @@ -0,0 +1,5 @@ +// compile-flags: --test + +#![allow(soft_unstable)] +#![test] //~ ERROR cannot determine resolution for the attribute macro `test` +//~^ ERROR 4:1: 4:9: `test` attribute cannot be used at crate level diff --git a/src/test/ui/imports/issue-28134.stderr b/src/test/ui/imports/issue-28134.stderr new file mode 100644 index 000000000..33cb53f20 --- /dev/null +++ b/src/test/ui/imports/issue-28134.stderr @@ -0,0 +1,21 @@ +error: cannot determine resolution for the attribute macro `test` + --> $DIR/issue-28134.rs:4:4 + | +LL | #![test] + | ^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: `test` attribute cannot be used at crate level + --> $DIR/issue-28134.rs:4:1 + | +LL | #![test] + | ^^^^^^^^ + | +help: perhaps you meant to use an outer attribute + | +LL | #[test] + | ~~~~~~~ + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/imports/issue-28388-1.rs b/src/test/ui/imports/issue-28388-1.rs new file mode 100644 index 000000000..14de62140 --- /dev/null +++ b/src/test/ui/imports/issue-28388-1.rs @@ -0,0 +1,5 @@ +// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc. + +use foo::{}; //~ ERROR unresolved import `foo` + +fn main() {} diff --git a/src/test/ui/imports/issue-28388-1.stderr b/src/test/ui/imports/issue-28388-1.stderr new file mode 100644 index 000000000..7f5e47aa8 --- /dev/null +++ b/src/test/ui/imports/issue-28388-1.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `foo` + --> $DIR/issue-28388-1.rs:3:5 + | +LL | use foo::{}; + | ^^^^^^^ no `foo` in the root + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-28388-2.rs b/src/test/ui/imports/issue-28388-2.rs new file mode 100644 index 000000000..024b0388b --- /dev/null +++ b/src/test/ui/imports/issue-28388-2.rs @@ -0,0 +1,10 @@ +// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc. + +mod m { + mod n {} +} + +use m::n::{}; +//~^ ERROR module `n` is private + +fn main() {} diff --git a/src/test/ui/imports/issue-28388-2.stderr b/src/test/ui/imports/issue-28388-2.stderr new file mode 100644 index 000000000..1afaf622b --- /dev/null +++ b/src/test/ui/imports/issue-28388-2.stderr @@ -0,0 +1,15 @@ +error[E0603]: module `n` is private + --> $DIR/issue-28388-2.rs:7:8 + | +LL | use m::n::{}; + | ^ private module + | +note: the module `n` is defined here + --> $DIR/issue-28388-2.rs:4:5 + | +LL | mod n {} + | ^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0603`. diff --git a/src/test/ui/imports/issue-2937.rs b/src/test/ui/imports/issue-2937.rs new file mode 100644 index 000000000..335df5c07 --- /dev/null +++ b/src/test/ui/imports/issue-2937.rs @@ -0,0 +1,6 @@ +use m::f as x; //~ ERROR unresolved import `m::f` [E0432] + //~^ no `f` in `m` + +mod m {} + +fn main() {} diff --git a/src/test/ui/imports/issue-2937.stderr b/src/test/ui/imports/issue-2937.stderr new file mode 100644 index 000000000..428634828 --- /dev/null +++ b/src/test/ui/imports/issue-2937.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `m::f` + --> $DIR/issue-2937.rs:1:5 + | +LL | use m::f as x; + | ^^^^^^^^^ no `f` in `m` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-30560.rs b/src/test/ui/imports/issue-30560.rs new file mode 100644 index 000000000..d8d4ca608 --- /dev/null +++ b/src/test/ui/imports/issue-30560.rs @@ -0,0 +1,9 @@ +type Alias = (); +use Alias::*; //~ ERROR unresolved import `Alias` [E0432] + +use std::io::Result::*; //~ ERROR unresolved import `std::io::Result` [E0432] + +trait T {} +use T::*; //~ ERROR items in traits are not importable + +fn main() {} diff --git a/src/test/ui/imports/issue-30560.stderr b/src/test/ui/imports/issue-30560.stderr new file mode 100644 index 000000000..69cfd4c06 --- /dev/null +++ b/src/test/ui/imports/issue-30560.stderr @@ -0,0 +1,21 @@ +error: items in traits are not importable + --> $DIR/issue-30560.rs:7:5 + | +LL | use T::*; + | ^^^^ + +error[E0432]: unresolved import `Alias` + --> $DIR/issue-30560.rs:2:5 + | +LL | use Alias::*; + | ^^^^^ `Alias` is a type alias, not a module + +error[E0432]: unresolved import `std::io::Result` + --> $DIR/issue-30560.rs:4:14 + | +LL | use std::io::Result::*; + | ^^^^^^ `Result` is a type alias, not a module + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-31212.rs b/src/test/ui/imports/issue-31212.rs new file mode 100644 index 000000000..556f0d18f --- /dev/null +++ b/src/test/ui/imports/issue-31212.rs @@ -0,0 +1,10 @@ +// This checks that a path that cannot be resolved because of an indeterminate import +// does not trigger an ICE. + +mod foo { + pub use self::*; //~ ERROR unresolved +} + +fn main() { + foo::f(); //~ ERROR cannot find function `f` in module `foo` +} diff --git a/src/test/ui/imports/issue-31212.stderr b/src/test/ui/imports/issue-31212.stderr new file mode 100644 index 000000000..0bb56b361 --- /dev/null +++ b/src/test/ui/imports/issue-31212.stderr @@ -0,0 +1,16 @@ +error[E0432]: unresolved import `self::*` + --> $DIR/issue-31212.rs:5:13 + | +LL | pub use self::*; + | ^^^^^^^ cannot glob-import a module into itself + +error[E0425]: cannot find function `f` in module `foo` + --> $DIR/issue-31212.rs:9:10 + | +LL | foo::f(); + | ^ not found in `foo` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0425, E0432. +For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/imports/issue-32119.rs b/src/test/ui/imports/issue-32119.rs new file mode 100644 index 000000000..36adb5289 --- /dev/null +++ b/src/test/ui/imports/issue-32119.rs @@ -0,0 +1,17 @@ +// check-pass + +pub type T = (); +mod foo { pub use super::T; } +mod bar { pub use super::T; } + +pub use foo::*; +pub use bar::*; + +mod baz { + pub type T = (); + mod foo { pub use super::T as S; } + mod bar { pub use super::foo::S as T; } + pub use self::bar::*; +} + +fn main() {} diff --git a/src/test/ui/imports/issue-32222.rs b/src/test/ui/imports/issue-32222.rs new file mode 100644 index 000000000..4ed06bff8 --- /dev/null +++ b/src/test/ui/imports/issue-32222.rs @@ -0,0 +1,22 @@ +// check-pass + +mod foo { + pub fn bar() {} +} + +pub use foo::*; +use b::bar; + +mod foobar { + use super::*; +} + +mod a { + pub mod bar {} +} + +mod b { + pub use a::bar; +} + +fn main() {} diff --git a/src/test/ui/imports/issue-32354-suggest-import-rename.fixed b/src/test/ui/imports/issue-32354-suggest-import-rename.fixed new file mode 100644 index 000000000..27f1b8964 --- /dev/null +++ b/src/test/ui/imports/issue-32354-suggest-import-rename.fixed @@ -0,0 +1,16 @@ +// run-rustfix + +#![allow(unused_imports)] + +pub mod extension1 { + pub trait ConstructorExtension {} +} + +pub mod extension2 { + pub trait ConstructorExtension {} +} + +use extension1::ConstructorExtension; +use extension2::ConstructorExtension as OtherConstructorExtension; //~ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-32354-suggest-import-rename.rs b/src/test/ui/imports/issue-32354-suggest-import-rename.rs new file mode 100644 index 000000000..5a7f234d5 --- /dev/null +++ b/src/test/ui/imports/issue-32354-suggest-import-rename.rs @@ -0,0 +1,16 @@ +// run-rustfix + +#![allow(unused_imports)] + +pub mod extension1 { + pub trait ConstructorExtension {} +} + +pub mod extension2 { + pub trait ConstructorExtension {} +} + +use extension1::ConstructorExtension; +use extension2::ConstructorExtension; //~ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-32354-suggest-import-rename.stderr b/src/test/ui/imports/issue-32354-suggest-import-rename.stderr new file mode 100644 index 000000000..4c5875ba7 --- /dev/null +++ b/src/test/ui/imports/issue-32354-suggest-import-rename.stderr @@ -0,0 +1,17 @@ +error[E0252]: the name `ConstructorExtension` is defined multiple times + --> $DIR/issue-32354-suggest-import-rename.rs:14:5 + | +LL | use extension1::ConstructorExtension; + | -------------------------------- previous import of the trait `ConstructorExtension` here +LL | use extension2::ConstructorExtension; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `ConstructorExtension` reimported here + | + = note: `ConstructorExtension` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use extension2::ConstructorExtension as OtherConstructorExtension; + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-32833.rs b/src/test/ui/imports/issue-32833.rs new file mode 100644 index 000000000..379eedde7 --- /dev/null +++ b/src/test/ui/imports/issue-32833.rs @@ -0,0 +1,7 @@ +use bar::Foo; //~ ERROR unresolved import `bar::Foo` [E0432] + //~^ no `Foo` in `bar` +mod bar { + use Foo; +} + +fn main() {} diff --git a/src/test/ui/imports/issue-32833.stderr b/src/test/ui/imports/issue-32833.stderr new file mode 100644 index 000000000..430cc0fda --- /dev/null +++ b/src/test/ui/imports/issue-32833.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `bar::Foo` + --> $DIR/issue-32833.rs:1:5 + | +LL | use bar::Foo; + | ^^^^^^^^ no `Foo` in `bar` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-33464.rs b/src/test/ui/imports/issue-33464.rs new file mode 100644 index 000000000..a0edb5fdb --- /dev/null +++ b/src/test/ui/imports/issue-33464.rs @@ -0,0 +1,10 @@ +// Make sure that the spans of import errors are correct. + +use abc::one_el; +//~^ ERROR +use abc::{a, bbb, cccccc}; +//~^ ERROR +use a_very_long_name::{el, el2}; +//~^ ERROR + +fn main() {} diff --git a/src/test/ui/imports/issue-33464.stderr b/src/test/ui/imports/issue-33464.stderr new file mode 100644 index 000000000..c4e5c5558 --- /dev/null +++ b/src/test/ui/imports/issue-33464.stderr @@ -0,0 +1,27 @@ +error[E0432]: unresolved import `abc` + --> $DIR/issue-33464.rs:3:5 + | +LL | use abc::one_el; + | ^^^ maybe a missing crate `abc`? + | + = help: consider adding `extern crate abc` to use the `abc` crate + +error[E0432]: unresolved import `abc` + --> $DIR/issue-33464.rs:5:5 + | +LL | use abc::{a, bbb, cccccc}; + | ^^^ maybe a missing crate `abc`? + | + = help: consider adding `extern crate abc` to use the `abc` crate + +error[E0432]: unresolved import `a_very_long_name` + --> $DIR/issue-33464.rs:7:5 + | +LL | use a_very_long_name::{el, el2}; + | ^^^^^^^^^^^^^^^^ maybe a missing crate `a_very_long_name`? + | + = help: consider adding `extern crate a_very_long_name` to use the `a_very_long_name` crate + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-36881.rs b/src/test/ui/imports/issue-36881.rs new file mode 100644 index 000000000..04313872d --- /dev/null +++ b/src/test/ui/imports/issue-36881.rs @@ -0,0 +1,6 @@ +// aux-build:issue-36881-aux.rs + +fn main() { + extern crate issue_36881_aux; + use issue_36881_aux::Foo; //~ ERROR unresolved import +} diff --git a/src/test/ui/imports/issue-36881.stderr b/src/test/ui/imports/issue-36881.stderr new file mode 100644 index 000000000..2e1b46860 --- /dev/null +++ b/src/test/ui/imports/issue-36881.stderr @@ -0,0 +1,11 @@ +error[E0432]: unresolved import `issue_36881_aux` + --> $DIR/issue-36881.rs:5:9 + | +LL | use issue_36881_aux::Foo; + | ^^^^^^^^^^^^^^^ maybe a missing crate `issue_36881_aux`? + | + = help: consider adding `extern crate issue_36881_aux` to use the `issue_36881_aux` crate + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-37887.rs b/src/test/ui/imports/issue-37887.rs new file mode 100644 index 000000000..58f0c6b65 --- /dev/null +++ b/src/test/ui/imports/issue-37887.rs @@ -0,0 +1,4 @@ +fn main() { + extern crate libc; //~ ERROR use of unstable + use libc::*; //~ ERROR unresolved import +} diff --git a/src/test/ui/imports/issue-37887.stderr b/src/test/ui/imports/issue-37887.stderr new file mode 100644 index 000000000..75185cad3 --- /dev/null +++ b/src/test/ui/imports/issue-37887.stderr @@ -0,0 +1,21 @@ +error[E0432]: unresolved import `libc` + --> $DIR/issue-37887.rs:3:9 + | +LL | use libc::*; + | ^^^^ maybe a missing crate `libc`? + | + = help: consider adding `extern crate libc` to use the `libc` crate + +error[E0658]: use of unstable library feature 'rustc_private': this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead? + --> $DIR/issue-37887.rs:2:5 + | +LL | extern crate libc; + | ^^^^^^^^^^^^^^^^^^ + | + = note: see issue #27812 <https://github.com/rust-lang/rust/issues/27812> for more information + = help: add `#![feature(rustc_private)]` to the crate attributes to enable + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0432, E0658. +For more information about an error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-38293.rs b/src/test/ui/imports/issue-38293.rs new file mode 100644 index 000000000..3b1393600 --- /dev/null +++ b/src/test/ui/imports/issue-38293.rs @@ -0,0 +1,16 @@ +// Test that `fn foo::bar::{self}` only imports `bar` in the type namespace. + +mod foo { + pub fn f() { } +} +use foo::f::{self}; //~ ERROR unresolved import `foo::f` + +mod bar { + pub fn baz() {} + pub mod baz {} +} +use bar::baz::{self}; + +fn main() { + baz(); //~ ERROR expected function, found module `baz` +} diff --git a/src/test/ui/imports/issue-38293.stderr b/src/test/ui/imports/issue-38293.stderr new file mode 100644 index 000000000..d2450ab12 --- /dev/null +++ b/src/test/ui/imports/issue-38293.stderr @@ -0,0 +1,21 @@ +error[E0432]: unresolved import `foo::f` + --> $DIR/issue-38293.rs:6:14 + | +LL | use foo::f::{self}; + | ^^^^ no `f` in `foo` + +error[E0423]: expected function, found module `baz` + --> $DIR/issue-38293.rs:15:5 + | +LL | baz(); + | ^^^ not a function + | +help: consider importing this function instead + | +LL | use bar::baz; + | + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0423, E0432. +For more information about an error, try `rustc --explain E0423`. diff --git a/src/test/ui/imports/issue-4366-2.rs b/src/test/ui/imports/issue-4366-2.rs new file mode 100644 index 000000000..c777b7502 --- /dev/null +++ b/src/test/ui/imports/issue-4366-2.rs @@ -0,0 +1,26 @@ +// ensures that 'use foo:*' doesn't import non-public item + +use m1::*; + +mod foo { + pub fn foo() {} +} +mod a { + pub mod b { + use foo::foo; + type Bar = isize; + } + pub mod sub { + use a::b::*; + fn sub() -> Bar { 1 } + //~^ ERROR cannot find type `Bar` in this scope + } +} + +mod m1 { + fn foo() {} +} + +fn main() { + foo(); //~ ERROR expected function, found module `foo` +} diff --git a/src/test/ui/imports/issue-4366-2.stderr b/src/test/ui/imports/issue-4366-2.stderr new file mode 100644 index 000000000..4c94634ee --- /dev/null +++ b/src/test/ui/imports/issue-4366-2.stderr @@ -0,0 +1,27 @@ +error[E0412]: cannot find type `Bar` in this scope + --> $DIR/issue-4366-2.rs:15:21 + | +LL | fn sub() -> Bar { 1 } + | ^^^ not found in this scope + | +note: type alias `a::b::Bar` exists but is inaccessible + --> $DIR/issue-4366-2.rs:11:9 + | +LL | type Bar = isize; + | ^^^^^^^^^^^^^^^^^ not accessible + +error[E0423]: expected function, found module `foo` + --> $DIR/issue-4366-2.rs:25:5 + | +LL | foo(); + | ^^^ not a function + | +help: consider importing this function instead + | +LL | use foo::foo; + | + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0412, E0423. +For more information about an error, try `rustc --explain E0412`. diff --git a/src/test/ui/imports/issue-4366.rs b/src/test/ui/imports/issue-4366.rs new file mode 100644 index 000000000..9ec2e58ec --- /dev/null +++ b/src/test/ui/imports/issue-4366.rs @@ -0,0 +1,26 @@ +// regression test for issue 4366 + +// ensures that 'use foo:*' doesn't import non-public 'use' statements in the +// module 'foo' + +use m1::*; + +mod foo { + pub fn foo() {} +} +mod a { + pub mod b { + use foo::foo; + type Bar = isize; + } + pub mod sub { + use a::b::*; + fn sub() -> isize { foo(); 1 } //~ ERROR cannot find function `foo` in this scope + } +} + +mod m1 { + fn foo() {} +} + +fn main() {} diff --git a/src/test/ui/imports/issue-4366.stderr b/src/test/ui/imports/issue-4366.stderr new file mode 100644 index 000000000..469ea93e9 --- /dev/null +++ b/src/test/ui/imports/issue-4366.stderr @@ -0,0 +1,14 @@ +error[E0425]: cannot find function `foo` in this scope + --> $DIR/issue-4366.rs:18:29 + | +LL | fn sub() -> isize { foo(); 1 } + | ^^^ not found in this scope + | +help: consider importing this function + | +LL | use foo::foo; + | + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.fixed b/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.fixed new file mode 100644 index 000000000..b463848ae --- /dev/null +++ b/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.fixed @@ -0,0 +1,5 @@ +// run-rustfix + +extern crate std as other_std; +fn main() {} +//~^^ ERROR the name `std` is defined multiple times [E0259] diff --git a/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.rs b/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.rs new file mode 100644 index 000000000..1b491ac7e --- /dev/null +++ b/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.rs @@ -0,0 +1,5 @@ +// run-rustfix + +extern crate std; +fn main() {} +//~^^ ERROR the name `std` is defined multiple times [E0259] diff --git a/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.stderr b/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.stderr new file mode 100644 index 000000000..25aca4cb7 --- /dev/null +++ b/src/test/ui/imports/issue-45799-bad-extern-crate-rename-suggestion-formatting.stderr @@ -0,0 +1,15 @@ +error[E0259]: the name `std` is defined multiple times + --> $DIR/issue-45799-bad-extern-crate-rename-suggestion-formatting.rs:3:1 + | +LL | extern crate std; + | ^^^^^^^^^^^^^^^^^ `std` reimported here + | + = note: `std` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | extern crate std as other_std; + | + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0259`. diff --git a/src/test/ui/imports/issue-45829/auxiliary/issue-45829-a.rs b/src/test/ui/imports/issue-45829/auxiliary/issue-45829-a.rs new file mode 100644 index 000000000..e9f7fefb6 --- /dev/null +++ b/src/test/ui/imports/issue-45829/auxiliary/issue-45829-a.rs @@ -0,0 +1 @@ +pub const FOO: usize = *&0; diff --git a/src/test/ui/imports/issue-45829/auxiliary/issue-45829-b.rs b/src/test/ui/imports/issue-45829/auxiliary/issue-45829-b.rs new file mode 100644 index 000000000..e9f7fefb6 --- /dev/null +++ b/src/test/ui/imports/issue-45829/auxiliary/issue-45829-b.rs @@ -0,0 +1 @@ +pub const FOO: usize = *&0; diff --git a/src/test/ui/imports/issue-45829/import-self.rs b/src/test/ui/imports/issue-45829/import-self.rs new file mode 100644 index 000000000..2dc4331ce --- /dev/null +++ b/src/test/ui/imports/issue-45829/import-self.rs @@ -0,0 +1,19 @@ +mod foo { + pub struct A; + pub struct B; +} + +use foo::{self}; +//~^ ERROR is defined multiple times + +use foo as self; +//~^ ERROR expected identifier + +use foo::self; //~ ERROR is defined multiple times +//~^ ERROR `self` imports are only allowed within a { } list + +use foo::A; +use foo::{self as A}; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/import-self.stderr b/src/test/ui/imports/issue-45829/import-self.stderr new file mode 100644 index 000000000..0c9424f30 --- /dev/null +++ b/src/test/ui/imports/issue-45829/import-self.stderr @@ -0,0 +1,70 @@ +error: expected identifier, found keyword `self` + --> $DIR/import-self.rs:9:12 + | +LL | use foo as self; + | ^^^^ expected identifier, found keyword + +error[E0429]: `self` imports are only allowed within a { } list + --> $DIR/import-self.rs:12:8 + | +LL | use foo::self; + | ^^^^^^ + | +help: consider importing the module directly + | +LL - use foo::self; +LL + use foo; + | +help: alternatively, use the multi-path `use` syntax to import `self` + | +LL | use foo::{self}; + | + + + +error[E0255]: the name `foo` is defined multiple times + --> $DIR/import-self.rs:6:11 + | +LL | mod foo { + | ------- previous definition of the module `foo` here +... +LL | use foo::{self}; + | ^^^^ `foo` reimported here + | + = note: `foo` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use foo::{self as other_foo}; + | ~~~~~~~~~~~~~~~~~ + +error[E0255]: the name `foo` is defined multiple times + --> $DIR/import-self.rs:12:5 + | +LL | mod foo { + | ------- previous definition of the module `foo` here +... +LL | use foo::self; + | ^^^^^^^^^ `foo` reimported here + | + = note: `foo` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use foo as other_foo; + | ~~~~~~~~~~~~~~~~ + +error[E0252]: the name `A` is defined multiple times + --> $DIR/import-self.rs:16:11 + | +LL | use foo::A; + | ------ previous import of the type `A` here +LL | use foo::{self as A}; + | ^^^^^^^^^ `A` reimported here + | + = note: `A` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use foo::{self as OtherA}; + | ~~~~~~~~~~~~~~ + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0252, E0255, E0429. +For more information about an error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-45829/import-twice.rs b/src/test/ui/imports/issue-45829/import-twice.rs new file mode 100644 index 000000000..e5a8bb7ad --- /dev/null +++ b/src/test/ui/imports/issue-45829/import-twice.rs @@ -0,0 +1,9 @@ +mod foo { + pub struct A; + pub struct B; +} + +use foo::{A, A}; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/import-twice.stderr b/src/test/ui/imports/issue-45829/import-twice.stderr new file mode 100644 index 000000000..656b011bc --- /dev/null +++ b/src/test/ui/imports/issue-45829/import-twice.stderr @@ -0,0 +1,13 @@ +error[E0252]: the name `A` is defined multiple times + --> $DIR/import-twice.rs:6:14 + | +LL | use foo::{A, A}; + | - ^ `A` reimported here + | | + | previous import of the type `A` here + | + = note: `A` must be defined only once in the type namespace of this module + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-45829/issue-45829.rs b/src/test/ui/imports/issue-45829/issue-45829.rs new file mode 100644 index 000000000..1e76e4b14 --- /dev/null +++ b/src/test/ui/imports/issue-45829/issue-45829.rs @@ -0,0 +1,9 @@ +mod foo { + pub struct A; + pub struct B; +} + +use foo::{A, B as A}; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/issue-45829.stderr b/src/test/ui/imports/issue-45829/issue-45829.stderr new file mode 100644 index 000000000..e9a9d47ce --- /dev/null +++ b/src/test/ui/imports/issue-45829/issue-45829.stderr @@ -0,0 +1,17 @@ +error[E0252]: the name `A` is defined multiple times + --> $DIR/issue-45829.rs:6:14 + | +LL | use foo::{A, B as A}; + | - ^^^^^^ `A` reimported here + | | + | previous import of the type `A` here + | + = note: `A` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use foo::{A, B as OtherA}; + | ~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-45829/rename-extern-vs-use.rs b/src/test/ui/imports/issue-45829/rename-extern-vs-use.rs new file mode 100644 index 000000000..aef7aa35c --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-extern-vs-use.rs @@ -0,0 +1,11 @@ +// aux-build:issue-45829-b.rs + +mod foo { + pub mod bar {} +} + +use foo::bar; +extern crate issue_45829_b as bar; +//~^ ERROR the name `bar` is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/rename-extern-vs-use.stderr b/src/test/ui/imports/issue-45829/rename-extern-vs-use.stderr new file mode 100644 index 000000000..98fd8a623 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-extern-vs-use.stderr @@ -0,0 +1,17 @@ +error[E0254]: the name `bar` is defined multiple times + --> $DIR/rename-extern-vs-use.rs:8:1 + | +LL | use foo::bar; + | -------- previous import of the module `bar` here +LL | extern crate issue_45829_b as bar; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `bar` reimported here + | + = note: `bar` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | extern crate issue_45829_b as other_bar; + | + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0254`. diff --git a/src/test/ui/imports/issue-45829/rename-extern-with-tab.rs b/src/test/ui/imports/issue-45829/rename-extern-with-tab.rs new file mode 100644 index 000000000..0da8b826c --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-extern-with-tab.rs @@ -0,0 +1,8 @@ +// aux-build:issue-45829-a.rs +// aux-build:issue-45829-b.rs + +extern crate issue_45829_a; +extern crate issue_45829_b as issue_45829_a; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/rename-extern-with-tab.stderr b/src/test/ui/imports/issue-45829/rename-extern-with-tab.stderr new file mode 100644 index 000000000..2c4e8ce99 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-extern-with-tab.stderr @@ -0,0 +1,17 @@ +error[E0259]: the name `issue_45829_a` is defined multiple times + --> $DIR/rename-extern-with-tab.rs:5:1 + | +LL | extern crate issue_45829_a; + | --------------------------- previous import of the extern crate `issue_45829_a` here +LL | extern crate issue_45829_b as issue_45829_a; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `issue_45829_a` reimported here + | + = note: `issue_45829_a` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | extern crate issue_45829_b as other_issue_45829_a; + | + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0259`. diff --git a/src/test/ui/imports/issue-45829/rename-extern.rs b/src/test/ui/imports/issue-45829/rename-extern.rs new file mode 100644 index 000000000..7dbda6932 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-extern.rs @@ -0,0 +1,8 @@ +// aux-build:issue-45829-a.rs +// aux-build:issue-45829-b.rs + +extern crate issue_45829_a; +extern crate issue_45829_b as issue_45829_a; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/rename-extern.stderr b/src/test/ui/imports/issue-45829/rename-extern.stderr new file mode 100644 index 000000000..209ae2201 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-extern.stderr @@ -0,0 +1,17 @@ +error[E0259]: the name `issue_45829_a` is defined multiple times + --> $DIR/rename-extern.rs:5:1 + | +LL | extern crate issue_45829_a; + | --------------------------- previous import of the extern crate `issue_45829_a` here +LL | extern crate issue_45829_b as issue_45829_a; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `issue_45829_a` reimported here + | + = note: `issue_45829_a` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | extern crate issue_45829_b as other_issue_45829_a; + | + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0259`. diff --git a/src/test/ui/imports/issue-45829/rename-use-vs-extern.rs b/src/test/ui/imports/issue-45829/rename-use-vs-extern.rs new file mode 100644 index 000000000..0cf3a77fd --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-use-vs-extern.rs @@ -0,0 +1,7 @@ +// aux-build:issue-45829-b.rs + +extern crate issue_45829_b; +use std as issue_45829_b; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/rename-use-vs-extern.stderr b/src/test/ui/imports/issue-45829/rename-use-vs-extern.stderr new file mode 100644 index 000000000..dfb5810c4 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-use-vs-extern.stderr @@ -0,0 +1,17 @@ +error[E0254]: the name `issue_45829_b` is defined multiple times + --> $DIR/rename-use-vs-extern.rs:4:5 + | +LL | extern crate issue_45829_b; + | --------------------------- previous import of the extern crate `issue_45829_b` here +LL | use std as issue_45829_b; + | ^^^^^^^^^^^^^^^^^^^^ `issue_45829_b` reimported here + | + = note: `issue_45829_b` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std as other_issue_45829_b; + | ~~~~~~~~~~~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0254`. diff --git a/src/test/ui/imports/issue-45829/rename-use-with-tabs.rs b/src/test/ui/imports/issue-45829/rename-use-with-tabs.rs new file mode 100644 index 000000000..86c5fa00f --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-use-with-tabs.rs @@ -0,0 +1,12 @@ +mod foo { + pub struct A; + + pub mod bar { + pub struct B; + } +} + +use foo::{A, bar::B as A}; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/rename-use-with-tabs.stderr b/src/test/ui/imports/issue-45829/rename-use-with-tabs.stderr new file mode 100644 index 000000000..5a63af588 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-use-with-tabs.stderr @@ -0,0 +1,17 @@ +error[E0252]: the name `A` is defined multiple times + --> $DIR/rename-use-with-tabs.rs:9:14 + | +LL | use foo::{A, bar::B as A}; + | - ^^^^^^^^^^^^^^^^^ `A` reimported here + | | + | previous import of the type `A` here + | + = note: `A` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use foo::{A, bar::B as OtherA}; + | ~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-45829/rename-with-path.rs b/src/test/ui/imports/issue-45829/rename-with-path.rs new file mode 100644 index 000000000..e278a8789 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-with-path.rs @@ -0,0 +1,4 @@ +use std::{collections::HashMap as A, sync::Arc as A}; +//~^ ERROR is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-45829/rename-with-path.stderr b/src/test/ui/imports/issue-45829/rename-with-path.stderr new file mode 100644 index 000000000..2d26b0838 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename-with-path.stderr @@ -0,0 +1,17 @@ +error[E0252]: the name `A` is defined multiple times + --> $DIR/rename-with-path.rs:1:38 + | +LL | use std::{collections::HashMap as A, sync::Arc as A}; + | ------------------------- ^^^^^^^^^^^^^^ `A` reimported here + | | + | previous import of the type `A` here + | + = note: `A` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std::{collections::HashMap as A, sync::Arc as OtherA}; + | ~~~~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-45829/rename.rs b/src/test/ui/imports/issue-45829/rename.rs new file mode 100644 index 000000000..1c45956c6 --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename.rs @@ -0,0 +1,7 @@ +use core; +use std as core; +//~^ ERROR is defined multiple times + +fn main() { + 1 + 1; +} diff --git a/src/test/ui/imports/issue-45829/rename.stderr b/src/test/ui/imports/issue-45829/rename.stderr new file mode 100644 index 000000000..ed185ae2a --- /dev/null +++ b/src/test/ui/imports/issue-45829/rename.stderr @@ -0,0 +1,17 @@ +error[E0252]: the name `core` is defined multiple times + --> $DIR/rename.rs:2:5 + | +LL | use core; + | ---- previous import of the module `core` here +LL | use std as core; + | ^^^^^^^^^^^ `core` reimported here + | + = note: `core` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use std as other_core; + | ~~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-47623.rs b/src/test/ui/imports/issue-47623.rs new file mode 100644 index 000000000..ad8aa4c1a --- /dev/null +++ b/src/test/ui/imports/issue-47623.rs @@ -0,0 +1,3 @@ +use self; //~ERROR `self` imports are only allowed within a { } list + +fn main() {} diff --git a/src/test/ui/imports/issue-47623.stderr b/src/test/ui/imports/issue-47623.stderr new file mode 100644 index 000000000..53968a296 --- /dev/null +++ b/src/test/ui/imports/issue-47623.stderr @@ -0,0 +1,9 @@ +error[E0429]: `self` imports are only allowed within a { } list + --> $DIR/issue-47623.rs:1:5 + | +LL | use self; + | ^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0429`. diff --git a/src/test/ui/imports/issue-4865-1.rs b/src/test/ui/imports/issue-4865-1.rs new file mode 100644 index 000000000..68fbee37d --- /dev/null +++ b/src/test/ui/imports/issue-4865-1.rs @@ -0,0 +1,33 @@ +// run-pass +#![allow(unused_imports)] +// This should resolve fine. +// Prior to fix, the crossed imports between a and b +// would block on the glob import, itself never being resolved +// because these previous imports were not resolved. + +pub mod a { + use b::fn_b; + use c::*; + + pub fn fn_a(){ + } +} + +pub mod b { + use a::fn_a; + use c::*; + + pub fn fn_b(){ + } +} + +pub mod c{ + pub fn fn_c(){ + } +} + +use a::fn_a; +use b::fn_b; + +fn main() { +} diff --git a/src/test/ui/imports/issue-4865-2.rs b/src/test/ui/imports/issue-4865-2.rs new file mode 100644 index 000000000..cbe1d0d32 --- /dev/null +++ b/src/test/ui/imports/issue-4865-2.rs @@ -0,0 +1,24 @@ +// run-pass +// Previously, this would have failed to resolve due to the circular +// block between `use say` and `pub use hello::*`. +// +// Now, as `use say` is not `pub`, the glob import can resolve +// without any problem and this resolves fine. + +pub use hello::*; + +pub mod say { + pub fn hello() { println!("hello"); } +} + +pub mod hello { + use say; + + pub fn hello() { + say::hello(); + } +} + +fn main() { + hello(); +} diff --git a/src/test/ui/imports/issue-4865-3.rs b/src/test/ui/imports/issue-4865-3.rs new file mode 100644 index 000000000..12f9bba18 --- /dev/null +++ b/src/test/ui/imports/issue-4865-3.rs @@ -0,0 +1,17 @@ +// run-pass +#![allow(unused_imports)] +// This should resolve fine even with the circular imports as +// they are not `pub`. + +pub mod a { + use b::*; +} + +pub mod b { + use a::*; +} + +use a::*; + +fn main() { +} diff --git a/src/test/ui/imports/issue-52891.fixed b/src/test/ui/imports/issue-52891.fixed new file mode 100644 index 000000000..e694b5c9b --- /dev/null +++ b/src/test/ui/imports/issue-52891.fixed @@ -0,0 +1,37 @@ +// aux-build:issue-52891.rs +// run-rustfix + +#![allow(warnings)] + +extern crate issue_52891; + +// Check that we don't suggest renaming duplicate imports but instead +// suggest removing one. + +use issue_52891::a; + //~ ERROR `a` is defined multiple times + +use issue_52891::{b, c}; //~ ERROR `a` is defined multiple times +use issue_52891::{d, e}; //~ ERROR `a` is defined multiple times +use issue_52891::{f, g}; //~ ERROR `a` is defined multiple times + +use issue_52891::{//~ ERROR `a` is defined multiple times + h, + i}; +use issue_52891::{j, + //~ ERROR `a` is defined multiple times + k}; +use issue_52891::{l, + m}; //~ ERROR `a` is defined multiple times + +use issue_52891::a::inner; +use issue_52891::b::inner as other_inner; //~ ERROR `inner` is defined multiple times + + +//~^ ERROR `issue_52891` is defined multiple times + + +#[macro_use] +use issue_52891::n; //~ ERROR `n` is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-52891.rs b/src/test/ui/imports/issue-52891.rs new file mode 100644 index 000000000..cd4b40629 --- /dev/null +++ b/src/test/ui/imports/issue-52891.rs @@ -0,0 +1,38 @@ +// aux-build:issue-52891.rs +// run-rustfix + +#![allow(warnings)] + +extern crate issue_52891; + +// Check that we don't suggest renaming duplicate imports but instead +// suggest removing one. + +use issue_52891::a; +use issue_52891::a; //~ ERROR `a` is defined multiple times + +use issue_52891::{a, b, c}; //~ ERROR `a` is defined multiple times +use issue_52891::{d, a, e}; //~ ERROR `a` is defined multiple times +use issue_52891::{f, g, a}; //~ ERROR `a` is defined multiple times + +use issue_52891::{a, //~ ERROR `a` is defined multiple times + h, + i}; +use issue_52891::{j, + a, //~ ERROR `a` is defined multiple times + k}; +use issue_52891::{l, + m, + a}; //~ ERROR `a` is defined multiple times + +use issue_52891::a::inner; +use issue_52891::b::inner; //~ ERROR `inner` is defined multiple times + +use issue_52891::{self}; +//~^ ERROR `issue_52891` is defined multiple times + +use issue_52891::n; +#[macro_use] +use issue_52891::n; //~ ERROR `n` is defined multiple times + +fn main() {} diff --git a/src/test/ui/imports/issue-52891.stderr b/src/test/ui/imports/issue-52891.stderr new file mode 100644 index 000000000..7bb1301ed --- /dev/null +++ b/src/test/ui/imports/issue-52891.stderr @@ -0,0 +1,131 @@ +error[E0252]: the name `a` is defined multiple times + --> $DIR/issue-52891.rs:12:5 + | +LL | use issue_52891::a; + | -------------- previous import of the module `a` here +LL | use issue_52891::a; + | ^^^^^^^^^^^^^^ `a` reimported here + | + = note: `a` must be defined only once in the type namespace of this module + +error[E0252]: the name `a` is defined multiple times + --> $DIR/issue-52891.rs:14:19 + | +LL | use issue_52891::a; + | -------------- previous import of the module `a` here +... +LL | use issue_52891::{a, b, c}; + | ^-- + | | + | `a` reimported here + | help: remove unnecessary import + | + = note: `a` must be defined only once in the type namespace of this module + +error[E0252]: the name `a` is defined multiple times + --> $DIR/issue-52891.rs:15:22 + | +LL | use issue_52891::a; + | -------------- previous import of the module `a` here +... +LL | use issue_52891::{d, a, e}; + | ^-- + | | + | `a` reimported here + | help: remove unnecessary import + | + = note: `a` must be defined only once in the type namespace of this module + +error[E0252]: the name `a` is defined multiple times + --> $DIR/issue-52891.rs:16:25 + | +LL | use issue_52891::a; + | -------------- previous import of the module `a` here +... +LL | use issue_52891::{f, g, a}; + | ^ `a` reimported here + | + = note: `a` must be defined only once in the type namespace of this module + +error[E0252]: the name `a` is defined multiple times + --> $DIR/issue-52891.rs:18:19 + | +LL | use issue_52891::a; + | -------------- previous import of the module `a` here +... +LL | use issue_52891::{a, + | ^-- + | | + | `a` reimported here + | help: remove unnecessary import + | + = note: `a` must be defined only once in the type namespace of this module + +error[E0252]: the name `a` is defined multiple times + --> $DIR/issue-52891.rs:22:5 + | +LL | use issue_52891::a; + | -------------- previous import of the module `a` here +... +LL | a, + | ^-- + | | + | `a` reimported here + | help: remove unnecessary import + | + = note: `a` must be defined only once in the type namespace of this module + +error[E0252]: the name `a` is defined multiple times + --> $DIR/issue-52891.rs:26:5 + | +LL | use issue_52891::a; + | -------------- previous import of the module `a` here +... +LL | a}; + | ^ `a` reimported here + | + = note: `a` must be defined only once in the type namespace of this module + +error[E0252]: the name `inner` is defined multiple times + --> $DIR/issue-52891.rs:29:5 + | +LL | use issue_52891::a::inner; + | --------------------- previous import of the module `inner` here +LL | use issue_52891::b::inner; + | ^^^^^^^^^^^^^^^^^^^^^ `inner` reimported here + | + = note: `inner` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use issue_52891::b::inner as other_inner; + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +error[E0254]: the name `issue_52891` is defined multiple times + --> $DIR/issue-52891.rs:31:19 + | +LL | extern crate issue_52891; + | ------------------------- previous import of the extern crate `issue_52891` here +... +LL | use issue_52891::{self}; + | ------------------^^^^-- + | | | + | | `issue_52891` reimported here + | help: remove unnecessary import + | + = note: `issue_52891` must be defined only once in the type namespace of this module + +error[E0252]: the name `n` is defined multiple times + --> $DIR/issue-52891.rs:36:5 + | +LL | use issue_52891::n; + | -------------- previous import of the module `n` here +LL | #[macro_use] +LL | use issue_52891::n; + | ^^^^^^^^^^^^^^ `n` reimported here + | + = note: `n` must be defined only once in the type namespace of this module + +error: aborting due to 10 previous errors + +Some errors have detailed explanations: E0252, E0254. +For more information about an error, try `rustc --explain E0252`. diff --git a/src/test/ui/imports/issue-53140.rs b/src/test/ui/imports/issue-53140.rs new file mode 100644 index 000000000..7b4cc1768 --- /dev/null +++ b/src/test/ui/imports/issue-53140.rs @@ -0,0 +1,11 @@ +// check-pass + +mod m { + pub struct S(u8); + + use S as Z; +} + +use m::*; + +fn main() {} diff --git a/src/test/ui/imports/issue-53269.rs b/src/test/ui/imports/issue-53269.rs new file mode 100644 index 000000000..1031d5071 --- /dev/null +++ b/src/test/ui/imports/issue-53269.rs @@ -0,0 +1,11 @@ +// Ambiguity between a `macro_rules` macro and a non-existent import recovered as `Res::Err` + +macro_rules! mac { () => () } + +mod m { + use nonexistent_module::mac; //~ ERROR unresolved import `nonexistent_module` + + mac!(); //~ ERROR `mac` is ambiguous +} + +fn main() {} diff --git a/src/test/ui/imports/issue-53269.stderr b/src/test/ui/imports/issue-53269.stderr new file mode 100644 index 000000000..29c7556da --- /dev/null +++ b/src/test/ui/imports/issue-53269.stderr @@ -0,0 +1,31 @@ +error[E0432]: unresolved import `nonexistent_module` + --> $DIR/issue-53269.rs:6:9 + | +LL | use nonexistent_module::mac; + | ^^^^^^^^^^^^^^^^^^ maybe a missing crate `nonexistent_module`? + | + = help: consider adding `extern crate nonexistent_module` to use the `nonexistent_module` crate + +error[E0659]: `mac` is ambiguous + --> $DIR/issue-53269.rs:8:5 + | +LL | mac!(); + | ^^^ ambiguous name + | + = note: ambiguous because of a conflict between a `macro_rules` name and a non-`macro_rules` name from another module +note: `mac` could refer to the macro defined here + --> $DIR/issue-53269.rs:3:1 + | +LL | macro_rules! mac { () => () } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +note: `mac` could also refer to the unresolved item imported here + --> $DIR/issue-53269.rs:6:9 + | +LL | use nonexistent_module::mac; + | ^^^^^^^^^^^^^^^^^^^^^^^ + = help: use `self::mac` to refer to this unresolved item unambiguously + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0432, E0659. +For more information about an error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-53512.rs b/src/test/ui/imports/issue-53512.rs new file mode 100644 index 000000000..67470f854 --- /dev/null +++ b/src/test/ui/imports/issue-53512.rs @@ -0,0 +1,8 @@ +// Macro from prelude is shadowed by non-existent import recovered as `Res::Err`. + +mod m {} +use m::assert; //~ ERROR unresolved import `m::assert` + +fn main() { + assert!(true); +} diff --git a/src/test/ui/imports/issue-53512.stderr b/src/test/ui/imports/issue-53512.stderr new file mode 100644 index 000000000..05fe111b3 --- /dev/null +++ b/src/test/ui/imports/issue-53512.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `m::assert` + --> $DIR/issue-53512.rs:4:5 + | +LL | use m::assert; + | ^^^^^^^^^ no `assert` in `m` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-53565.rs b/src/test/ui/imports/issue-53565.rs new file mode 100644 index 000000000..114a53a92 --- /dev/null +++ b/src/test/ui/imports/issue-53565.rs @@ -0,0 +1,7 @@ +use std::time::{foo, bar, buzz}; +//~^ ERROR unresolved imports +use std::time::{abc, def}; +//~^ ERROR unresolved imports +fn main(){ + println!("Hello World!"); +} diff --git a/src/test/ui/imports/issue-53565.stderr b/src/test/ui/imports/issue-53565.stderr new file mode 100644 index 000000000..71c3b2aaa --- /dev/null +++ b/src/test/ui/imports/issue-53565.stderr @@ -0,0 +1,20 @@ +error[E0432]: unresolved imports `std::time::foo`, `std::time::bar`, `std::time::buzz` + --> $DIR/issue-53565.rs:1:17 + | +LL | use std::time::{foo, bar, buzz}; + | ^^^ ^^^ ^^^^ no `buzz` in `time` + | | | + | | no `bar` in `time` + | no `foo` in `time` + +error[E0432]: unresolved imports `std::time::abc`, `std::time::def` + --> $DIR/issue-53565.rs:3:17 + | +LL | use std::time::{abc, def}; + | ^^^ ^^^ no `def` in `time` + | | + | no `abc` in `time` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-55457.rs b/src/test/ui/imports/issue-55457.rs new file mode 100644 index 000000000..c1f048897 --- /dev/null +++ b/src/test/ui/imports/issue-55457.rs @@ -0,0 +1,10 @@ +use NonExistent; //~ ERROR unresolved import `NonExistent` +use non_existent::non_existent; //~ ERROR unresolved import `non_existent` + +#[non_existent] //~ ERROR cannot determine resolution for the attribute macro `non_existent` +#[derive(NonExistent)] //~ ERROR cannot determine resolution for the derive macro `NonExistent` + //~| ERROR cannot determine resolution for the derive macro `NonExistent` + //~| ERROR cannot determine resolution for the derive macro `NonExistent` +struct S; + +fn main() {} diff --git a/src/test/ui/imports/issue-55457.stderr b/src/test/ui/imports/issue-55457.stderr new file mode 100644 index 000000000..788fcc830 --- /dev/null +++ b/src/test/ui/imports/issue-55457.stderr @@ -0,0 +1,52 @@ +error[E0432]: unresolved import `NonExistent` + --> $DIR/issue-55457.rs:1:5 + | +LL | use NonExistent; + | ^^^^^^^^^^^ + | | + | no `NonExistent` in the root + | help: a similar name exists in the module: `non_existent` + +error[E0432]: unresolved import `non_existent` + --> $DIR/issue-55457.rs:2:5 + | +LL | use non_existent::non_existent; + | ^^^^^^^^^^^^ maybe a missing crate `non_existent`? + | + = help: consider adding `extern crate non_existent` to use the `non_existent` crate + +error: cannot determine resolution for the derive macro `NonExistent` + --> $DIR/issue-55457.rs:5:10 + | +LL | #[derive(NonExistent)] + | ^^^^^^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: cannot determine resolution for the attribute macro `non_existent` + --> $DIR/issue-55457.rs:4:3 + | +LL | #[non_existent] + | ^^^^^^^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: cannot determine resolution for the derive macro `NonExistent` + --> $DIR/issue-55457.rs:5:10 + | +LL | #[derive(NonExistent)] + | ^^^^^^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: cannot determine resolution for the derive macro `NonExistent` + --> $DIR/issue-55457.rs:5:10 + | +LL | #[derive(NonExistent)] + | ^^^^^^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: aborting due to 6 previous errors + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-55811.rs b/src/test/ui/imports/issue-55811.rs new file mode 100644 index 000000000..2df328cca --- /dev/null +++ b/src/test/ui/imports/issue-55811.rs @@ -0,0 +1,6 @@ +// check-pass +// aux-build:issue-55811.rs + +extern crate issue_55811; + +fn main() {} diff --git a/src/test/ui/imports/issue-55884-1.rs b/src/test/ui/imports/issue-55884-1.rs new file mode 100644 index 000000000..21744aa5d --- /dev/null +++ b/src/test/ui/imports/issue-55884-1.rs @@ -0,0 +1,21 @@ +mod m { + mod m1 { + pub struct S {} + } + mod m2 { + // Note this derive, it makes this struct macro-expanded, + // so it doesn't appear in time to participate in the initial resolution of `use m::S`, + // only in the later validation pass. + #[derive(Default)] + pub struct S {} + } + + // Create a glob vs glob ambiguity + pub use self::m1::*; + pub use self::m2::*; +} + +fn main() { + use m::S; //~ ERROR `S` is ambiguous + let s = S {}; +} diff --git a/src/test/ui/imports/issue-55884-1.stderr b/src/test/ui/imports/issue-55884-1.stderr new file mode 100644 index 000000000..c38166dde --- /dev/null +++ b/src/test/ui/imports/issue-55884-1.stderr @@ -0,0 +1,23 @@ +error[E0659]: `S` is ambiguous + --> $DIR/issue-55884-1.rs:19:12 + | +LL | use m::S; + | ^ ambiguous name + | + = note: ambiguous because of multiple glob imports of a name in the same module +note: `S` could refer to the struct imported here + --> $DIR/issue-55884-1.rs:14:13 + | +LL | pub use self::m1::*; + | ^^^^^^^^^^^ + = help: consider adding an explicit import of `S` to disambiguate +note: `S` could also refer to the struct imported here + --> $DIR/issue-55884-1.rs:15:13 + | +LL | pub use self::m2::*; + | ^^^^^^^^^^^ + = help: consider adding an explicit import of `S` to disambiguate + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/issue-55884-2.rs b/src/test/ui/imports/issue-55884-2.rs new file mode 100644 index 000000000..75bb4206f --- /dev/null +++ b/src/test/ui/imports/issue-55884-2.rs @@ -0,0 +1,14 @@ +mod options { + pub struct ParseOptions {} +} + +mod parser { + pub use options::*; + // Private single import shadows public glob import, but arrives too late for initial + // resolution of `use parser::ParseOptions` because it depends on that resolution itself. + use ParseOptions; +} + +pub use parser::ParseOptions; //~ ERROR struct import `ParseOptions` is private + +fn main() {} diff --git a/src/test/ui/imports/issue-55884-2.stderr b/src/test/ui/imports/issue-55884-2.stderr new file mode 100644 index 000000000..5adbc4b66 --- /dev/null +++ b/src/test/ui/imports/issue-55884-2.stderr @@ -0,0 +1,30 @@ +error[E0603]: struct import `ParseOptions` is private + --> $DIR/issue-55884-2.rs:12:17 + | +LL | pub use parser::ParseOptions; + | ^^^^^^^^^^^^ private struct import + | +note: the struct import `ParseOptions` is defined here... + --> $DIR/issue-55884-2.rs:9:9 + | +LL | use ParseOptions; + | ^^^^^^^^^^^^ +note: ...and refers to the struct import `ParseOptions` which is defined here... + --> $DIR/issue-55884-2.rs:12:9 + | +LL | pub use parser::ParseOptions; + | ^^^^^^^^^^^^^^^^^^^^ consider importing it directly +note: ...and refers to the struct import `ParseOptions` which is defined here... + --> $DIR/issue-55884-2.rs:6:13 + | +LL | pub use options::*; + | ^^^^^^^^^^ consider importing it directly +note: ...and refers to the struct `ParseOptions` which is defined here + --> $DIR/issue-55884-2.rs:2:5 + | +LL | pub struct ParseOptions {} + | ^^^^^^^^^^^^^^^^^^^^^^^ consider importing it directly + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0603`. diff --git a/src/test/ui/imports/issue-56125.rs b/src/test/ui/imports/issue-56125.rs new file mode 100644 index 000000000..ec5747b4b --- /dev/null +++ b/src/test/ui/imports/issue-56125.rs @@ -0,0 +1,21 @@ +// edition:2018 +// compile-flags:--extern issue_56125 +// aux-build:issue-56125.rs + +mod m1 { + use issue_56125::last_segment::*; + //~^ ERROR `issue_56125` is ambiguous +} + +mod m2 { + use issue_56125::non_last_segment::non_last_segment::*; + //~^ ERROR `issue_56125` is ambiguous +} + +mod m3 { + mod empty {} + use empty::issue_56125; //~ ERROR unresolved import `empty::issue_56125` + use issue_56125::*; //~ ERROR `issue_56125` is ambiguous +} + +fn main() {} diff --git a/src/test/ui/imports/issue-56125.stderr b/src/test/ui/imports/issue-56125.stderr new file mode 100644 index 000000000..2e4ba8623 --- /dev/null +++ b/src/test/ui/imports/issue-56125.stderr @@ -0,0 +1,58 @@ +error[E0432]: unresolved import `empty::issue_56125` + --> $DIR/issue-56125.rs:17:9 + | +LL | use empty::issue_56125; + | ^^^^^^^^^^^^^^^^^^ no `issue_56125` in `m3::empty` + +error[E0659]: `issue_56125` is ambiguous + --> $DIR/issue-56125.rs:6:9 + | +LL | use issue_56125::last_segment::*; + | ^^^^^^^^^^^ ambiguous name + | + = note: ambiguous because of multiple potential import sources + = note: `issue_56125` could refer to a crate passed with `--extern` + = help: use `::issue_56125` to refer to this crate unambiguously +note: `issue_56125` could also refer to the module imported here + --> $DIR/issue-56125.rs:6:9 + | +LL | use issue_56125::last_segment::*; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: use `self::issue_56125` to refer to this module unambiguously + +error[E0659]: `issue_56125` is ambiguous + --> $DIR/issue-56125.rs:11:9 + | +LL | use issue_56125::non_last_segment::non_last_segment::*; + | ^^^^^^^^^^^ ambiguous name + | + = note: ambiguous because of multiple potential import sources + = note: `issue_56125` could refer to a crate passed with `--extern` + = help: use `::issue_56125` to refer to this crate unambiguously +note: `issue_56125` could also refer to the module imported here + --> $DIR/issue-56125.rs:11:9 + | +LL | use issue_56125::non_last_segment::non_last_segment::*; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: use `self::issue_56125` to refer to this module unambiguously + +error[E0659]: `issue_56125` is ambiguous + --> $DIR/issue-56125.rs:18:9 + | +LL | use issue_56125::*; + | ^^^^^^^^^^^ ambiguous name + | + = note: ambiguous because of multiple potential import sources + = note: `issue_56125` could refer to a crate passed with `--extern` + = help: use `::issue_56125` to refer to this crate unambiguously +note: `issue_56125` could also refer to the module imported here + --> $DIR/issue-56125.rs:18:9 + | +LL | use issue_56125::*; + | ^^^^^^^^^^^^^^ + = help: use `self::issue_56125` to refer to this module unambiguously + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0432, E0659. +For more information about an error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-56263.rs b/src/test/ui/imports/issue-56263.rs new file mode 100644 index 000000000..363781f2d --- /dev/null +++ b/src/test/ui/imports/issue-56263.rs @@ -0,0 +1,8 @@ +// check-pass +// edition:2018 + +use ::std; + +fn main() { + let std = 10; +} diff --git a/src/test/ui/imports/issue-57015.rs b/src/test/ui/imports/issue-57015.rs new file mode 100644 index 000000000..27688fd34 --- /dev/null +++ b/src/test/ui/imports/issue-57015.rs @@ -0,0 +1,13 @@ +mod glob_ok { + pub mod something { + pub mod something_else {} + } +} + +mod single_err {} + +use glob_ok::*; // glob_ok::something +use single_err::something; //~ ERROR unresolved import `single_err::something` +use something::something_else; + +fn main() {} diff --git a/src/test/ui/imports/issue-57015.stderr b/src/test/ui/imports/issue-57015.stderr new file mode 100644 index 000000000..d200d23ab --- /dev/null +++ b/src/test/ui/imports/issue-57015.stderr @@ -0,0 +1,9 @@ +error[E0432]: unresolved import `single_err::something` + --> $DIR/issue-57015.rs:10:5 + | +LL | use single_err::something; + | ^^^^^^^^^^^^^^^^^^^^^ no `something` in `single_err` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-57539.rs b/src/test/ui/imports/issue-57539.rs new file mode 100644 index 000000000..90b74eb46 --- /dev/null +++ b/src/test/ui/imports/issue-57539.rs @@ -0,0 +1,8 @@ +// edition:2018 + +mod core { + use core; //~ ERROR `core` is ambiguous + use crate::*; +} + +fn main() {} diff --git a/src/test/ui/imports/issue-57539.stderr b/src/test/ui/imports/issue-57539.stderr new file mode 100644 index 000000000..1a3ca4eda --- /dev/null +++ b/src/test/ui/imports/issue-57539.stderr @@ -0,0 +1,19 @@ +error[E0659]: `core` is ambiguous + --> $DIR/issue-57539.rs:4:9 + | +LL | use core; + | ^^^^ ambiguous name + | + = note: ambiguous because of multiple potential import sources + = note: `core` could refer to a built-in crate + = help: use `::core` to refer to this crate unambiguously +note: `core` could also refer to the module imported here + --> $DIR/issue-57539.rs:5:9 + | +LL | use crate::*; + | ^^^^^^^^ + = help: use `self::core` to refer to this module unambiguously + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/issue-59764.rs b/src/test/ui/imports/issue-59764.rs new file mode 100644 index 000000000..09dee8c27 --- /dev/null +++ b/src/test/ui/imports/issue-59764.rs @@ -0,0 +1,136 @@ +// aux-build:issue-59764.rs +// compile-flags:--extern issue_59764 +// edition:2018 + +#![allow(warnings)] + +// This tests the suggestion to import macros from the root of a crate. This aims to capture +// the case where a user attempts to import a macro from the definition location instead of the +// root of the crate and the macro is annotated with `#![macro_export]`. + +// Edge cases.. + +mod multiple_imports_same_line_at_end { + use issue_59764::foo::{baz, makro}; + //~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] +} + +mod multiple_imports_multiline_at_end_trailing_comma { + use issue_59764::foo::{ + baz, + makro, //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + }; +} + +mod multiple_imports_multiline_at_end { + use issue_59764::foo::{ + baz, + makro //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + }; +} + +mod multiple_imports_same_line_in_middle { + use issue_59764::foo::{baz, makro, foobar}; + //~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] +} + +mod multiple_imports_multiline_in_middle_trailing_comma { + use issue_59764::foo::{ + baz, + makro, //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + foobar, + }; +} + +mod multiple_imports_multiline_in_middle { + use issue_59764::foo::{ + baz, + makro, //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + foobar + }; +} + +mod nested_imports { + use issue_59764::{foobaz, foo::makro}; + //~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] +} + +mod nested_multiple_imports { + use issue_59764::{foobaz, foo::{baz, makro}}; + //~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] +} + +mod nested_multiline_multiple_imports_trailing_comma { + use issue_59764::{ + foobaz, + foo::{ + baz, + makro, //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + }, + }; +} + +mod nested_multiline_multiple_imports { + use issue_59764::{ + foobaz, + foo::{ + baz, + makro //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + } + }; +} + +mod doubly_nested_multiple_imports { + use issue_59764::{foobaz, foo::{baz, makro, barbaz::{barfoo}}}; + //~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] +} + +mod doubly_multiline_nested_multiple_imports { + use issue_59764::{ + foobaz, + foo::{ + baz, + makro, //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + barbaz::{ + barfoo, + } + } + }; +} + +mod renamed_import { + use issue_59764::foo::makro as baz; + //~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] +} + +mod renamed_multiple_imports { + use issue_59764::foo::{baz, makro as foobar}; + //~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] +} + +mod lots_of_whitespace { + use + issue_59764::{ + + foobaz, + + + foo::{baz, + + makro as foobar} //~ ERROR unresolved import `issue_59764::foo::makro` [E0432] + + }; +} + +// Simple case.. + +use issue_59764::foo::makro; +//~^ ERROR unresolved import `issue_59764::foo::makro` [E0432] + +makro!(bar); +//~^ ERROR cannot determine resolution for the macro `makro` + +fn main() { + bar(); + //~^ ERROR cannot find function `bar` in this scope [E0425] +} diff --git a/src/test/ui/imports/issue-59764.stderr b/src/test/ui/imports/issue-59764.stderr new file mode 100644 index 000000000..b969515e2 --- /dev/null +++ b/src/test/ui/imports/issue-59764.stderr @@ -0,0 +1,246 @@ +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:14:33 + | +LL | use issue_59764::foo::{baz, makro}; + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL - use issue_59764::foo::{baz, makro}; +LL + use issue_59764::{makro, foo::{baz}}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:21:9 + | +LL | makro, + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ use issue_59764::{makro, foo::{ +LL | baz, +LL ~ +LL ~ }}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:28:9 + | +LL | makro + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ use issue_59764::{makro, foo::{ +LL | baz, +LL ~ +LL ~ }}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:33:33 + | +LL | use issue_59764::foo::{baz, makro, foobar}; + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL - use issue_59764::foo::{baz, makro, foobar}; +LL + use issue_59764::{makro, foo::{baz, foobar}}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:40:9 + | +LL | makro, + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ use issue_59764::{makro, foo::{ +LL | baz, +LL ~ +LL | foobar, +LL ~ }}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:48:9 + | +LL | makro, + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ use issue_59764::{makro, foo::{ +LL | baz, +LL ~ +LL | foobar +LL ~ }}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:54:31 + | +LL | use issue_59764::{foobaz, foo::makro}; + | ^^^^^^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL - use issue_59764::{foobaz, foo::makro}; +LL + use issue_59764::{makro, foobaz}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:59:42 + | +LL | use issue_59764::{foobaz, foo::{baz, makro}}; + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL - use issue_59764::{foobaz, foo::{baz, makro}}; +LL + use issue_59764::{makro, foobaz, foo::{baz}}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:68:13 + | +LL | makro, + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ use issue_59764::{makro, +LL | foobaz, +LL | foo::{ +LL | baz, +LL ~ + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:78:13 + | +LL | makro + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ use issue_59764::{makro, +LL | foobaz, +LL | foo::{ +LL | baz, +LL ~ + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:84:42 + | +LL | use issue_59764::{foobaz, foo::{baz, makro, barbaz::{barfoo}}}; + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL - use issue_59764::{foobaz, foo::{baz, makro, barbaz::{barfoo}}}; +LL + use issue_59764::{makro, foobaz, foo::{baz, barbaz::{barfoo}}}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:93:13 + | +LL | makro, + | ^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ use issue_59764::{makro, +LL | foobaz, +LL | foo::{ +LL | baz, +LL ~ + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:102:9 + | +LL | use issue_59764::foo::makro as baz; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL | use issue_59764::makro as baz; + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:107:33 + | +LL | use issue_59764::foo::{baz, makro as foobar}; + | ^^^^^^^^^^^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL - use issue_59764::foo::{baz, makro as foobar}; +LL + use issue_59764::{makro as foobar, foo::{baz}}; + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:120:17 + | +LL | makro as foobar} + | ^^^^^^^^^^^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL ~ issue_59764::{makro as foobar, +LL | + ... +LL | +LL ~ foo::{baz} + | + +error[E0432]: unresolved import `issue_59764::foo::makro` + --> $DIR/issue-59764.rs:127:5 + | +LL | use issue_59764::foo::makro; + | ^^^^^^^^^^^^^^^^^^^^^^^ no `makro` in `foo` + | + = note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined +help: a macro with this name exists at the root of the crate + | +LL | use issue_59764::makro; + | ~~~~~~~~~~~~~~~~~~ + +error: cannot determine resolution for the macro `makro` + --> $DIR/issue-59764.rs:130:1 + | +LL | makro!(bar); + | ^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error[E0425]: cannot find function `bar` in this scope + --> $DIR/issue-59764.rs:134:5 + | +LL | bar(); + | ^^^ not found in this scope + +error: aborting due to 18 previous errors + +Some errors have detailed explanations: E0425, E0432. +For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/imports/issue-62767.rs b/src/test/ui/imports/issue-62767.rs new file mode 100644 index 000000000..01184eea9 --- /dev/null +++ b/src/test/ui/imports/issue-62767.rs @@ -0,0 +1,30 @@ +// check-pass + +// Minimized case from #62767. +mod m { + pub enum Same { + Same, + } +} + +use m::*; + +// The variant `Same` introduced by this import is also considered when resolving the prefix +// `Same::` during import validation to avoid effects similar to time travel (#74556). +use Same::Same; + +// Case from #74556. +mod foo { + pub mod bar { + pub mod bar { + pub fn foobar() {} + } + } +} + +use foo::*; +use bar::bar; + +use bar::foobar; + +fn main() {} diff --git a/src/test/ui/imports/issue-68103.rs b/src/test/ui/imports/issue-68103.rs new file mode 100644 index 000000000..e775678fc --- /dev/null +++ b/src/test/ui/imports/issue-68103.rs @@ -0,0 +1,6 @@ +// check-pass + +pub extern crate self as name; +pub use name::name as bug; + +fn main() {} diff --git a/src/test/ui/imports/issue-8208.rs b/src/test/ui/imports/issue-8208.rs new file mode 100644 index 000000000..1c566938f --- /dev/null +++ b/src/test/ui/imports/issue-8208.rs @@ -0,0 +1,17 @@ +use self::*; //~ ERROR: unresolved import `self::*` [E0432] + //~^ cannot glob-import a module into itself + +mod foo { + use foo::*; //~ ERROR: unresolved import `foo::*` [E0432] + //~^ cannot glob-import a module into itself + + mod bar { + use super::bar::*; + //~^ ERROR: unresolved import `super::bar::*` [E0432] + //~| cannot glob-import a module into itself + } + +} + +fn main() { +} diff --git a/src/test/ui/imports/issue-8208.stderr b/src/test/ui/imports/issue-8208.stderr new file mode 100644 index 000000000..e59aea12c --- /dev/null +++ b/src/test/ui/imports/issue-8208.stderr @@ -0,0 +1,21 @@ +error[E0432]: unresolved import `self::*` + --> $DIR/issue-8208.rs:1:5 + | +LL | use self::*; + | ^^^^^^^ cannot glob-import a module into itself + +error[E0432]: unresolved import `foo::*` + --> $DIR/issue-8208.rs:5:9 + | +LL | use foo::*; + | ^^^^^^ cannot glob-import a module into itself + +error[E0432]: unresolved import `super::bar::*` + --> $DIR/issue-8208.rs:9:13 + | +LL | use super::bar::*; + | ^^^^^^^^^^^^^ cannot glob-import a module into itself + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-8640.rs b/src/test/ui/imports/issue-8640.rs new file mode 100644 index 000000000..51a02a32e --- /dev/null +++ b/src/test/ui/imports/issue-8640.rs @@ -0,0 +1,10 @@ +#[allow(unused_imports)] + +mod foo { + use baz::bar; + mod bar {} + //~^ ERROR the name `bar` is defined multiple times +} +mod baz { pub mod bar {} } + +fn main() {} diff --git a/src/test/ui/imports/issue-8640.stderr b/src/test/ui/imports/issue-8640.stderr new file mode 100644 index 000000000..ab44f067f --- /dev/null +++ b/src/test/ui/imports/issue-8640.stderr @@ -0,0 +1,17 @@ +error[E0255]: the name `bar` is defined multiple times + --> $DIR/issue-8640.rs:5:5 + | +LL | use baz::bar; + | -------- previous import of the module `bar` here +LL | mod bar {} + | ^^^^^^^ `bar` redefined here + | + = note: `bar` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | use baz::bar as other_bar; + | ~~~~~~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0255`. diff --git a/src/test/ui/imports/local-modularized-tricky-fail-1.rs b/src/test/ui/imports/local-modularized-tricky-fail-1.rs new file mode 100644 index 000000000..37fe0ecee --- /dev/null +++ b/src/test/ui/imports/local-modularized-tricky-fail-1.rs @@ -0,0 +1,47 @@ +#![feature(decl_macro)] + +macro_rules! define_exported { () => { + #[macro_export] + macro_rules! exported { + () => () + } +}} +macro_rules! define_panic { () => { + #[macro_export] + macro_rules! panic { + () => () + } +}} +macro_rules! define_include { () => { + #[macro_export] + macro_rules! include { + () => () + } +}} + +use inner1::*; + +mod inner1 { + pub macro exported() {} +} + +exported!(); //~ ERROR `exported` is ambiguous + //~| ERROR `exported` is ambiguous + +mod inner2 { + define_exported!(); +} + +fn main() { + panic!(); //~ ERROR `panic` is ambiguous +} + +mod inner3 { + define_panic!(); +} + +mod inner4 { + define_include!(); +} + +include!(); //~ ERROR `include` is ambiguous diff --git a/src/test/ui/imports/local-modularized-tricky-fail-1.stderr b/src/test/ui/imports/local-modularized-tricky-fail-1.stderr new file mode 100644 index 000000000..c048d2ea2 --- /dev/null +++ b/src/test/ui/imports/local-modularized-tricky-fail-1.stderr @@ -0,0 +1,95 @@ +error[E0659]: `exported` is ambiguous + --> $DIR/local-modularized-tricky-fail-1.rs:28:1 + | +LL | exported!(); + | ^^^^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and a macro-expanded name in the same module during import or macro resolution +note: `exported` could refer to the macro defined here + --> $DIR/local-modularized-tricky-fail-1.rs:5:5 + | +LL | / macro_rules! exported { +LL | | () => () +LL | | } + | |_____^ +... +LL | define_exported!(); + | ------------------ in this macro invocation +note: `exported` could also refer to the macro imported here + --> $DIR/local-modularized-tricky-fail-1.rs:22:5 + | +LL | use inner1::*; + | ^^^^^^^^^ + = help: consider adding an explicit import of `exported` to disambiguate + = note: this error originates in the macro `define_exported` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0659]: `exported` is ambiguous + --> $DIR/local-modularized-tricky-fail-1.rs:28:1 + | +LL | exported!(); + | ^^^^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and a macro-expanded name in the same module during import or macro resolution +note: `exported` could refer to the macro defined here + --> $DIR/local-modularized-tricky-fail-1.rs:5:5 + | +LL | / macro_rules! exported { +LL | | () => () +LL | | } + | |_____^ +... +LL | define_exported!(); + | ------------------ in this macro invocation +note: `exported` could also refer to the macro imported here + --> $DIR/local-modularized-tricky-fail-1.rs:22:5 + | +LL | use inner1::*; + | ^^^^^^^^^ + = help: consider adding an explicit import of `exported` to disambiguate + = note: this error originates in the macro `define_exported` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0659]: `panic` is ambiguous + --> $DIR/local-modularized-tricky-fail-1.rs:36:5 + | +LL | panic!(); + | ^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution + = note: `panic` could refer to a macro from prelude +note: `panic` could also refer to the macro defined here + --> $DIR/local-modularized-tricky-fail-1.rs:11:5 + | +LL | / macro_rules! panic { +LL | | () => () +LL | | } + | |_____^ +... +LL | define_panic!(); + | --------------- in this macro invocation + = help: use `crate::panic` to refer to this macro unambiguously + = note: this error originates in the macro `define_panic` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0659]: `include` is ambiguous + --> $DIR/local-modularized-tricky-fail-1.rs:47:1 + | +LL | include!(); + | ^^^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution + = note: `include` could refer to a macro from prelude +note: `include` could also refer to the macro defined here + --> $DIR/local-modularized-tricky-fail-1.rs:17:5 + | +LL | / macro_rules! include { +LL | | () => () +LL | | } + | |_____^ +... +LL | define_include!(); + | ----------------- in this macro invocation + = help: use `crate::include` to refer to this macro unambiguously + = note: this error originates in the macro `define_include` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/local-modularized-tricky-fail-2.rs b/src/test/ui/imports/local-modularized-tricky-fail-2.rs new file mode 100644 index 000000000..386de88bc --- /dev/null +++ b/src/test/ui/imports/local-modularized-tricky-fail-2.rs @@ -0,0 +1,22 @@ +// Crate-local macro expanded `macro_export` macros cannot be accessed with module-relative paths. + +macro_rules! define_exported { () => { + #[macro_export] + macro_rules! exported { + () => () + } +}} + +define_exported!(); + +mod m { + use exported; + //~^ ERROR macro-expanded `macro_export` macros from the current crate cannot + //~| WARN this was previously accepted +} + +fn main() { + ::exported!(); + //~^ ERROR macro-expanded `macro_export` macros from the current crate cannot + //~| WARN this was previously accepted +} diff --git a/src/test/ui/imports/local-modularized-tricky-fail-2.stderr b/src/test/ui/imports/local-modularized-tricky-fail-2.stderr new file mode 100644 index 000000000..3c20f552f --- /dev/null +++ b/src/test/ui/imports/local-modularized-tricky-fail-2.stderr @@ -0,0 +1,43 @@ +error: macro-expanded `macro_export` macros from the current crate cannot be referred to by absolute paths + --> $DIR/local-modularized-tricky-fail-2.rs:13:9 + | +LL | use exported; + | ^^^^^^^^ + | + = note: `#[deny(macro_expanded_macro_exports_accessed_by_absolute_paths)]` on by default + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #52234 <https://github.com/rust-lang/rust/issues/52234> +note: the macro is defined here + --> $DIR/local-modularized-tricky-fail-2.rs:5:5 + | +LL | / macro_rules! exported { +LL | | () => () +LL | | } + | |_____^ +... +LL | define_exported!(); + | ------------------ in this macro invocation + = note: this error originates in the macro `define_exported` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: macro-expanded `macro_export` macros from the current crate cannot be referred to by absolute paths + --> $DIR/local-modularized-tricky-fail-2.rs:19:5 + | +LL | ::exported!(); + | ^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #52234 <https://github.com/rust-lang/rust/issues/52234> +note: the macro is defined here + --> $DIR/local-modularized-tricky-fail-2.rs:5:5 + | +LL | / macro_rules! exported { +LL | | () => () +LL | | } + | |_____^ +... +LL | define_exported!(); + | ------------------ in this macro invocation + = note: this error originates in the macro `define_exported` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/imports/local-modularized-tricky-pass-1.rs b/src/test/ui/imports/local-modularized-tricky-pass-1.rs new file mode 100644 index 000000000..b52ddaf89 --- /dev/null +++ b/src/test/ui/imports/local-modularized-tricky-pass-1.rs @@ -0,0 +1,19 @@ +// build-pass (FIXME(62277): could be check-pass?) + +macro_rules! define_exported { () => { + #[macro_export] + macro_rules! exported { + () => () + } +}} + +mod inner1 { + use super::*; + exported!(); +} + +mod inner2 { + define_exported!(); +} + +fn main() {} diff --git a/src/test/ui/imports/local-modularized-tricky-pass-2.rs b/src/test/ui/imports/local-modularized-tricky-pass-2.rs new file mode 100644 index 000000000..d5efbdf78 --- /dev/null +++ b/src/test/ui/imports/local-modularized-tricky-pass-2.rs @@ -0,0 +1,50 @@ +// check-pass +// +// `#[macro_export] macro_rules` that doesn't originate from macro expansions can be placed +// into the root module soon enough to act as usual items and shadow globs and preludes. + +#![feature(decl_macro)] + +// `macro_export` shadows globs +use inner1::*; + +mod inner1 { + pub macro exported() {} +} + +exported!(); + +mod deep { + fn deep() { + type Deeper = [u8; { + #[macro_export] + macro_rules! exported { + () => ( struct Б; ) + } + + 0 + }]; + } +} + +// `macro_export` shadows std prelude +fn main() { + panic!(); +} + +mod inner3 { + #[macro_export] + macro_rules! panic { + () => ( struct Г; ) + } +} + +// `macro_export` shadows builtin macros +include!(); + +mod inner4 { + #[macro_export] + macro_rules! include { + () => ( struct Д; ) + } +} diff --git a/src/test/ui/imports/local-modularized.rs b/src/test/ui/imports/local-modularized.rs new file mode 100644 index 000000000..8eeb1cf07 --- /dev/null +++ b/src/test/ui/imports/local-modularized.rs @@ -0,0 +1,35 @@ +// build-pass (FIXME(62277): could be check-pass?) + +#[macro_export(local_inner_macros)] +macro_rules! dollar_crate_exported { + (1) => { $crate::exported!(); }; + (2) => { exported!(); }; +} + +// Before `exported` is defined +exported!(); + +mod inner { + + ::exported!(); + crate::exported!(); + dollar_crate_exported!(1); + dollar_crate_exported!(2); + + mod inner_inner { + #[macro_export] + macro_rules! exported { + () => () + } + } + + // After `exported` is defined + ::exported!(); + crate::exported!(); + dollar_crate_exported!(1); + dollar_crate_exported!(2); +} + +exported!(); + +fn main() {} diff --git a/src/test/ui/imports/macro-paths.rs b/src/test/ui/imports/macro-paths.rs new file mode 100644 index 000000000..cc584e05a --- /dev/null +++ b/src/test/ui/imports/macro-paths.rs @@ -0,0 +1,28 @@ +// aux-build:two_macros.rs + +extern crate two_macros; + +mod foo { + pub mod bar { + pub use two_macros::m; + } +} + +fn f() { + use foo::*; + bar::m! { //~ ERROR ambiguous + mod bar { pub use two_macros::m; } + } +} + +pub mod baz { + pub use two_macros::m; +} + +fn g() { + baz::m! { //~ ERROR ambiguous + mod baz { pub use two_macros::m; } + } +} + +fn main() {} diff --git a/src/test/ui/imports/macro-paths.stderr b/src/test/ui/imports/macro-paths.stderr new file mode 100644 index 000000000..5f113ce2b --- /dev/null +++ b/src/test/ui/imports/macro-paths.stderr @@ -0,0 +1,43 @@ +error[E0659]: `bar` is ambiguous + --> $DIR/macro-paths.rs:13:5 + | +LL | bar::m! { + | ^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and a macro-expanded name in the same module during import or macro resolution +note: `bar` could refer to the module defined here + --> $DIR/macro-paths.rs:14:9 + | +LL | mod bar { pub use two_macros::m; } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +note: `bar` could also refer to the module imported here + --> $DIR/macro-paths.rs:12:9 + | +LL | use foo::*; + | ^^^^^^ + = help: consider adding an explicit import of `bar` to disambiguate + +error[E0659]: `baz` is ambiguous + --> $DIR/macro-paths.rs:23:5 + | +LL | baz::m! { + | ^^^ ambiguous name + | + = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution +note: `baz` could refer to the module defined here + --> $DIR/macro-paths.rs:24:9 + | +LL | mod baz { pub use two_macros::m; } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +note: `baz` could also refer to the module defined here + --> $DIR/macro-paths.rs:18:1 + | +LL | / pub mod baz { +LL | | pub use two_macros::m; +LL | | } + | |_^ + = help: use `crate::baz` to refer to this module unambiguously + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/macros.rs b/src/test/ui/imports/macros.rs new file mode 100644 index 000000000..f39711898 --- /dev/null +++ b/src/test/ui/imports/macros.rs @@ -0,0 +1,42 @@ +// aux-build:two_macros.rs + +extern crate two_macros; // two identity macros `m` and `n` + +mod foo { + pub use two_macros::n as m; +} + +mod m1 { + m!(use two_macros::*;); + use foo::m; // This shadows the glob import +} + +mod m2 { + use two_macros::*; + m! { //~ ERROR ambiguous + //~| ERROR ambiguous + use foo::m; + } +} + +mod m3 { + use two_macros::m; + fn f() { + use two_macros::n as m; // This shadows the above import + m!(); + } + + fn g() { + m! { //~ ERROR ambiguous + use two_macros::n as m; + } + } +} + +mod m4 { + macro_rules! m { () => {} } + use two_macros::m; + m!(); +} + +fn main() {} diff --git a/src/test/ui/imports/macros.stderr b/src/test/ui/imports/macros.stderr new file mode 100644 index 000000000..110548d1d --- /dev/null +++ b/src/test/ui/imports/macros.stderr @@ -0,0 +1,60 @@ +error[E0659]: `m` is ambiguous + --> $DIR/macros.rs:16:5 + | +LL | m! { + | ^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and a macro-expanded name in the same module during import or macro resolution +note: `m` could refer to the macro imported here + --> $DIR/macros.rs:18:13 + | +LL | use foo::m; + | ^^^^^^ +note: `m` could also refer to the macro imported here + --> $DIR/macros.rs:15:9 + | +LL | use two_macros::*; + | ^^^^^^^^^^^^^ + = help: consider adding an explicit import of `m` to disambiguate + +error[E0659]: `m` is ambiguous + --> $DIR/macros.rs:16:5 + | +LL | m! { + | ^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and a macro-expanded name in the same module during import or macro resolution +note: `m` could refer to the macro imported here + --> $DIR/macros.rs:18:13 + | +LL | use foo::m; + | ^^^^^^ +note: `m` could also refer to the macro imported here + --> $DIR/macros.rs:15:9 + | +LL | use two_macros::*; + | ^^^^^^^^^^^^^ + = help: consider adding an explicit import of `m` to disambiguate + +error[E0659]: `m` is ambiguous + --> $DIR/macros.rs:30:9 + | +LL | m! { + | ^ ambiguous name + | + = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution +note: `m` could refer to the macro imported here + --> $DIR/macros.rs:31:17 + | +LL | use two_macros::n as m; + | ^^^^^^^^^^^^^^^^^^ +note: `m` could also refer to the macro imported here + --> $DIR/macros.rs:23:9 + | +LL | use two_macros::m; + | ^^^^^^^^^^^^^ + = help: use `self::m` to refer to this macro unambiguously + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/no-std-inject.rs b/src/test/ui/imports/no-std-inject.rs new file mode 100644 index 000000000..e9664a4dd --- /dev/null +++ b/src/test/ui/imports/no-std-inject.rs @@ -0,0 +1,6 @@ +#![no_std] + +extern crate core; //~ ERROR: the name `core` is defined multiple times +extern crate std; + +fn main() {} diff --git a/src/test/ui/imports/no-std-inject.stderr b/src/test/ui/imports/no-std-inject.stderr new file mode 100644 index 000000000..8e2268048 --- /dev/null +++ b/src/test/ui/imports/no-std-inject.stderr @@ -0,0 +1,15 @@ +error[E0259]: the name `core` is defined multiple times + --> $DIR/no-std-inject.rs:3:1 + | +LL | extern crate core; + | ^^^^^^^^^^^^^^^^^^ `core` reimported here + | + = note: `core` must be defined only once in the type namespace of this module +help: you can use `as` to change the binding name of the import + | +LL | extern crate core as other_core; + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0259`. diff --git a/src/test/ui/imports/overlapping_pub_trait.rs b/src/test/ui/imports/overlapping_pub_trait.rs new file mode 100644 index 000000000..69aba3ae9 --- /dev/null +++ b/src/test/ui/imports/overlapping_pub_trait.rs @@ -0,0 +1,15 @@ +// aux-build:overlapping_pub_trait_source.rs + +/* + * This crate declares two public paths, `m::Tr` and `prelude::_`. Make sure we prefer the former. + */ +extern crate overlapping_pub_trait_source; +//~^ HELP the following trait is implemented but not in scope; perhaps add a `use` for it: +//~| SUGGESTION overlapping_pub_trait_source::m::Tr + +fn main() { + use overlapping_pub_trait_source::S; + S.method(); + //~^ ERROR no method named `method` found for struct `S` in the current scope [E0599] + //~| HELP items from traits can only be used if the trait is in scope +} diff --git a/src/test/ui/imports/overlapping_pub_trait.stderr b/src/test/ui/imports/overlapping_pub_trait.stderr new file mode 100644 index 000000000..d0c845a5e --- /dev/null +++ b/src/test/ui/imports/overlapping_pub_trait.stderr @@ -0,0 +1,20 @@ +error[E0599]: no method named `method` found for struct `S` in the current scope + --> $DIR/overlapping_pub_trait.rs:12:7 + | +LL | S.method(); + | ^^^^^^ method not found in `S` + | + ::: $DIR/auxiliary/overlapping_pub_trait_source.rs:11:23 + | +LL | pub trait Tr { fn method(&self); } + | ------ the method is available for `S` here + | + = help: items from traits can only be used if the trait is in scope +help: the following trait is implemented but not in scope; perhaps add a `use` for it: + | +LL | use overlapping_pub_trait_source::m::Tr; + | + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0599`. diff --git a/src/test/ui/imports/reexport-star.rs b/src/test/ui/imports/reexport-star.rs new file mode 100644 index 000000000..639ab1a0f --- /dev/null +++ b/src/test/ui/imports/reexport-star.rs @@ -0,0 +1,16 @@ +// run-pass +// pretty-expanded FIXME #23616 + +mod a { + pub fn f() {} + pub fn g() {} +} + +mod b { + pub use a::*; +} + +pub fn main() { + b::f(); + b::g(); +} diff --git a/src/test/ui/imports/reexports.rs b/src/test/ui/imports/reexports.rs new file mode 100644 index 000000000..d76cc41be --- /dev/null +++ b/src/test/ui/imports/reexports.rs @@ -0,0 +1,37 @@ +#![warn(unused_imports)] + +mod a { + fn foo() {} + mod foo {} + + mod a { + pub use super::foo; //~ ERROR cannot be re-exported + pub use super::*; + //~^ WARNING glob import doesn't reexport anything because no candidate is public enough + } +} + +mod b { + pub fn foo() {} + mod foo { + pub struct S; + } + + pub mod a { + pub use super::foo; // This is OK since the value `foo` is visible enough. + fn f(_: foo::S) {} // `foo` is imported in the type namespace (but not `pub` re-exported). + } + + pub mod b { + pub use super::*; // This is also OK since the value `foo` is visible enough. + fn f(_: foo::S) {} // Again, the module `foo` is imported (but not `pub` re-exported). + } +} + +mod c { + // Test that `foo` is not re-exported. + use b::a::foo::S; //~ ERROR `foo` + use b::b::foo::S as T; //~ ERROR `foo` +} + +fn main() {} diff --git a/src/test/ui/imports/reexports.stderr b/src/test/ui/imports/reexports.stderr new file mode 100644 index 000000000..8cbff0ac7 --- /dev/null +++ b/src/test/ui/imports/reexports.stderr @@ -0,0 +1,62 @@ +error[E0364]: `foo` is private, and cannot be re-exported + --> $DIR/reexports.rs:8:17 + | +LL | pub use super::foo; + | ^^^^^^^^^^ + | +note: consider marking `foo` as `pub` in the imported module + --> $DIR/reexports.rs:8:17 + | +LL | pub use super::foo; + | ^^^^^^^^^^ + +error[E0603]: module import `foo` is private + --> $DIR/reexports.rs:33:15 + | +LL | use b::a::foo::S; + | ^^^ private module import + | +note: the module import `foo` is defined here... + --> $DIR/reexports.rs:21:17 + | +LL | pub use super::foo; // This is OK since the value `foo` is visible enough. + | ^^^^^^^^^^ +note: ...and refers to the module `foo` which is defined here + --> $DIR/reexports.rs:16:5 + | +LL | mod foo { + | ^^^^^^^ + +error[E0603]: module import `foo` is private + --> $DIR/reexports.rs:34:15 + | +LL | use b::b::foo::S as T; + | ^^^ private module import + | +note: the module import `foo` is defined here... + --> $DIR/reexports.rs:26:17 + | +LL | pub use super::*; // This is also OK since the value `foo` is visible enough. + | ^^^^^^^^ +note: ...and refers to the module `foo` which is defined here + --> $DIR/reexports.rs:16:5 + | +LL | mod foo { + | ^^^^^^^ + +warning: glob import doesn't reexport anything because no candidate is public enough + --> $DIR/reexports.rs:9:17 + | +LL | pub use super::*; + | ^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/reexports.rs:1:9 + | +LL | #![warn(unused_imports)] + | ^^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors; 1 warning emitted + +Some errors have detailed explanations: E0364, E0603. +For more information about an error, try `rustc --explain E0364`. diff --git a/src/test/ui/imports/resolve_self_super_hint.rs b/src/test/ui/imports/resolve_self_super_hint.rs new file mode 100644 index 000000000..a14ec5b72 --- /dev/null +++ b/src/test/ui/imports/resolve_self_super_hint.rs @@ -0,0 +1,27 @@ +mod a { + extern crate alloc; + use alloc::HashMap; + //~^ ERROR unresolved import `alloc` [E0432] + //~| HELP a similar path exists + //~| SUGGESTION self::alloc + mod b { + use alloc::HashMap; + //~^ ERROR unresolved import `alloc` [E0432] + //~| HELP a similar path exists + //~| SUGGESTION super::alloc + mod c { + use alloc::HashMap; + //~^ ERROR unresolved import `alloc` [E0432] + //~| HELP a similar path exists + //~| SUGGESTION a::alloc + mod d { + use alloc::HashMap; + //~^ ERROR unresolved import `alloc` [E0432] + //~| HELP a similar path exists + //~| SUGGESTION a::alloc + } + } + } +} + +fn main() {} diff --git a/src/test/ui/imports/resolve_self_super_hint.stderr b/src/test/ui/imports/resolve_self_super_hint.stderr new file mode 100644 index 000000000..bc862553b --- /dev/null +++ b/src/test/ui/imports/resolve_self_super_hint.stderr @@ -0,0 +1,33 @@ +error[E0432]: unresolved import `alloc` + --> $DIR/resolve_self_super_hint.rs:3:9 + | +LL | use alloc::HashMap; + | ^^^^^ help: a similar path exists: `self::alloc` + +error[E0432]: unresolved import `alloc` + --> $DIR/resolve_self_super_hint.rs:8:13 + | +LL | use alloc::HashMap; + | ^^^^^ help: a similar path exists: `super::alloc` + +error[E0432]: unresolved import `alloc` + --> $DIR/resolve_self_super_hint.rs:13:17 + | +LL | use alloc::HashMap; + | ^^^^^ + | | + | unresolved import + | help: a similar path exists: `a::alloc` + +error[E0432]: unresolved import `alloc` + --> $DIR/resolve_self_super_hint.rs:18:21 + | +LL | use alloc::HashMap; + | ^^^^^ + | | + | unresolved import + | help: a similar path exists: `a::alloc` + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/rfc-1560-warning-cycle.rs b/src/test/ui/imports/rfc-1560-warning-cycle.rs new file mode 100644 index 000000000..cfa7179fb --- /dev/null +++ b/src/test/ui/imports/rfc-1560-warning-cycle.rs @@ -0,0 +1,13 @@ +pub struct Foo; + +mod bar { + struct Foo; + + mod baz { + use *; + use bar::*; + fn f(_: Foo) {} //~ ERROR `Foo` is ambiguous + } +} + +fn main() {} diff --git a/src/test/ui/imports/rfc-1560-warning-cycle.stderr b/src/test/ui/imports/rfc-1560-warning-cycle.stderr new file mode 100644 index 000000000..fd7e99165 --- /dev/null +++ b/src/test/ui/imports/rfc-1560-warning-cycle.stderr @@ -0,0 +1,23 @@ +error[E0659]: `Foo` is ambiguous + --> $DIR/rfc-1560-warning-cycle.rs:9:17 + | +LL | fn f(_: Foo) {} + | ^^^ ambiguous name + | + = note: ambiguous because of multiple glob imports of a name in the same module +note: `Foo` could refer to the struct imported here + --> $DIR/rfc-1560-warning-cycle.rs:7:13 + | +LL | use *; + | ^ + = help: consider adding an explicit import of `Foo` to disambiguate +note: `Foo` could also refer to the struct imported here + --> $DIR/rfc-1560-warning-cycle.rs:8:13 + | +LL | use bar::*; + | ^^^^^^ + = help: consider adding an explicit import of `Foo` to disambiguate + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/shadow_builtin_macros.rs b/src/test/ui/imports/shadow_builtin_macros.rs new file mode 100644 index 000000000..02c27d5ce --- /dev/null +++ b/src/test/ui/imports/shadow_builtin_macros.rs @@ -0,0 +1,52 @@ +// aux-build:two_macros.rs + +mod foo { + extern crate two_macros; + pub use self::two_macros::m as panic; +} + +mod m1 { + use foo::panic; // ok + fn f() { panic!(); } +} + +mod m2 { + use foo::*; + fn f() { panic!(); } //~ ERROR ambiguous +} + +mod m3 { + ::two_macros::m!(use foo::panic;); + fn f() { panic!(); } //~ ERROR ambiguous +} + +mod m4 { + macro_rules! panic { () => {} } // ok + panic!(); +} + +mod m5 { + macro_rules! m { () => { + macro_rules! panic { () => {} } + } } + m!(); + panic!(); //~ ERROR `panic` is ambiguous +} + +#[macro_use(n)] +extern crate two_macros; +mod bar { + pub use two_macros::m as n; +} + +mod m6 { + use bar::n; // ok + n!(); +} + +mod m7 { + use bar::*; + n!(); //~ ERROR ambiguous +} + +fn main() {} diff --git a/src/test/ui/imports/shadow_builtin_macros.stderr b/src/test/ui/imports/shadow_builtin_macros.stderr new file mode 100644 index 000000000..6ffb31c20 --- /dev/null +++ b/src/test/ui/imports/shadow_builtin_macros.stderr @@ -0,0 +1,72 @@ +error[E0659]: `panic` is ambiguous + --> $DIR/shadow_builtin_macros.rs:15:14 + | +LL | fn f() { panic!(); } + | ^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution + = note: `panic` could refer to a macro from prelude +note: `panic` could also refer to the macro imported here + --> $DIR/shadow_builtin_macros.rs:14:9 + | +LL | use foo::*; + | ^^^^^^ + = help: consider adding an explicit import of `panic` to disambiguate + = help: or use `self::panic` to refer to this macro unambiguously + +error[E0659]: `panic` is ambiguous + --> $DIR/shadow_builtin_macros.rs:33:5 + | +LL | panic!(); + | ^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution + = note: `panic` could refer to a macro from prelude +note: `panic` could also refer to the macro defined here + --> $DIR/shadow_builtin_macros.rs:30:9 + | +LL | macro_rules! panic { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | } } +LL | m!(); + | ---- in this macro invocation + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0659]: `n` is ambiguous + --> $DIR/shadow_builtin_macros.rs:49:5 + | +LL | n!(); + | ^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution +note: `n` could refer to the macro imported here + --> $DIR/shadow_builtin_macros.rs:48:9 + | +LL | use bar::*; + | ^^^^^^ + = help: consider adding an explicit import of `n` to disambiguate + = help: or use `self::n` to refer to this macro unambiguously +note: `n` could also refer to the macro imported here + --> $DIR/shadow_builtin_macros.rs:36:13 + | +LL | #[macro_use(n)] + | ^ + +error[E0659]: `panic` is ambiguous + --> $DIR/shadow_builtin_macros.rs:20:14 + | +LL | fn f() { panic!(); } + | ^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution + = note: `panic` could refer to a macro from prelude +note: `panic` could also refer to the macro imported here + --> $DIR/shadow_builtin_macros.rs:19:26 + | +LL | ::two_macros::m!(use foo::panic;); + | ^^^^^^^^^^ + = help: use `self::panic` to refer to this macro unambiguously + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/tool-mod-child.rs b/src/test/ui/imports/tool-mod-child.rs new file mode 100644 index 000000000..4581dc2e2 --- /dev/null +++ b/src/test/ui/imports/tool-mod-child.rs @@ -0,0 +1,7 @@ +use clippy::a; //~ ERROR unresolved import `clippy` +use clippy::a::b; //~ ERROR failed to resolve: maybe a missing crate `clippy`? + +use rustdoc::a; //~ ERROR unresolved import `rustdoc` +use rustdoc::a::b; //~ ERROR failed to resolve: maybe a missing crate `rustdoc`? + +fn main() {} diff --git a/src/test/ui/imports/tool-mod-child.stderr b/src/test/ui/imports/tool-mod-child.stderr new file mode 100644 index 000000000..6caf15bc7 --- /dev/null +++ b/src/test/ui/imports/tool-mod-child.stderr @@ -0,0 +1,36 @@ +error[E0433]: failed to resolve: maybe a missing crate `clippy`? + --> $DIR/tool-mod-child.rs:2:5 + | +LL | use clippy::a::b; + | ^^^^^^ maybe a missing crate `clippy`? + | + = help: consider adding `extern crate clippy` to use the `clippy` crate + +error[E0432]: unresolved import `clippy` + --> $DIR/tool-mod-child.rs:1:5 + | +LL | use clippy::a; + | ^^^^^^ maybe a missing crate `clippy`? + | + = help: consider adding `extern crate clippy` to use the `clippy` crate + +error[E0433]: failed to resolve: maybe a missing crate `rustdoc`? + --> $DIR/tool-mod-child.rs:5:5 + | +LL | use rustdoc::a::b; + | ^^^^^^^ maybe a missing crate `rustdoc`? + | + = help: consider adding `extern crate rustdoc` to use the `rustdoc` crate + +error[E0432]: unresolved import `rustdoc` + --> $DIR/tool-mod-child.rs:4:5 + | +LL | use rustdoc::a; + | ^^^^^^^ maybe a missing crate `rustdoc`? + | + = help: consider adding `extern crate rustdoc` to use the `rustdoc` crate + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0432, E0433. +For more information about an error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/unnamed_pub_trait.rs b/src/test/ui/imports/unnamed_pub_trait.rs new file mode 100644 index 000000000..c38fb17b9 --- /dev/null +++ b/src/test/ui/imports/unnamed_pub_trait.rs @@ -0,0 +1,16 @@ +// aux-build:unnamed_pub_trait_source.rs + +/* + * This crate declares an unnameable public path for our item. Make sure we don't suggest + * importing it by name, and instead we suggest importing it by glob. + */ +extern crate unnamed_pub_trait_source; +//~^ HELP the following trait is implemented but not in scope; perhaps add a `use` for it: +//~| SUGGESTION unnamed_pub_trait_source::prelude::*; // trait Tr + +fn main() { + use unnamed_pub_trait_source::S; + S.method(); + //~^ ERROR no method named `method` found for struct `S` in the current scope [E0599] + //~| HELP items from traits can only be used if the trait is in scope +} diff --git a/src/test/ui/imports/unnamed_pub_trait.stderr b/src/test/ui/imports/unnamed_pub_trait.stderr new file mode 100644 index 000000000..319dfd7e1 --- /dev/null +++ b/src/test/ui/imports/unnamed_pub_trait.stderr @@ -0,0 +1,20 @@ +error[E0599]: no method named `method` found for struct `S` in the current scope + --> $DIR/unnamed_pub_trait.rs:13:7 + | +LL | S.method(); + | ^^^^^^ method not found in `S` + | + ::: $DIR/auxiliary/unnamed_pub_trait_source.rs:7:23 + | +LL | pub trait Tr { fn method(&self); } + | ------ the method is available for `S` here + | + = help: items from traits can only be used if the trait is in scope +help: the following trait is implemented but not in scope; perhaps add a `use` for it: + | +LL | use unnamed_pub_trait_source::prelude::*; // trait Tr + | + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0599`. diff --git a/src/test/ui/imports/unresolved-imports-used.rs b/src/test/ui/imports/unresolved-imports-used.rs new file mode 100644 index 000000000..75cf88019 --- /dev/null +++ b/src/test/ui/imports/unresolved-imports-used.rs @@ -0,0 +1,18 @@ +// There should be *one* unused import error. +#![deny(unused_imports)] + +mod qux { + fn quz() {} + pub fn quy() {} +} + +use qux::quz; //~ ERROR function `quz` is private +use qux::bar; //~ ERROR unresolved import `qux::bar` +use foo::bar; //~ ERROR unresolved import `foo` +use baz::*; //~ ERROR unresolved import `baz` +use qux::bar2; //~ ERROR unresolved import `qux::bar2` +use foo2::bar2;//~ ERROR unresolved import `foo2` +use baz2::*; //~ ERROR unresolved import `baz2` +use qux::quy; //~ ERROR unused import + +fn main() {} diff --git a/src/test/ui/imports/unresolved-imports-used.stderr b/src/test/ui/imports/unresolved-imports-used.stderr new file mode 100644 index 000000000..73f9d1bfb --- /dev/null +++ b/src/test/ui/imports/unresolved-imports-used.stderr @@ -0,0 +1,72 @@ +error[E0432]: unresolved import `qux::bar` + --> $DIR/unresolved-imports-used.rs:10:5 + | +LL | use qux::bar; + | ^^^^^^^^ no `bar` in `qux` + +error[E0432]: unresolved import `qux::bar2` + --> $DIR/unresolved-imports-used.rs:13:5 + | +LL | use qux::bar2; + | ^^^^^^^^^ no `bar2` in `qux` + +error[E0432]: unresolved import `foo` + --> $DIR/unresolved-imports-used.rs:11:5 + | +LL | use foo::bar; + | ^^^ maybe a missing crate `foo`? + | + = help: consider adding `extern crate foo` to use the `foo` crate + +error[E0432]: unresolved import `baz` + --> $DIR/unresolved-imports-used.rs:12:5 + | +LL | use baz::*; + | ^^^ maybe a missing crate `baz`? + | + = help: consider adding `extern crate baz` to use the `baz` crate + +error[E0432]: unresolved import `foo2` + --> $DIR/unresolved-imports-used.rs:14:5 + | +LL | use foo2::bar2; + | ^^^^ maybe a missing crate `foo2`? + | + = help: consider adding `extern crate foo2` to use the `foo2` crate + +error[E0432]: unresolved import `baz2` + --> $DIR/unresolved-imports-used.rs:15:5 + | +LL | use baz2::*; + | ^^^^ maybe a missing crate `baz2`? + | + = help: consider adding `extern crate baz2` to use the `baz2` crate + +error[E0603]: function `quz` is private + --> $DIR/unresolved-imports-used.rs:9:10 + | +LL | use qux::quz; + | ^^^ private function + | +note: the function `quz` is defined here + --> $DIR/unresolved-imports-used.rs:5:4 + | +LL | fn quz() {} + | ^^^^^^^^ + +error: unused import: `qux::quy` + --> $DIR/unresolved-imports-used.rs:16:5 + | +LL | use qux::quy; + | ^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unresolved-imports-used.rs:2:9 + | +LL | #![deny(unused_imports)] + | ^^^^^^^^^^^^^^ + +error: aborting due to 8 previous errors + +Some errors have detailed explanations: E0432, E0603. +For more information about an error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/unused-import-issue-87973.fixed b/src/test/ui/imports/unused-import-issue-87973.fixed new file mode 100644 index 000000000..5c194d18a --- /dev/null +++ b/src/test/ui/imports/unused-import-issue-87973.fixed @@ -0,0 +1,8 @@ +// run-rustfix +#![deny(unused_imports)] + +// Check that attributes get removed too. See #87973. + +//~^ ERROR unused import + +fn main() {} diff --git a/src/test/ui/imports/unused-import-issue-87973.rs b/src/test/ui/imports/unused-import-issue-87973.rs new file mode 100644 index 000000000..c31f0f979 --- /dev/null +++ b/src/test/ui/imports/unused-import-issue-87973.rs @@ -0,0 +1,11 @@ +// run-rustfix +#![deny(unused_imports)] + +// Check that attributes get removed too. See #87973. +#[deprecated] +#[allow(unsafe_code)] +#[cfg(not(foo))] +use std::fs; +//~^ ERROR unused import + +fn main() {} diff --git a/src/test/ui/imports/unused-import-issue-87973.stderr b/src/test/ui/imports/unused-import-issue-87973.stderr new file mode 100644 index 000000000..81b7ea791 --- /dev/null +++ b/src/test/ui/imports/unused-import-issue-87973.stderr @@ -0,0 +1,14 @@ +error: unused import: `std::fs` + --> $DIR/unused-import-issue-87973.rs:8:5 + | +LL | use std::fs; + | ^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unused-import-issue-87973.rs:2:9 + | +LL | #![deny(unused_imports)] + | ^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/imports/unused-imports-in-test-mode.rs b/src/test/ui/imports/unused-imports-in-test-mode.rs new file mode 100644 index 000000000..039f59a88 --- /dev/null +++ b/src/test/ui/imports/unused-imports-in-test-mode.rs @@ -0,0 +1,102 @@ +// compile-flags: --test + +#![deny(unused_imports)] + +use std::io::BufRead; //~ ERROR unused import: `std::io::BufRead` + +fn a() {} +fn b() {} + +mod test { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +mod tests { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +mod test_a { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +mod a_test { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +mod tests_a { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +mod a_tests { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +mod fastest_search { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +#[cfg(test)] +mod test_has_attr { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +mod test_has_no_attr { + #[cfg(test)] + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; //~ ERROR unused import: `crate::b` + } +} + +fn main() {} diff --git a/src/test/ui/imports/unused-imports-in-test-mode.stderr b/src/test/ui/imports/unused-imports-in-test-mode.stderr new file mode 100644 index 000000000..c5faaa114 --- /dev/null +++ b/src/test/ui/imports/unused-imports-in-test-mode.stderr @@ -0,0 +1,68 @@ +error: unused import: `std::io::BufRead` + --> $DIR/unused-imports-in-test-mode.rs:5:5 + | +LL | use std::io::BufRead; + | ^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unused-imports-in-test-mode.rs:3:9 + | +LL | #![deny(unused_imports)] + | ^^^^^^^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:16:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:26:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:36:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:46:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:56:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:66:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:76:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:87:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: unused import: `crate::b` + --> $DIR/unused-imports-in-test-mode.rs:98:13 + | +LL | use crate::b; + | ^^^^^^^^ + +error: aborting due to 10 previous errors + diff --git a/src/test/ui/imports/unused-imports-in-test-module.rs b/src/test/ui/imports/unused-imports-in-test-module.rs new file mode 100644 index 000000000..7849c3fcd --- /dev/null +++ b/src/test/ui/imports/unused-imports-in-test-module.rs @@ -0,0 +1,89 @@ +#![deny(unused_imports)] + +use std::io::BufRead; //~ ERROR unused import: `std::io::BufRead` + +fn a() {} +fn b() {} + +mod test { + use super::a; //~ ERROR unused import: `super::a` + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +mod tests { + use super::a; //~ ERROR unused import: `super::a` + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +mod test_a { + use super::a; //~ ERROR unused import: `super::a` + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +mod a_test { + use super::a; //~ ERROR unused import: `super::a` + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +mod tests_a { + use super::a; //~ ERROR unused import: `super::a` + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +mod a_tests { + use super::a; //~ ERROR unused import: `super::a` + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +mod fastest_search { + use super::a; //~ ERROR unused import: `super::a` + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +#[cfg(test)] +mod test_has_attr { + use super::a; + + #[test] + fn foo() { + a(); + use crate::b; + } +} + +fn main() {} diff --git a/src/test/ui/imports/unused-imports-in-test-module.stderr b/src/test/ui/imports/unused-imports-in-test-module.stderr new file mode 100644 index 000000000..1598368eb --- /dev/null +++ b/src/test/ui/imports/unused-imports-in-test-module.stderr @@ -0,0 +1,92 @@ +error: unused import: `std::io::BufRead` + --> $DIR/unused-imports-in-test-module.rs:3:5 + | +LL | use std::io::BufRead; + | ^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unused-imports-in-test-module.rs:1:9 + | +LL | #![deny(unused_imports)] + | ^^^^^^^^^^^^^^ + +error: unused import: `super::a` + --> $DIR/unused-imports-in-test-module.rs:9:9 + | +LL | use super::a; + | ^^^^^^^^ + | +help: consider adding a `#[cfg(test)]` to the containing module + --> $DIR/unused-imports-in-test-module.rs:8:1 + | +LL | mod test { + | ^^^^^^^^ + +error: unused import: `super::a` + --> $DIR/unused-imports-in-test-module.rs:19:9 + | +LL | use super::a; + | ^^^^^^^^ + | +help: consider adding a `#[cfg(test)]` to the containing module + --> $DIR/unused-imports-in-test-module.rs:18:1 + | +LL | mod tests { + | ^^^^^^^^^ + +error: unused import: `super::a` + --> $DIR/unused-imports-in-test-module.rs:29:9 + | +LL | use super::a; + | ^^^^^^^^ + | +help: consider adding a `#[cfg(test)]` to the containing module + --> $DIR/unused-imports-in-test-module.rs:28:1 + | +LL | mod test_a { + | ^^^^^^^^^^ + +error: unused import: `super::a` + --> $DIR/unused-imports-in-test-module.rs:39:9 + | +LL | use super::a; + | ^^^^^^^^ + | +help: consider adding a `#[cfg(test)]` to the containing module + --> $DIR/unused-imports-in-test-module.rs:38:1 + | +LL | mod a_test { + | ^^^^^^^^^^ + +error: unused import: `super::a` + --> $DIR/unused-imports-in-test-module.rs:49:9 + | +LL | use super::a; + | ^^^^^^^^ + | +help: consider adding a `#[cfg(test)]` to the containing module + --> $DIR/unused-imports-in-test-module.rs:48:1 + | +LL | mod tests_a { + | ^^^^^^^^^^^ + +error: unused import: `super::a` + --> $DIR/unused-imports-in-test-module.rs:59:9 + | +LL | use super::a; + | ^^^^^^^^ + | +help: consider adding a `#[cfg(test)]` to the containing module + --> $DIR/unused-imports-in-test-module.rs:58:1 + | +LL | mod a_tests { + | ^^^^^^^^^^^ + +error: unused import: `super::a` + --> $DIR/unused-imports-in-test-module.rs:69:9 + | +LL | use super::a; + | ^^^^^^^^ + +error: aborting due to 8 previous errors + diff --git a/src/test/ui/imports/unused-macro-use.rs b/src/test/ui/imports/unused-macro-use.rs new file mode 100644 index 000000000..9f63eb4b4 --- /dev/null +++ b/src/test/ui/imports/unused-macro-use.rs @@ -0,0 +1,11 @@ +#![deny(unused)] + +#[macro_use] //~ ERROR unused `#[macro_use]` import +extern crate core; + +#[macro_use( + panic //~ ERROR unused `#[macro_use]` import +)] +extern crate core as core_2; + +fn main() {} diff --git a/src/test/ui/imports/unused-macro-use.stderr b/src/test/ui/imports/unused-macro-use.stderr new file mode 100644 index 000000000..7137a90e4 --- /dev/null +++ b/src/test/ui/imports/unused-macro-use.stderr @@ -0,0 +1,21 @@ +error: unused `#[macro_use]` import + --> $DIR/unused-macro-use.rs:3:1 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unused-macro-use.rs:1:9 + | +LL | #![deny(unused)] + | ^^^^^^ + = note: `#[deny(unused_imports)]` implied by `#[deny(unused)]` + +error: unused `#[macro_use]` import + --> $DIR/unused-macro-use.rs:7:5 + | +LL | panic + | ^^^^^ + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/imports/unused.rs b/src/test/ui/imports/unused.rs new file mode 100644 index 000000000..c22e95ec3 --- /dev/null +++ b/src/test/ui/imports/unused.rs @@ -0,0 +1,27 @@ +#![deny(unused)] + +mod foo { + fn f() {} + + mod m1 { + pub(super) use super::f; //~ ERROR unused + } + + mod m2 { + #[allow(unused)] + use super::m1::*; // (despite this glob import) + } + + mod m3 { + pub(super) use super::f; // Check that this is counted as used (cf. issue #36249). + } + + pub mod m4 { + use super::m3::*; + pub fn g() { f(); } + } +} + +fn main() { + foo::m4::g(); +} diff --git a/src/test/ui/imports/unused.stderr b/src/test/ui/imports/unused.stderr new file mode 100644 index 000000000..08128d794 --- /dev/null +++ b/src/test/ui/imports/unused.stderr @@ -0,0 +1,15 @@ +error: unused import: `super::f` + --> $DIR/unused.rs:7:24 + | +LL | pub(super) use super::f; + | ^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unused.rs:1:9 + | +LL | #![deny(unused)] + | ^^^^^^ + = note: `#[deny(unused_imports)]` implied by `#[deny(unused)]` + +error: aborting due to previous error + diff --git a/src/test/ui/imports/use-mod.rs b/src/test/ui/imports/use-mod.rs new file mode 100644 index 000000000..84da2e708 --- /dev/null +++ b/src/test/ui/imports/use-mod.rs @@ -0,0 +1,33 @@ +// run-pass + +#![allow(unused_imports)] +// pretty-expanded FIXME #23616 + +pub use foo::bar::{self, First}; +use self::bar::Second; + +mod foo { + pub use self::bar::baz::{self}; + + pub mod bar { + pub mod baz { + pub struct Fourth; + } + pub struct First; + pub struct Second; + } + + pub struct Third; +} + +mod baz { + use super::foo::{bar, self}; + pub use foo::Third; +} + +fn main() { + let _ = First; + let _ = Second; + let _ = baz::Third; + let _ = foo::baz::Fourth; +} |