diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-02-26 00:34:45 -0500 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-02-28 17:59:56 -0500 |
| commit | f2837fa3f53b304b5c9a79d733dfd56da5f32637 (patch) | |
| tree | b71b65916329aa4af060d7b1393d482df0202cdb | |
| parent | 94a07b6e4adbe0c2cd49673d58641852390f5639 (diff) | |
| download | rust-f2837fa3f53b304b5c9a79d733dfd56da5f32637.tar.gz rust-f2837fa3f53b304b5c9a79d733dfd56da5f32637.zip | |
Fix leaking immediate children and types via glob imports
| -rw-r--r-- | src/librustc/middle/resolve.rs | 18 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-4366.rs | 6 |
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` } |
