Skip to content

Commit

Permalink
Add a couple more tests + address review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
petrochenkov committed Nov 17, 2018
1 parent 10ac957 commit b366415
Show file tree
Hide file tree
Showing 14 changed files with 161 additions and 5 deletions.
8 changes: 7 additions & 1 deletion src/librustc_resolve/resolve_imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
ident.name == keywords::SelfValue.name() {
// FIXME: Implement these with renaming requirements so that e.g.
// `use super;` doesn't work, but `use super as name;` does.
// Fall through here to get an error from `early_resolve_...`.
}
}

Expand Down Expand Up @@ -938,7 +939,12 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
}
}
Err(..) => {
assert!(result[ns].get().is_err());
// FIXME: This assert may fire if public glob is later shadowed by a private
// single import (see test `issue-55884-2.rs`). In theory single imports should
// always block globs, even if they are not yet resolved, so that this kind of
// self-inconsistent resolution never happens.
// Reenable the assert when the issue is fixed.
// assert!(result[ns].get().is_err());
}
}
});
Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/imports/auxiliary/glob-conflict.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
mod m1 {
pub fn f() {}
}
mod m2 {
pub fn f(_: u8) {}
}

pub use m1::*;
pub use m2::*;
7 changes: 7 additions & 0 deletions src/test/ui/imports/glob-conflict-cross-crate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// aux-build:glob-conflict.rs

extern crate glob_conflict;

fn main() {
glob_conflict::f(); //~ ERROR cannot find function `f` in module `glob_conflict`
}
9 changes: 9 additions & 0 deletions src/test/ui/imports/glob-conflict-cross-crate.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0425]: cannot find function `f` in module `glob_conflict`
--> $DIR/glob-conflict-cross-crate.rs:6:20
|
LL | glob_conflict::f(); //~ ERROR cannot find function `f` in module `glob_conflict`
| ^ not found in `glob_conflict`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0425`.
21 changes: 21 additions & 0 deletions src/test/ui/imports/issue-55884-1.rs
Original file line number Diff line number Diff line change
@@ -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 {};
}
22 changes: 22 additions & 0 deletions src/test/ui/imports/issue-55884-1.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
error[E0659]: `S` is ambiguous (glob import vs glob import in the same module)
--> $DIR/issue-55884-1.rs:19:12
|
LL | use m::S; //~ ERROR `S` is ambiguous
| ^ ambiguous name
|
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`.
14 changes: 14 additions & 0 deletions src/test/ui/imports/issue-55884-2.rs
Original file line number Diff line number Diff line change
@@ -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 `ParseOptions` is private

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/imports/issue-55884-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0603]: struct `ParseOptions` is private
--> $DIR/issue-55884-2.rs:12:17
|
LL | pub use parser::ParseOptions; //~ ERROR struct `ParseOptions` is private
| ^^^^^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0603`.
4 changes: 2 additions & 2 deletions src/test/ui/rust-2018/local-path-suggestions-2018.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ mod foo {
}

mod bazz {
use foo::Bar;
use foo::Bar; //~ ERROR unresolved import `foo`

fn baz() {
let x: Bar = 22;
Expand All @@ -28,6 +28,6 @@ mod bazz {

use foo::Bar;

use foobar::Baz;
use foobar::Baz; //~ ERROR unresolved import `foobar`

fn main() { }
4 changes: 2 additions & 2 deletions src/test/ui/rust-2018/local-path-suggestions-2018.stderr
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
error[E0432]: unresolved import `foo`
--> $DIR/local-path-suggestions-2018.rs:22:9
|
LL | use foo::Bar;
LL | use foo::Bar; //~ ERROR unresolved import `foo`
| ^^^ did you mean `crate::foo`?
|
= note: `use` statements changed in Rust 2018; read more at <https://doc.rust-lang.org/edition-guide/rust-2018/module-system/path-clarity.html>

error[E0432]: unresolved import `foobar`
--> $DIR/local-path-suggestions-2018.rs:31:5
|
LL | use foobar::Baz;
LL | use foobar::Baz; //~ ERROR unresolved import `foobar`
| ^^^^^^ did you mean `baz::foobar`?

error: aborting due to 2 previous errors
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/rust-2018/uniform-paths/deadlock.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// edition:2018
// compile-flags:--extern foo --extern bar

use foo::bar; //~ ERROR unresolved import
use bar::foo;

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/rust-2018/uniform-paths/deadlock.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0432]: unresolved import
--> $DIR/deadlock.rs:4:5
|
LL | use foo::bar; //~ ERROR unresolved import
| ^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0432`.
11 changes: 11 additions & 0 deletions src/test/ui/rust-2018/uniform-paths/issue-54390.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// edition:2018

#![deny(unused)]

use std::fmt;

// No "unresolved import" + "unused import" combination here.
use fmt::Write; //~ ERROR imports can only refer to extern crate names
//~| ERROR unused import: `fmt::Write`

fn main() {}
32 changes: 32 additions & 0 deletions src/test/ui/rust-2018/uniform-paths/issue-54390.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
error[E0658]: imports can only refer to extern crate names passed with `--extern` on stable channel (see issue #53130)
--> $DIR/issue-54390.rs:8:5
|
LL | use std::fmt;
| -------- not an extern crate passed with `--extern`
...
LL | use fmt::Write; //~ ERROR imports can only refer to extern crate names
| ^^^
|
= help: add #![feature(uniform_paths)] to the crate attributes to enable
note: this import refers to the module imported here
--> $DIR/issue-54390.rs:5:5
|
LL | use std::fmt;
| ^^^^^^^^

error: unused import: `fmt::Write`
--> $DIR/issue-54390.rs:8:5
|
LL | use fmt::Write; //~ ERROR imports can only refer to extern crate names
| ^^^^^^^^^^
|
note: lint level defined here
--> $DIR/issue-54390.rs:3:9
|
LL | #![deny(unused)]
| ^^^^^^
= note: #[deny(unused_imports)] implied by #[deny(unused)]

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0658`.

0 comments on commit b366415

Please sign in to comment.