Skip to content

Commit

Permalink
auto merge of #5457 : pcwalton/rust/xcpsm, r=pcwalton
Browse files Browse the repository at this point in the history
  • Loading branch information
bors committed Mar 21, 2013
2 parents 56d288d + 5726fd4 commit 87d9316
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 17 deletions.
8 changes: 4 additions & 4 deletions src/librustc/metadata/csearch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,11 @@ pub fn struct_dtor(cstore: @mut cstore::CStore, def: ast::def_id)
decoder::struct_dtor(cdata, def.node)
}

pub fn get_method_visibility(cstore: @mut cstore::CStore,
def_id: ast::def_id)
-> ast::visibility {
pub fn get_item_visibility(cstore: @mut cstore::CStore,
def_id: ast::def_id)
-> ast::visibility {
let cdata = cstore::get_crate_data(cstore, def_id.crate);
decoder::get_method_visibility(cdata, def_id.node)
decoder::get_item_visibility(cdata, def_id.node)
}

pub fn get_link_args_for_crate(cstore: @mut cstore::CStore,
Expand Down
21 changes: 12 additions & 9 deletions src/librustc/metadata/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,13 +145,16 @@ fn item_family(item: ebml::Doc) -> Family {
}

fn item_visibility(item: ebml::Doc) -> ast::visibility {
let visibility = reader::get_doc(item, tag_items_data_item_visibility);
debug!("item visibility for %?", item_family(item));
match reader::doc_as_u8(visibility) as char {
'y' => ast::public,
'n' => ast::private,
'i' => ast::inherited,
_ => fail!(~"unknown visibility character"),
match reader::maybe_get_doc(item, tag_items_data_item_visibility) {
None => ast::public,
Some(visibility_doc) => {
match reader::doc_as_u8(visibility_doc) as char {
'y' => ast::public,
'n' => ast::private,
'i' => ast::inherited,
_ => fail!(~"unknown visibility character")
}
}
}
}

Expand Down Expand Up @@ -909,8 +912,8 @@ pub fn get_struct_fields(intr: @ident_interner, cdata: cmd, id: ast::node_id)
result
}

pub fn get_method_visibility(cdata: cmd, id: ast::node_id)
-> ast::visibility {
pub fn get_item_visibility(cdata: cmd, id: ast::node_id)
-> ast::visibility {
item_visibility(lookup_item(id, cdata.data))
}

Expand Down
15 changes: 11 additions & 4 deletions src/librustc/middle/privacy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,7 @@ pub fn check_crate(tcx: ty::ctxt,
}
} else {
let visibility =
csearch::get_method_visibility(tcx.sess.cstore,
method_id);
csearch::get_item_visibility(tcx.sess.cstore, method_id);
if visibility != public {
tcx.sess.span_err(span,
fmt!("method `%s` is private",
Expand Down Expand Up @@ -298,8 +297,16 @@ pub fn check_crate(tcx: ty::ctxt,
.idents
.last())));
}
} else {
// XXX: Check privacy in external crates.
} else if csearch::get_item_visibility(tcx.sess.cstore,
def_id) != public {
tcx.sess.span_err(span,
fmt!("function `%s` is private",
*tcx.sess
.parse_sess
.interner
.get(copy *path
.idents
.last())));
}
}
_ => {}
Expand Down
10 changes: 10 additions & 0 deletions src/test/auxiliary/xc_private_method_lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#[crate_type="lib"];

pub struct Foo {
x: int
}

impl Foo {
fn new() -> Foo { Foo { x: 1 } }
}

9 changes: 9 additions & 0 deletions src/test/compile-fail/xc-private-method.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// xfail-fast
// aux-build:xc_private_method_lib.rs

extern mod xc_private_method_lib;

fn main() {
let _ = xc_private_method_lib::Foo::new(); //~ ERROR function `new` is private
}

0 comments on commit 87d9316

Please sign in to comment.