about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-02-25 14:10:42 -0500
committerAlex Crichton <alex@alexcrichton.com>2013-02-28 17:59:56 -0500
commit94a07b6e4adbe0c2cd49673d58641852390f5639 (patch)
treec8d57f4e1d7c08bcc533ee0f369886a6da2df3b5
parente1d3a4fb3e2f5b165142adc382de1b226eb688f7 (diff)
downloadrust-94a07b6e4adbe0c2cd49673d58641852390f5639.tar.gz
rust-94a07b6e4adbe0c2cd49673d58641852390f5639.zip
Fix leaking non-public 'use' statements with glob imports
-rw-r--r--src/librustc/middle/resolve.rs5
-rw-r--r--src/test/compile-fail/issue-4366.rs39
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
+}
+