librustc: Forbid access to cross-crate private static methods
This commit is contained in:
parent
56d288d0dc
commit
5726fd4526
5 changed files with 46 additions and 17 deletions
|
@ -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())));
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
|
|
10
src/test/auxiliary/xc_private_method_lib.rs
Normal file
10
src/test/auxiliary/xc_private_method_lib.rs
Normal file
|
@ -0,0 +1,10 @@
|
|||
#[crate_type="lib"];
|
||||
|
||||
pub struct Foo {
|
||||
x: int
|
||||
}
|
||||
|
||||
impl Foo {
|
||||
fn new() -> Foo { Foo { x: 1 } }
|
||||
}
|
||||
|
9
src/test/compile-fail/xc-private-method.rs
Normal file
9
src/test/compile-fail/xc-private-method.rs
Normal file
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in a new issue