about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-02-26 00:34:45 -0500
committerAlex Crichton <alex@alexcrichton.com>2013-02-28 17:59:56 -0500
commitf2837fa3f53b304b5c9a79d733dfd56da5f32637 (patch)
treeb71b65916329aa4af060d7b1393d482df0202cdb
parent94a07b6e4adbe0c2cd49673d58641852390f5639 (diff)
downloadrust-f2837fa3f53b304b5c9a79d733dfd56da5f32637.tar.gz
rust-f2837fa3f53b304b5c9a79d733dfd56da5f32637.zip
Fix leaking immediate children and types via glob imports
-rw-r--r--src/librustc/middle/resolve.rs18
-rw-r--r--src/test/compile-fail/issue-4366.rs6
2 files changed, 18 insertions, 6 deletions
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs
index e9ed6f38261..924886881ef 100644
--- a/src/librustc/middle/resolve.rs
+++ b/src/librustc/middle/resolve.rs
@@ -622,6 +622,19 @@ pub impl NameBindings {
         }
     }
 
+    fn defined_in_public_namespace(namespace: Namespace) -> bool {
+        match namespace {
+            TypeNS => match self.type_def {
+                Some(def) => def.privacy != Private,
+                None => false
+            },
+            ValueNS => match self.value_def {
+                Some(def) => def.privacy != Private,
+                None => false
+            }
+        }
+    }
+
     fn def_for_namespace(namespace: Namespace) -> Option<def> {
         match namespace {
             TypeNS => {
@@ -2538,7 +2551,6 @@ pub impl Resolver {
                 }
             }
 
-
             debug!("(resolving glob import) writing resolution `%s` in `%s` \
                     to `%s`, privacy=%?",
                    *self.session.str_of(ident),
@@ -2547,12 +2559,12 @@ pub impl Resolver {
                    dest_import_resolution.privacy);
 
             // Merge the child item into the import resolution.
-            if (*name_bindings).defined_in_namespace(ValueNS) {
+            if (*name_bindings).defined_in_public_namespace(ValueNS) {
                 debug!("(resolving glob import) ... for value target");
                 dest_import_resolution.value_target =
                     Some(Target(containing_module, name_bindings));
             }
-            if (*name_bindings).defined_in_namespace(TypeNS) {
+            if (*name_bindings).defined_in_public_namespace(TypeNS) {
                 debug!("(resolving glob import) ... for type target");
                 dest_import_resolution.type_target =
                     Some(Target(containing_module, name_bindings));
diff --git a/src/test/compile-fail/issue-4366.rs b/src/test/compile-fail/issue-4366.rs
index 568baa1e857..d4d97c69354 100644
--- a/src/test/compile-fail/issue-4366.rs
+++ b/src/test/compile-fail/issue-4366.rs
@@ -23,8 +23,8 @@ mod a {
     }
     pub mod sub {
         use a::b::*;
-        fn sub() -> bar { foo(); 1 } //~ ERROR: unresolved name: foo
-        //~^ ERROR: unresolved name: bar
+        fn sub() -> bar { foo(); 1 } //~ ERROR: unresolved name: `foo`
+        //~^ ERROR: use of undeclared type name `bar`
     }
 }
 
@@ -34,6 +34,6 @@ mod m1 {
 use m1::*;
 
 fn main() {
-    foo(); //~ ERROR: unresolved name: foo
+    foo(); //~ ERROR: unresolved name: `foo`
 }