diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-02-25 14:10:42 -0500 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-02-28 17:59:56 -0500 |
| commit | 94a07b6e4adbe0c2cd49673d58641852390f5639 (patch) | |
| tree | c8d57f4e1d7c08bcc533ee0f369886a6da2df3b5 | |
| parent | e1d3a4fb3e2f5b165142adc382de1b226eb688f7 (diff) | |
| download | rust-94a07b6e4adbe0c2cd49673d58641852390f5639.tar.gz rust-94a07b6e4adbe0c2cd49673d58641852390f5639.zip | |
Fix leaking non-public 'use' statements with glob imports
| -rw-r--r-- | src/librustc/middle/resolve.rs | 5 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-4366.rs | 39 |
2 files changed, 43 insertions, 1 deletions
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 2b0263a4736..e9ed6f38261 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 00000000000..568baa1e857 --- /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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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 +} + |
