提交 87d93167 编写于 作者: B bors

auto merge of #5457 : pcwalton/rust/xcpsm, r=pcwalton

r? @catamorphism
...@@ -229,11 +229,11 @@ pub fn struct_dtor(cstore: @mut cstore::CStore, def: ast::def_id) ...@@ -229,11 +229,11 @@ pub fn struct_dtor(cstore: @mut cstore::CStore, def: ast::def_id)
decoder::struct_dtor(cdata, def.node) decoder::struct_dtor(cdata, def.node)
} }
pub fn get_method_visibility(cstore: @mut cstore::CStore, pub fn get_item_visibility(cstore: @mut cstore::CStore,
def_id: ast::def_id) def_id: ast::def_id)
-> ast::visibility { -> ast::visibility {
let cdata = cstore::get_crate_data(cstore, def_id.crate); 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, pub fn get_link_args_for_crate(cstore: @mut cstore::CStore,
......
...@@ -145,13 +145,16 @@ fn item_family(item: ebml::Doc) -> Family { ...@@ -145,13 +145,16 @@ fn item_family(item: ebml::Doc) -> Family {
} }
fn item_visibility(item: ebml::Doc) -> ast::visibility { fn item_visibility(item: ebml::Doc) -> ast::visibility {
let visibility = reader::get_doc(item, tag_items_data_item_visibility); match reader::maybe_get_doc(item, tag_items_data_item_visibility) {
debug!("item visibility for %?", item_family(item)); None => ast::public,
match reader::doc_as_u8(visibility) as char { Some(visibility_doc) => {
'y' => ast::public, match reader::doc_as_u8(visibility_doc) as char {
'n' => ast::private, 'y' => ast::public,
'i' => ast::inherited, 'n' => ast::private,
_ => fail!(~"unknown visibility character"), 'i' => ast::inherited,
_ => fail!(~"unknown visibility character")
}
}
} }
} }
...@@ -909,8 +912,8 @@ pub fn get_struct_fields(intr: @ident_interner, cdata: cmd, id: ast::node_id) ...@@ -909,8 +912,8 @@ pub fn get_struct_fields(intr: @ident_interner, cdata: cmd, id: ast::node_id)
result result
} }
pub fn get_method_visibility(cdata: cmd, id: ast::node_id) pub fn get_item_visibility(cdata: cmd, id: ast::node_id)
-> ast::visibility { -> ast::visibility {
item_visibility(lookup_item(id, cdata.data)) item_visibility(lookup_item(id, cdata.data))
} }
......
...@@ -265,8 +265,7 @@ pub fn check_crate(tcx: ty::ctxt, ...@@ -265,8 +265,7 @@ pub fn check_crate(tcx: ty::ctxt,
} }
} else { } else {
let visibility = let visibility =
csearch::get_method_visibility(tcx.sess.cstore, csearch::get_item_visibility(tcx.sess.cstore, method_id);
method_id);
if visibility != public { if visibility != public {
tcx.sess.span_err(span, tcx.sess.span_err(span,
fmt!("method `%s` is private", fmt!("method `%s` is private",
...@@ -298,8 +297,16 @@ pub fn check_crate(tcx: ty::ctxt, ...@@ -298,8 +297,16 @@ pub fn check_crate(tcx: ty::ctxt,
.idents .idents
.last()))); .last())));
} }
} else { } else if csearch::get_item_visibility(tcx.sess.cstore,
// XXX: Check privacy in external crates. def_id) != public {
tcx.sess.span_err(span,
fmt!("function `%s` is private",
*tcx.sess
.parse_sess
.interner
.get(copy *path
.idents
.last())));
} }
} }
_ => {} _ => {}
......
#[crate_type="lib"];
pub struct Foo {
x: int
}
impl Foo {
fn new() -> Foo { Foo { x: 1 } }
}
// 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
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册