detect when suggested paths enter extern crates more rigorously
This commit is contained in:
parent
7953910464
commit
a3ee0bb726
@ -758,17 +758,14 @@ fn lookup_import_candidates_from_module<FilterFn>(
|
||||
{
|
||||
let mut candidates = Vec::new();
|
||||
let mut seen_modules = FxHashSet::default();
|
||||
let not_local_module = crate_name.name != kw::Crate;
|
||||
let mut worklist =
|
||||
vec![(start_module, Vec::<ast::PathSegment>::new(), true, not_local_module)];
|
||||
let mut worklist = vec![(start_module, Vec::<ast::PathSegment>::new(), true)];
|
||||
let mut worklist_via_import = vec![];
|
||||
|
||||
while let Some((in_module, path_segments, accessible, in_module_is_extern)) =
|
||||
match worklist.pop() {
|
||||
None => worklist_via_import.pop(),
|
||||
Some(x) => Some(x),
|
||||
}
|
||||
{
|
||||
while let Some((in_module, path_segments, accessible)) = match worklist.pop() {
|
||||
None => worklist_via_import.pop(),
|
||||
Some(x) => Some(x),
|
||||
} {
|
||||
let in_module_is_extern = !in_module.def_id().unwrap().is_local();
|
||||
// We have to visit module children in deterministic order to avoid
|
||||
// instabilities in reported imports (#43552).
|
||||
in_module.for_each_child(self, |this, ident, ns, name_binding| {
|
||||
@ -850,11 +847,10 @@ fn lookup_import_candidates_from_module<FilterFn>(
|
||||
name_binding.is_extern_crate() && lookup_ident.span.rust_2018();
|
||||
|
||||
if !is_extern_crate_that_also_appears_in_prelude {
|
||||
let is_extern = in_module_is_extern || name_binding.is_extern_crate();
|
||||
// add the module to the lookup
|
||||
if seen_modules.insert(module.def_id().unwrap()) {
|
||||
if via_import { &mut worklist_via_import } else { &mut worklist }
|
||||
.push((module, path_segments, child_accessible, is_extern));
|
||||
.push((module, path_segments, child_accessible));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
18
src/test/ui/resolve/auxiliary/issue-80079.rs
Normal file
18
src/test/ui/resolve/auxiliary/issue-80079.rs
Normal file
@ -0,0 +1,18 @@
|
||||
#![crate_type = "lib"]
|
||||
|
||||
pub mod public {
|
||||
use private_import;
|
||||
|
||||
// should not be suggested since it is private
|
||||
struct Foo;
|
||||
|
||||
mod private_module {
|
||||
// should not be suggested since it is private
|
||||
pub struct Foo;
|
||||
}
|
||||
}
|
||||
|
||||
mod private_import {
|
||||
// should not be suggested since it is private
|
||||
pub struct Foo;
|
||||
}
|
12
src/test/ui/resolve/issue-80079.rs
Normal file
12
src/test/ui/resolve/issue-80079.rs
Normal file
@ -0,0 +1,12 @@
|
||||
// aux-build:issue-80079.rs
|
||||
|
||||
// using a module from another crate should not cause errors to suggest private
|
||||
// items in that module
|
||||
|
||||
extern crate issue_80079;
|
||||
|
||||
use issue_80079::public;
|
||||
|
||||
fn main() {
|
||||
let _ = Foo; //~ ERROR cannot find value `Foo` in this scope
|
||||
}
|
9
src/test/ui/resolve/issue-80079.stderr
Normal file
9
src/test/ui/resolve/issue-80079.stderr
Normal file
@ -0,0 +1,9 @@
|
||||
error[E0425]: cannot find value `Foo` in this scope
|
||||
--> $DIR/issue-80079.rs:11:13
|
||||
|
|
||||
LL | let _ = Foo;
|
||||
| ^^^ not found in this scope
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0425`.
|
Loading…
Reference in New Issue
Block a user