Fix leaking non-public 'use' statements with glob imports

This commit is contained in:
Alex Crichton 2013-02-25 14:10:42 -05:00
parent e1d3a4fb3e
commit 94a07b6e4a
2 changed files with 43 additions and 1 deletions

View File

@ -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);
}

View File

@ -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
}