diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 2b0263a47365..e9ed6f382614 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2480,7 +2480,7 @@ pub impl Resolver { // Here we merge two import resolutions. match module_.import_resolutions.find(&ident) { - None => { + None if target_import_resolution.privacy == Public => { // Simple: just copy the old import resolution. let new_import_resolution = @mut ImportResolution(privacy, @@ -2494,6 +2494,7 @@ pub impl Resolver { module_.import_resolutions.insert (ident, new_import_resolution); } + None => { /* continue ... */ } Some(dest_import_resolution) => { // Merge the two import resolutions at a finer-grained // level. @@ -2756,6 +2757,8 @@ pub impl Resolver { namespace); } Some(target) => { + debug!("(resolving item in lexical scope) using \ + import resolution"); import_resolution.state.used = true; return Success(copy target); } diff --git a/src/test/compile-fail/issue-4366.rs b/src/test/compile-fail/issue-4366.rs new file mode 100644 index 000000000000..568baa1e857f --- /dev/null +++ b/src/test/compile-fail/issue-4366.rs @@ -0,0 +1,39 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// regression test for issue 4366 + +// ensures that 'use foo:*' doesn't import non-public 'use' statements in the +// module 'foo' + +mod foo { + pub fn foo() {} +} +mod a { + pub mod b { + use foo::foo; + type bar = int; + } + pub mod sub { + use a::b::*; + fn sub() -> bar { foo(); 1 } //~ ERROR: unresolved name: foo + //~^ ERROR: unresolved name: bar + } +} + +mod m1 { + fn foo() {} +} +use m1::*; + +fn main() { + foo(); //~ ERROR: unresolved name: foo +} +