Prefer accessible paths in 'use' suggestions
This fixes an issue with the following sample:
mod foo {
mod inaccessible {
pub struct X;
}
pub mod avail {
pub struct X;
}
}
fn main() { X; }
Instead of suggesting both `use crate::foo::inaccessible::X;` and `use
crate::foo::avail::X;`, it should only suggest the latter.
It is done by trimming the list of suggestions from inaccessible paths
if accessible paths are present.
Visibility is checked with `is_accessible_from` now instead of being
hard-coded.
-
Some tests fixes are trivial, and others require a bit more explaining,
here are my comments:
src/test/ui/issues/issue-35675.stderr: Only needs to make the enum
public to have the suggestion make sense.
src/test/ui/issues/issue-42944.stderr: Importing the tuple struct won't
help because its constructor is not visible, so the attempted
constructor does not work. In that case, it's better not to suggest it.
The case where the constructor is public is covered in `issue-26545.rs`.
This commit is contained in:
parent
a39c7787ba
commit
fea5ab12c2
13 changed files with 99 additions and 82 deletions
|
|
@ -23,14 +23,10 @@ LL | | }
|
|||
| |_____- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: consider importing one of these items
|
||||
help: consider importing this function
|
||||
|
|
||||
LL | use bar::g;
|
||||
|
|
||||
LL | use foo::test2::test::g;
|
||||
|
|
||||
LL | use foo::test::g;
|
||||
|
|
||||
|
||||
error[E0425]: cannot find function `f` in this scope
|
||||
--> $DIR/globs.rs:61:12
|
||||
|
|
|
|||
12
src/test/ui/issues/issue-26545.rs
Normal file
12
src/test/ui/issues/issue-26545.rs
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
mod foo {
|
||||
pub struct B(pub ());
|
||||
}
|
||||
|
||||
mod baz {
|
||||
fn foo() {
|
||||
B(());
|
||||
//~^ ERROR cannot find function, tuple struct or tuple variant `B` in this scope [E0425]
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
14
src/test/ui/issues/issue-26545.stderr
Normal file
14
src/test/ui/issues/issue-26545.stderr
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
error[E0425]: cannot find function, tuple struct or tuple variant `B` in this scope
|
||||
--> $DIR/issue-26545.rs:7:9
|
||||
|
|
||||
LL | B(());
|
||||
| ^ not found in this scope
|
||||
|
|
||||
help: consider importing this tuple struct
|
||||
|
|
||||
LL | use foo::B;
|
||||
|
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0425`.
|
||||
|
|
@ -33,7 +33,7 @@ fn qux() -> Some {
|
|||
fn main() {}
|
||||
|
||||
mod x {
|
||||
enum Enum {
|
||||
pub enum Enum {
|
||||
Variant1,
|
||||
Variant2(),
|
||||
Variant3(usize),
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
mod foo {
|
||||
pub struct B(());
|
||||
pub struct Bx(());
|
||||
}
|
||||
|
||||
mod bar {
|
||||
use foo::B;
|
||||
use foo::Bx;
|
||||
|
||||
fn foo() {
|
||||
B(());
|
||||
//~^ ERROR expected function, tuple struct or tuple variant, found struct `B` [E0423]
|
||||
Bx(());
|
||||
//~^ ERROR expected function, tuple struct or tuple variant, found struct `Bx` [E0423]
|
||||
}
|
||||
}
|
||||
|
||||
mod baz {
|
||||
fn foo() {
|
||||
B(());
|
||||
//~^ ERROR cannot find function, tuple struct or tuple variant `B` in this scope [E0425]
|
||||
Bx(());
|
||||
//~^ ERROR cannot find function, tuple struct or tuple variant `Bx` in this scope [E0425]
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
error[E0423]: expected function, tuple struct or tuple variant, found struct `B`
|
||||
error[E0423]: expected function, tuple struct or tuple variant, found struct `Bx`
|
||||
--> $DIR/issue-42944.rs:9:9
|
||||
|
|
||||
LL | B(());
|
||||
| ^ constructor is not visible here due to private fields
|
||||
LL | Bx(());
|
||||
| ^^ constructor is not visible here due to private fields
|
||||
|
||||
error[E0425]: cannot find function, tuple struct or tuple variant `B` in this scope
|
||||
error[E0425]: cannot find function, tuple struct or tuple variant `Bx` in this scope
|
||||
--> $DIR/issue-42944.rs:16:9
|
||||
|
|
||||
LL | B(());
|
||||
| ^ not found in this scope
|
||||
LL | Bx(());
|
||||
| ^^ not found in this scope
|
||||
|
|
||||
help: consider importing this tuple struct
|
||||
|
|
||||
LL | use foo::B;
|
||||
LL | use foo::Bx;
|
||||
|
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
|
|
|||
|
|
@ -15,12 +15,10 @@ error[E0423]: expected function, found module `foo`
|
|||
LL | foo();
|
||||
| ^^^ not a function
|
||||
|
|
||||
help: consider importing one of these items instead
|
||||
help: consider importing this function instead
|
||||
|
|
||||
LL | use foo::foo;
|
||||
|
|
||||
LL | use m1::foo;
|
||||
|
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -4,12 +4,10 @@ error[E0425]: cannot find function `foo` in this scope
|
|||
LL | fn sub() -> isize { foo(); 1 }
|
||||
| ^^^ not found in this scope
|
||||
|
|
||||
help: consider importing one of these items
|
||||
help: consider importing this function
|
||||
|
|
||||
LL | use foo::foo;
|
||||
|
|
||||
LL | use m1::foo;
|
||||
|
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -11,14 +11,10 @@ help: a unit struct with a similar name exists
|
|||
|
|
||||
LL | Baz();
|
||||
| ^^^
|
||||
help: consider importing one of these items instead
|
||||
|
|
||||
LL | use foo1::Bar;
|
||||
help: consider importing this function instead
|
||||
|
|
||||
LL | use foo2::Bar;
|
||||
|
|
||||
LL | use foo3::Bar;
|
||||
|
|
||||
|
||||
error[E0425]: cannot find function, tuple struct or tuple variant `Bar` in this scope
|
||||
--> $DIR/privacy-ns1.rs:51:5
|
||||
|
|
@ -33,14 +29,10 @@ help: a unit struct with a similar name exists
|
|||
|
|
||||
LL | Baz();
|
||||
| ^^^
|
||||
help: consider importing one of these items
|
||||
|
|
||||
LL | use foo1::Bar;
|
||||
help: consider importing this function
|
||||
|
|
||||
LL | use foo2::Bar;
|
||||
|
|
||||
LL | use foo3::Bar;
|
||||
|
|
||||
|
||||
error[E0412]: cannot find type `Bar` in this scope
|
||||
--> $DIR/privacy-ns1.rs:52:17
|
||||
|
|
@ -55,14 +47,10 @@ help: a struct with a similar name exists
|
|||
|
|
||||
LL | let _x: Box<Baz>;
|
||||
| ^^^
|
||||
help: consider importing one of these items
|
||||
help: consider importing this trait
|
||||
|
|
||||
LL | use foo1::Bar;
|
||||
|
|
||||
LL | use foo2::Bar;
|
||||
|
|
||||
LL | use foo3::Bar;
|
||||
|
|
||||
|
||||
error[E0107]: wrong number of const arguments: expected 0, found 1
|
||||
--> $DIR/privacy-ns1.rs:35:17
|
||||
|
|
|
|||
|
|
@ -4,14 +4,10 @@ error[E0423]: expected function, tuple struct or tuple variant, found trait `Bar
|
|||
LL | Bar();
|
||||
| ^^^ not a function, tuple struct or tuple variant
|
||||
|
|
||||
help: consider importing one of these items instead
|
||||
|
|
||||
LL | use foo1::Bar;
|
||||
help: consider importing this function instead
|
||||
|
|
||||
LL | use foo2::Bar;
|
||||
|
|
||||
LL | use foo3::Bar;
|
||||
|
|
||||
|
||||
error[E0423]: expected function, tuple struct or tuple variant, found trait `Bar`
|
||||
--> $DIR/privacy-ns2.rs:26:5
|
||||
|
|
@ -26,14 +22,10 @@ help: a unit struct with a similar name exists
|
|||
|
|
||||
LL | Baz();
|
||||
| ^^^
|
||||
help: consider importing one of these items instead
|
||||
|
|
||||
LL | use foo1::Bar;
|
||||
help: consider importing this function instead
|
||||
|
|
||||
LL | use foo2::Bar;
|
||||
|
|
||||
LL | use foo3::Bar;
|
||||
|
|
||||
|
||||
error[E0573]: expected type, found function `Bar`
|
||||
--> $DIR/privacy-ns2.rs:43:14
|
||||
|
|
@ -45,14 +37,10 @@ help: use `=` if you meant to assign
|
|||
|
|
||||
LL | let _x = Bar();
|
||||
| ^
|
||||
help: consider importing one of these items instead
|
||||
help: consider importing this trait instead
|
||||
|
|
||||
LL | use foo1::Bar;
|
||||
|
|
||||
LL | use foo2::Bar;
|
||||
|
|
||||
LL | use foo3::Bar;
|
||||
|
|
||||
|
||||
error[E0603]: trait `Bar` is private
|
||||
--> $DIR/privacy-ns2.rs:63:15
|
||||
|
|
|
|||
|
|
@ -25,11 +25,8 @@ LL | use mul1::Mul;
|
|||
|
|
||||
LL | use mul2::Mul;
|
||||
|
|
||||
LL | use mul3::Mul;
|
||||
LL | use std::ops::Mul;
|
||||
|
|
||||
LL | use mul4::Mul;
|
||||
|
|
||||
and 2 other candidates
|
||||
|
||||
error[E0405]: cannot find trait `ThisTraitReallyDoesntExistInAnyModuleReally` in this scope
|
||||
--> $DIR/issue-21221-1.rs:63:6
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue