提交 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)
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,
......
......@@ -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")
}
}
}
}
......@@ -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))
}
......
......@@ -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",
......@@ -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())));
}
}
_ => {}
......
#[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.
先完成此消息的编辑!
想要评论请 注册