From 10a583ce1ac28a8cbf34b0f4274285f33bdfce29 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 7 Aug 2013 00:11:34 -0700 Subject: [PATCH 1/2] Correctly encode item visibility in metadata This fixes private statics and functions from being usable cross-crates, along with some bad privacy error messages. This is a reopening of #8365 with all the privacy checks in privacy.rs instead of resolve.rs (where they should be anyway). These maps of exported items will hopefully get used for generating documentation by rustdoc Closes #8592 --- src/libextra/arc.rs | 4 +- src/libextra/workcache.rs | 12 +- src/librustc/driver/driver.rs | 7 +- src/librustc/metadata/csearch.rs | 9 +- src/librustc/metadata/decoder.rs | 43 ++-- src/librustc/metadata/encoder.rs | 23 ++- src/librustc/metadata/filesearch.rs | 2 +- src/librustc/middle/privacy.rs | 190 +++++++++++++----- src/librustc/middle/resolve.rs | 30 ++- src/librustc/middle/trans/base.rs | 2 + src/librustc/middle/trans/context.rs | 4 + src/libsyntax/ext/build.rs | 2 +- src/libsyntax/parse/obsolete.rs | 17 -- src/libsyntax/parse/parser.rs | 39 +--- src/test/auxiliary/issue2378a.rs | 2 +- src/test/auxiliary/issue2378b.rs | 2 +- src/test/auxiliary/nested_item.rs | 2 +- src/test/auxiliary/packed.rs | 2 +- src/test/auxiliary/static_priv_by_default.rs | 57 ++++++ src/test/compile-fail/obsolete-syntax.rs | 6 +- .../compile-fail/priv-in-bad-locations.rs | 28 +++ .../compile-fail/static-priv-by-default.rs | 39 ++++ .../compile-fail/static-priv-by-default2.rs | 29 +++ src/test/compile-fail/useless-priv2.rs | 5 - src/test/compile-fail/xc-private-method.rs | 22 +- src/test/compile-fail/xc-private-method2.rs | 20 ++ .../compile-fail/xcrate-private-by-default.rs | 57 ++++++ 27 files changed, 494 insertions(+), 161 deletions(-) create mode 100644 src/test/auxiliary/static_priv_by_default.rs create mode 100644 src/test/compile-fail/priv-in-bad-locations.rs create mode 100644 src/test/compile-fail/static-priv-by-default.rs create mode 100644 src/test/compile-fail/static-priv-by-default2.rs create mode 100644 src/test/compile-fail/xc-private-method2.rs create mode 100644 src/test/compile-fail/xcrate-private-by-default.rs diff --git a/src/libextra/arc.rs b/src/libextra/arc.rs index ca8000c984d4a..28a067a782bc4 100644 --- a/src/libextra/arc.rs +++ b/src/libextra/arc.rs @@ -162,7 +162,7 @@ struct MutexArcInner { priv lock: Mutex, priv failed: bool, priv data: T } /// An Arc with mutable data protected by a blocking mutex. #[no_freeze] -struct MutexArc { priv x: UnsafeArc> } +pub struct MutexArc { priv x: UnsafeArc> } impl Clone for MutexArc { @@ -343,7 +343,7 @@ struct RWArcInner { priv lock: RWLock, priv failed: bool, priv data: T } * Unlike mutex_arcs, rw_arcs are safe, because they cannot be nested. */ #[no_freeze] -struct RWArc { +pub struct RWArc { priv x: UnsafeArc>, } diff --git a/src/libextra/workcache.rs b/src/libextra/workcache.rs index 24ab8360e8fab..e24fe3eb8c25e 100644 --- a/src/libextra/workcache.rs +++ b/src/libextra/workcache.rs @@ -127,7 +127,7 @@ impl WorkMap { } } -struct Database { +pub struct Database { db_filename: Path, db_cache: TreeMap<~str, ~str>, db_dirty: bool @@ -207,7 +207,7 @@ impl Drop for Database { } } -struct Logger { +pub struct Logger { // FIXME #4432: Fill in a: () } @@ -223,10 +223,10 @@ impl Logger { } } -type FreshnessMap = TreeMap<~str,extern fn(&str,&str)->bool>; +pub type FreshnessMap = TreeMap<~str,extern fn(&str,&str)->bool>; #[deriving(Clone)] -struct Context { +pub struct Context { db: RWArc, logger: RWArc, cfg: Arc, @@ -239,13 +239,13 @@ struct Context { freshness: Arc } -struct Prep<'self> { +pub struct Prep<'self> { ctxt: &'self Context, fn_name: &'self str, declared_inputs: WorkMap, } -struct Exec { +pub struct Exec { discovered_inputs: WorkMap, discovered_outputs: WorkMap } diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index c9a5ca2c61c40..5518dde0ee979 100644 --- a/src/librustc/driver/driver.rs +++ b/src/librustc/driver/driver.rs @@ -197,6 +197,7 @@ pub fn phase_2_configure_and_expand(sess: Session, pub struct CrateAnalysis { exp_map2: middle::resolve::ExportMap2, + exported_items: @middle::privacy::ExportedItems, ty_cx: ty::ctxt, maps: astencode::Maps, reachable: @mut HashSet @@ -258,8 +259,9 @@ pub fn phase_3_run_analysis_passes(sess: Session, middle::check_const::check_crate(sess, crate, ast_map, def_map, method_map, ty_cx)); - time(time_passes, ~"privacy checking", || - middle::privacy::check_crate(ty_cx, &method_map, crate)); + let exported_items = + time(time_passes, ~"privacy checking", || + middle::privacy::check_crate(ty_cx, &method_map, &exp_map2, crate)); time(time_passes, ~"effect checking", || middle::effect::check_crate(ty_cx, method_map, crate)); @@ -301,6 +303,7 @@ pub fn phase_3_run_analysis_passes(sess: Session, CrateAnalysis { exp_map2: exp_map2, + exported_items: @exported_items, ty_cx: ty_cx, maps: astencode::Maps { root_map: root_map, diff --git a/src/librustc/metadata/csearch.rs b/src/librustc/metadata/csearch.rs index bc7cba46c6b1d..841142ee62fe8 100644 --- a/src/librustc/metadata/csearch.rs +++ b/src/librustc/metadata/csearch.rs @@ -27,7 +27,8 @@ use syntax::diagnostic::expect; pub struct StaticMethodInfo { ident: ast::Ident, def_id: ast::DefId, - purity: ast::purity + purity: ast::purity, + vis: ast::visibility, } pub fn get_symbol(cstore: @mut cstore::CStore, def: ast::DefId) -> ~str { @@ -52,7 +53,8 @@ pub fn each_lang_item(cstore: @mut cstore::CStore, /// Iterates over each child of the given item. pub fn each_child_of_item(cstore: @mut cstore::CStore, def_id: ast::DefId, - callback: &fn(decoder::DefLike, ast::Ident)) { + callback: &fn(decoder::DefLike, ast::Ident, + ast::visibility)) { let crate_data = cstore::get_crate_data(cstore, def_id.crate); let get_crate_data: decoder::GetCrateDataCb = |cnum| { cstore::get_crate_data(cstore, cnum) @@ -68,7 +70,8 @@ pub fn each_child_of_item(cstore: @mut cstore::CStore, pub fn each_top_level_item_of_crate(cstore: @mut cstore::CStore, cnum: ast::CrateNum, callback: &fn(decoder::DefLike, - ast::Ident)) { + ast::Ident, + ast::visibility)) { let crate_data = cstore::get_crate_data(cstore, cnum); let get_crate_data: decoder::GetCrateDataCb = |cnum| { cstore::get_crate_data(cstore, cnum) diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index c94151095a442..fe7309d4467fa 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -96,7 +96,7 @@ fn find_item(item_id: int, items: ebml::Doc) -> ebml::Doc { // Looks up an item in the given metadata and returns an ebml doc pointing // to the item data. -fn lookup_item(item_id: int, data: @~[u8]) -> ebml::Doc { +pub fn lookup_item(item_id: int, data: @~[u8]) -> ebml::Doc { let items = reader::get_doc(reader::Doc(data), tag_items); find_item(item_id, items) } @@ -291,7 +291,7 @@ fn enum_variant_ids(item: ebml::Doc, cdata: Cmd) -> ~[ast::DefId] { return ids; } -fn item_path(item_doc: ebml::Doc) -> ast_map::path { +pub fn item_path(item_doc: ebml::Doc) -> ast_map::path { let path_doc = reader::get_doc(item_doc, tag_path); let len_doc = reader::get_doc(path_doc, tag_path_len); @@ -332,7 +332,7 @@ fn item_name(intr: @ident_interner, item: ebml::Doc) -> ast::Ident { } } -fn item_to_def_like(item: ebml::Doc, did: ast::DefId, cnum: ast::CrateNum) +pub fn item_to_def_like(item: ebml::Doc, did: ast::DefId, cnum: ast::CrateNum) -> DefLike { let fam = item_family(item); match fam { @@ -491,7 +491,7 @@ pub enum DefLike { DlField } -fn def_like_to_def(def_like: DefLike) -> ast::Def { +pub fn def_like_to_def(def_like: DefLike) -> ast::Def { match def_like { DlDef(def) => return def, DlImpl(*) => fail!("found impl in def_like_to_def"), @@ -544,7 +544,8 @@ impl<'self> EachItemContext<'self> { fn process_item_and_pop_name(&mut self, doc: ebml::Doc, def_id: ast::DefId, - old_len: uint) + old_len: uint, + vis: ast::visibility) -> bool { let def_like = item_to_def_like(doc, def_id, self.cdata.cnum); match def_like { @@ -563,8 +564,6 @@ impl<'self> EachItemContext<'self> { } } - let vis = item_visibility(doc); - let mut continue = (self.callback)(*self.path_builder, def_like, vis); let family = item_family(doc); @@ -653,9 +652,12 @@ impl<'self> EachItemContext<'self> { self.push_name(token::ident_to_str(&child_name)); // Process this item. + + let vis = item_visibility(child_item_doc); continue = self.process_item_and_pop_name(child_item_doc, child_def_id, - old_len); + old_len, + vis); } } continue @@ -701,12 +703,13 @@ impl<'self> EachItemContext<'self> { // Get the item. match maybe_find_item(def_id.node, other_crates_items) { - None => {} + None => { self.pop_name(old_len); } Some(reexported_item_doc) => { continue = self.process_item_and_pop_name( reexported_item_doc, def_id, - old_len); + old_len, + ast::public); } } @@ -721,7 +724,8 @@ fn each_child_of_item_or_crate(intr: @ident_interner, cdata: Cmd, item_doc: ebml::Doc, get_crate_data: GetCrateDataCb, - callback: &fn(DefLike, ast::Ident)) { + callback: &fn(DefLike, ast::Ident, + ast::visibility)) { // Iterate over all children. let _ = do reader::tagged_docs(item_doc, tag_mod_child) |child_info_doc| { let child_def_id = reader::with_doc_data(child_info_doc, @@ -746,7 +750,8 @@ fn each_child_of_item_or_crate(intr: @ident_interner, let def_like = item_to_def_like(child_item_doc, child_def_id, cdata.cnum); - callback(def_like, child_name); + let visibility = item_visibility(child_item_doc); + callback(def_like, child_name, visibility); } } @@ -788,7 +793,8 @@ fn each_child_of_item_or_crate(intr: @ident_interner, impl_method_def_id, cdata.cnum); callback(static_method_def_like, - static_method_name); + static_method_name, + item_visibility(impl_method_doc)); } _ => {} } @@ -831,7 +837,8 @@ fn each_child_of_item_or_crate(intr: @ident_interner, let def_like = item_to_def_like(child_item_doc, child_def_id, cdata.cnum); - callback(def_like, token::str_to_ident(name)); + callback(def_like, token::str_to_ident(name), + item_visibility(child_item_doc)); } } @@ -844,7 +851,7 @@ pub fn each_child_of_item(intr: @ident_interner, cdata: Cmd, id: ast::NodeId, get_crate_data: GetCrateDataCb, - callback: &fn(DefLike, ast::Ident)) { + callback: &fn(DefLike, ast::Ident, ast::visibility)) { // Find the item. let root_doc = reader::Doc(cdata.data); let items = reader::get_doc(root_doc, tag_items); @@ -864,7 +871,8 @@ pub fn each_child_of_item(intr: @ident_interner, pub fn each_top_level_item_of_crate(intr: @ident_interner, cdata: Cmd, get_crate_data: GetCrateDataCb, - callback: &fn(DefLike, ast::Ident)) { + callback: &fn(DefLike, ast::Ident, + ast::visibility)) { let root_doc = reader::Doc(cdata.data); let misc_info_doc = reader::get_doc(root_doc, tag_misc_info); let crate_items_doc = reader::get_doc(misc_info_doc, @@ -1161,7 +1169,8 @@ pub fn get_static_methods_if_impl(intr: @ident_interner, static_impl_methods.push(StaticMethodInfo { ident: item_name(intr, impl_method_doc), def_id: item_def_id(impl_method_doc, cdata), - purity: purity + purity: purity, + vis: item_visibility(impl_method_doc), }); } _ => {} diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 9e65e4ec18a97..de60927f2a29d 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -16,9 +16,9 @@ use metadata::cstore; use metadata::decoder; use metadata::tyencode; use middle::ty::{node_id_to_type, lookup_item_type}; +use middle::astencode; use middle::ty; use middle::typeck; -use middle::astencode; use middle; use std::hashmap::{HashMap, HashSet}; @@ -58,6 +58,7 @@ pub struct EncodeParams<'self> { diag: @mut span_handler, tcx: ty::ctxt, reexports2: middle::resolve::ExportMap2, + exported_items: @middle::privacy::ExportedItems, item_symbols: &'self HashMap, discrim_symbols: &'self HashMap, non_inlineable_statics: &'self HashSet, @@ -88,6 +89,7 @@ pub struct EncodeContext<'self> { tcx: ty::ctxt, stats: @mut Stats, reexports2: middle::resolve::ExportMap2, + exported_items: @middle::privacy::ExportedItems, item_symbols: &'self HashMap, discrim_symbols: &'self HashMap, non_inlineable_statics: &'self HashSet, @@ -881,7 +883,8 @@ fn encode_info_for_item(ecx: &EncodeContext, ebml_w: &mut writer::Encoder, item: @item, index: @mut ~[entry], - path: &[ast_map::path_elt]) { + path: &[ast_map::path_elt], + vis: ast::visibility) { let tcx = ecx.tcx; fn add_to_index_(item: @item, ebml_w: &writer::Encoder, @@ -912,6 +915,7 @@ fn encode_info_for_item(ecx: &EncodeContext, if !ecx.non_inlineable_statics.contains(&item.id) { (ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item)); } + encode_visibility(ebml_w, vis); ebml_w.end_tag(); } item_fn(_, purity, _, ref generics, _) => { @@ -929,6 +933,7 @@ fn encode_info_for_item(ecx: &EncodeContext, } else { encode_symbol(ecx, ebml_w, item.id); } + encode_visibility(ebml_w, vis); ebml_w.end_tag(); } item_mod(ref m) => { @@ -955,7 +960,7 @@ fn encode_info_for_item(ecx: &EncodeContext, ebml_w.wr_str(def_to_str(local_def(foreign_item.id))); ebml_w.end_tag(); } - + encode_visibility(ebml_w, vis); ebml_w.end_tag(); } item_ty(*) => { @@ -967,6 +972,7 @@ fn encode_info_for_item(ecx: &EncodeContext, encode_name(ecx, ebml_w, item.ident); encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); encode_region_param(ecx, ebml_w, item); + encode_visibility(ebml_w, vis); ebml_w.end_tag(); } item_enum(ref enum_definition, ref generics) => { @@ -987,6 +993,7 @@ fn encode_info_for_item(ecx: &EncodeContext, // Encode inherent implementations for this enumeration. encode_inherent_implementations(ecx, ebml_w, def_id); + encode_visibility(ebml_w, vis); ebml_w.end_tag(); encode_enum_variant_info(ecx, @@ -1018,6 +1025,7 @@ fn encode_info_for_item(ecx: &EncodeContext, encode_attributes(ebml_w, item.attrs); encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); encode_region_param(ecx, ebml_w, item); + encode_visibility(ebml_w, vis); /* Encode def_ids for each field and method for methods, write all the stuff get_trait_method @@ -1264,7 +1272,12 @@ fn my_visit_item(i:@item, items: ast_map::map, ebml_w:&writer::Encoder, let mut ebml_w = ebml_w.clone(); // See above let ecx : &EncodeContext = unsafe { cast::transmute(ecx_ptr) }; - encode_info_for_item(ecx, &mut ebml_w, i, index, *pt); + let vis = if ecx.exported_items.contains(&i.id) { + ast::public + } else { + ast::inherited + }; + encode_info_for_item(ecx, &mut ebml_w, i, index, *pt, vis); } _ => fail!("bad item") } @@ -1727,6 +1740,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] { diag, tcx, reexports2, + exported_items, discrim_symbols, cstore, encode_inlined_item, @@ -1742,6 +1756,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] { tcx: tcx, stats: stats, reexports2: reexports2, + exported_items: exported_items, item_symbols: item_symbols, discrim_symbols: discrim_symbols, non_inlineable_statics: non_inlineable_statics, diff --git a/src/librustc/metadata/filesearch.rs b/src/librustc/metadata/filesearch.rs index 892217988c7cb..c719146c99995 100644 --- a/src/librustc/metadata/filesearch.rs +++ b/src/librustc/metadata/filesearch.rs @@ -150,7 +150,7 @@ fn make_rustpkg_target_lib_path(dir: &Path, dir.push_rel(&Path(libdir()).push(target_triple.to_owned())) } -fn get_or_default_sysroot() -> Path { +pub fn get_or_default_sysroot() -> Path { match os::self_exe_path() { option::Some(ref p) => (*p).pop(), option::None => fail!("can't determine value for sysroot") diff --git a/src/librustc/middle/privacy.rs b/src/librustc/middle/privacy.rs index 51fe2acc72ad4..3c60bd67362f7 100644 --- a/src/librustc/middle/privacy.rs +++ b/src/librustc/middle/privacy.rs @@ -9,9 +9,13 @@ // except according to those terms. //! A pass that checks to make sure private fields and methods aren't used -//! outside their scopes. +//! outside their scopes. This pass will also generate a set of exported items +//! which are available for use externally when compiled as a library. + +use std::hashmap::HashSet; use metadata::csearch; +use middle::resolve::ExportMap2; use middle::ty::{ty_struct, ty_enum}; use middle::ty; use middle::typeck::{method_map, method_origin, method_param}; @@ -37,9 +41,23 @@ use syntax::visit; use syntax::visit::Visitor; use syntax::ast::{_mod,Expr,item,Block,Pat}; +// This set is a set of all item nodes which can be used by external crates if +// we're building a library. The necessary qualifications for this are that all +// items leading down to the current item (excluding an `impl`) must be `pub`. +pub type ExportedItems = HashSet; + +type Context<'self> = (&'self method_map, &'self ExportMap2); + struct PrivacyVisitor { tcx: ty::ctxt, privileged_items: @mut ~[NodeId], + + // A set of all items which are re-exported to be used across crates + exported_items: ExportedItems, + + // A flag as to whether the current path is public all the way down to the + // current point or not + path_all_public: bool, } impl PrivacyVisitor { @@ -265,15 +283,20 @@ impl PrivacyVisitor { .last() .identifier))); } - } else if csearch::get_item_visibility(self.tcx.sess.cstore, - def_id) != public { - self.tcx.sess.span_err(span, - fmt!("function `%s` is private", - token::ident_to_str( - &path.segments - .last() - .identifier))); + //} else if csearch::get_item_visibility(self.tcx.sess.cstore, + // def_id) != public { + // self.tcx.sess.span_err(span, + // fmt!("function `%s` is private", + // token::ident_to_str( + // &path.segments + // .last() + // .identifier))); } + // If this is a function from a non-local crate, then the + // privacy check is enforced during resolve. All public items + // will be tagged as such in the crate metadata and then usage + // of the private items will be blocked during resolve. Hence, + // if this isn't from the local crate, nothing to check. } _ => {} } @@ -341,31 +364,78 @@ impl PrivacyVisitor { } } -impl<'self> Visitor<&'self method_map> for PrivacyVisitor { +impl<'self> Visitor> for PrivacyVisitor { - fn visit_mod<'mm>(&mut self, the_module:&_mod, _:Span, _:NodeId, - method_map:&'mm method_map) { + fn visit_mod(&mut self, the_module:&_mod, _:Span, _:NodeId, + cx: Context<'self>) { let n_added = self.add_privileged_items(the_module.items); - visit::walk_mod(self, the_module, method_map); + visit::walk_mod(self, the_module, cx); do n_added.times { ignore(self.privileged_items.pop()); } } - fn visit_item<'mm>(&mut self, item:@item, method_map:&'mm method_map) { + fn visit_item(&mut self, item:@item, cx: Context<'self>) { + + // Do not check privacy inside items with the resolve_unexported + // attribute. This is used for the test runner. + if attr::contains_name(item.attrs, "!resolve_unexported") { + return; + } + + // Disallow unnecessary visibility qualifiers + check_sane_privacy(self.tcx, item); - // Do not check privacy inside items with the resolve_unexported - // attribute. This is used for the test runner. - if !attr::contains_name(item.attrs, "!resolve_unexported") { - check_sane_privacy(self.tcx, item); - visit::walk_item(self, item, method_map); + // Keep track of whether this item is available for export or not. + let orig_all_pub = self.path_all_public; + match item.node { + // impls/extern blocks do not break the "public chain" because they + // cannot have visibility qualifiers on them anyway + ast::item_impl(*) | ast::item_foreign_mod(*) => {} + + // Private by default, hence we only retain the "public chain" if + // `pub` is explicitly listed. + _ => { + self.path_all_public = orig_all_pub && item.vis == ast::public; + } + } + debug2!("public path at {}: {}", item.id, self.path_all_public); + + if self.path_all_public { + debug2!("all the way public {}", item.id); + self.exported_items.insert(item.id); + + // All re-exported items in a module which is public should also be + // public (in terms of how they should get encoded) + match item.node { + ast::item_mod(*) => { + let (_, exp_map2) = cx; + match exp_map2.find(&item.id) { + Some(exports) => { + for export in exports.iter() { + if export.reexport && is_local(export.def_id) { + debug2!("found reexported {:?}", export); + let id = export.def_id.node; + self.exported_items.insert(id); + } + } + } + None => {} + } + } + _ => {} } + } + + visit::walk_item(self, item, cx); + + self.path_all_public = orig_all_pub; } - fn visit_block<'mm>(&mut self, block:&Block, method_map:&'mm method_map) { + fn visit_block(&mut self, block:&Block, cx: Context<'self>) { // Gather up all the privileged items. let mut n_added = 0; @@ -383,7 +453,7 @@ impl<'self> Visitor<&'self method_map> for PrivacyVisitor { } } - visit::walk_block(self, block, method_map); + visit::walk_block(self, block, cx); do n_added.times { ignore(self.privileged_items.pop()); @@ -391,8 +461,8 @@ impl<'self> Visitor<&'self method_map> for PrivacyVisitor { } - fn visit_expr<'mm>(&mut self, expr:@Expr, method_map:&'mm method_map) { - + fn visit_expr(&mut self, expr:@Expr, cx: Context<'self>) { + let (method_map, _) = cx; match expr.node { ExprField(base, ident, _) => { // Method calls are now a special syntactic form, @@ -499,11 +569,11 @@ impl<'self> Visitor<&'self method_map> for PrivacyVisitor { _ => {} } - visit::walk_expr(self, expr, method_map); + visit::walk_expr(self, expr, cx); } - fn visit_pat<'mm>(&mut self, pattern:@Pat, method_map:&'mm method_map) { + fn visit_pat(&mut self, pattern:@Pat, cx: Context<'self>) { match pattern.node { PatStruct(_, ref fields, _) => { @@ -550,20 +620,24 @@ impl<'self> Visitor<&'self method_map> for PrivacyVisitor { _ => {} } - visit::walk_pat(self, pattern, method_map); + visit::walk_pat(self, pattern, cx); } } -pub fn check_crate<'mm>(tcx: ty::ctxt, - method_map: &'mm method_map, - crate: &ast::Crate) { +pub fn check_crate(tcx: ty::ctxt, + method_map: &method_map, + exp_map2: &ExportMap2, + crate: &ast::Crate) -> ExportedItems { let privileged_items = @mut ~[]; let mut visitor = PrivacyVisitor { tcx: tcx, privileged_items: privileged_items, + exported_items: HashSet::new(), + path_all_public: true, // start out as public }; - visit::walk_crate(&mut visitor, crate, method_map); + visit::walk_crate(&mut visitor, crate, (method_map, exp_map2)); + return visitor.exported_items; } /// Validates all of the visibility qualifers placed on the item given. This @@ -571,17 +645,45 @@ pub fn check_crate<'mm>(tcx: ty::ctxt, /// anything. In theory these qualifiers wouldn't parse, but that may happen /// later on down the road... fn check_sane_privacy(tcx: ty::ctxt, item: @ast::item) { + let check_inherited = |sp: Span, vis: ast::visibility, note: &str| { + if vis != ast::inherited { + tcx.sess.span_err(sp, "unnecessary visibility qualifier"); + if note.len() > 0 { + tcx.sess.span_note(sp, note); + } + } + }; + let check_not_priv = |sp: Span, vis: ast::visibility, note: &str| { + if vis == ast::private { + tcx.sess.span_err(sp, "unnecessary `priv` qualifier"); + if note.len() > 0 { + tcx.sess.span_note(sp, note); + } + } + }; match item.node { // implementations of traits don't need visibility qualifiers because // that's controlled by having the trait in scope. ast::item_impl(_, Some(*), _, ref methods) => { + check_inherited(item.span, item.vis, + "visibility qualifiers have no effect on trait impls"); for m in methods.iter() { - match m.vis { - ast::private | ast::public => { - tcx.sess.span_err(m.span, "unnecessary visibility") - } - ast::inherited => {} - } + check_inherited(m.span, m.vis, ""); + } + } + + ast::item_impl(_, _, _, ref methods) => { + check_inherited(item.span, item.vis, + "place qualifiers on individual methods instead"); + for i in methods.iter() { + check_not_priv(i.span, i.vis, "functions are private by default"); + } + } + ast::item_foreign_mod(ref fm) => { + check_inherited(item.span, item.vis, + "place qualifiers on individual functions instead"); + for i in fm.items.iter() { + check_not_priv(i.span, i.vis, "functions are private by default"); } } @@ -624,22 +726,18 @@ fn check_sane_privacy(tcx: ty::ctxt, item: @ast::item) { for m in methods.iter() { match *m { ast::provided(ref m) => { - match m.vis { - ast::private | ast::public => { - tcx.sess.span_err(m.span, "unnecessary \ - visibility"); - } - ast::inherited => {} - } + check_inherited(m.span, m.vis, + "unnecessary visibility"); } - // this is warned about in the parser ast::required(*) => {} } } } - ast::item_impl(*) | ast::item_static(*) | ast::item_foreign_mod(*) | + ast::item_static(*) | ast::item_fn(*) | ast::item_mod(*) | ast::item_ty(*) | - ast::item_mac(*) => {} + ast::item_mac(*) => { + check_not_priv(item.span, item.vis, "items are private by default"); + } } } diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 3a9ef3cf06f03..320baf3318164 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -1661,6 +1661,9 @@ impl Resolver { ident: Ident, new_parent: ReducedGraphParent) { let privacy = visibility_to_privacy(visibility); + debug!("(building reduced graph for \ + external crate) building external def, priv %?", + privacy); match def { DefMod(def_id) | DefForeignMod(def_id) | DefStruct(def_id) | DefTy(def_id) => { @@ -1788,7 +1791,8 @@ impl Resolver { fn build_reduced_graph_for_external_crate_def(@mut self, root: @mut Module, def_like: DefLike, - ident: Ident) { + ident: Ident, + visibility: visibility) { match def_like { DlDef(def) => { // Add the new child item, if necessary. @@ -1798,11 +1802,12 @@ impl Resolver { // eagerly. do csearch::each_child_of_item(self.session.cstore, def_id) - |def_like, child_ident| { + |def_like, child_ident, vis| { self.build_reduced_graph_for_external_crate_def( root, def_like, - child_ident) + child_ident, + vis) } } _ => { @@ -1813,7 +1818,7 @@ impl Resolver { dummy_sp()); self.handle_external_def(def, - public, + visibility, child_name_bindings, self.session.str_of(ident), ident, @@ -1897,10 +1902,11 @@ impl Resolver { let def = DefFn( static_method_info.def_id, static_method_info.purity); + + let p = visibility_to_privacy( + static_method_info.vis); method_name_bindings.define_value( - Public, - def, - dummy_sp()); + p, def, dummy_sp()); } } @@ -1931,12 +1937,13 @@ impl Resolver { }; do csearch::each_child_of_item(self.session.cstore, def_id) - |def_like, child_ident| { + |def_like, child_ident, visibility| { debug!("(populating external module) ... found ident: %s", token::ident_to_str(&child_ident)); self.build_reduced_graph_for_external_crate_def(module, def_like, - child_ident) + child_ident, + visibility) } module.populated = true } @@ -1956,10 +1963,11 @@ impl Resolver { root: @mut Module) { do csearch::each_top_level_item_of_crate(self.session.cstore, root.def_id.unwrap().crate) - |def_like, ident| { + |def_like, ident, visibility| { self.build_reduced_graph_for_external_crate_def(root, def_like, - ident) + ident, + visibility) } } diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 67aee43bc46b4..f9527e6935ccc 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -3008,6 +3008,7 @@ pub fn crate_ctxt_to_encode_parms<'r>(cx: &'r CrateContext, ie: encoder::encode_ diag: diag, tcx: cx.tcx, reexports2: cx.exp_map2, + exported_items: cx.exported_items, item_symbols: item_symbols, discrim_symbols: discrim_symbols, non_inlineable_statics: &cx.non_inlineable_statics, @@ -3101,6 +3102,7 @@ pub fn trans_crate(sess: session::Session, llmod_id, analysis.ty_cx, analysis.exp_map2, + analysis.exported_items, analysis.maps, symbol_hasher, link_meta, diff --git a/src/librustc/middle/trans/context.rs b/src/librustc/middle/trans/context.rs index e342bcaf4faf7..134db45be43cb 100644 --- a/src/librustc/middle/trans/context.rs +++ b/src/librustc/middle/trans/context.rs @@ -16,6 +16,7 @@ use lib::llvm::{llvm, TargetData, TypeNames}; use lib::llvm::mk_target_data; use metadata::common::LinkMeta; use middle::astencode; +use middle::privacy; use middle::resolve; use middle::trans::adt; use middle::trans::base; @@ -49,6 +50,7 @@ pub struct CrateContext { intrinsics: HashMap<&'static str, ValueRef>, item_vals: HashMap, exp_map2: resolve::ExportMap2, + exported_items: @privacy::ExportedItems, reachable: @mut HashSet, item_symbols: HashMap, link_meta: LinkMeta, @@ -127,6 +129,7 @@ impl CrateContext { name: &str, tcx: ty::ctxt, emap2: resolve::ExportMap2, + exported_items: @privacy::ExportedItems, maps: astencode::Maps, symbol_hasher: hash::State, link_meta: LinkMeta, @@ -187,6 +190,7 @@ impl CrateContext { intrinsics: intrinsics, item_vals: HashMap::new(), exp_map2: emap2, + exported_items: exported_items, reachable: reachable, item_symbols: HashMap::new(), link_meta: link_meta, diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index ba2342d78279e..5111682f6d061 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -702,7 +702,7 @@ impl AstBuilder for @ExtCtxt { attrs: attrs, id: ast::DUMMY_NODE_ID, node: node, - vis: ast::public, + vis: ast::inherited, span: span } } diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs index b056b39eb6e89..fe2aa05584d13 100644 --- a/src/libsyntax/parse/obsolete.rs +++ b/src/libsyntax/parse/obsolete.rs @@ -44,7 +44,6 @@ pub enum ObsoleteSyntax { ObsoleteImplSyntax, ObsoleteMutOwnedPointer, ObsoleteMutVector, - ObsoleteImplVisibility, ObsoleteRecordType, ObsoleteRecordPattern, ObsoletePostFnTySigil, @@ -60,9 +59,7 @@ pub enum ObsoleteSyntax { ObsoleteNamedExternModule, ObsoleteMultipleLocalDecl, ObsoleteMutWithMultipleBindings, - ObsoleteExternVisibility, ObsoleteUnsafeExternFn, - ObsoletePrivVisibility, ObsoleteTraitFuncVisibility, ObsoleteConstPointer, } @@ -161,11 +158,6 @@ impl ParserObsoleteMethods for Parser { in a mutable location, like a mutable local variable or an \ `@mut` box" ), - ObsoleteImplVisibility => ( - "visibility-qualified implementation", - "`pub` or `priv` goes on individual functions; remove the \ - `pub` or `priv`" - ), ObsoleteRecordType => ( "structural record type", "use a structure instead" @@ -233,20 +225,11 @@ impl ParserObsoleteMethods for Parser { "use multiple local declarations instead of e.g. `let mut \ (x, y) = ...`." ), - ObsoleteExternVisibility => ( - "`pub extern` or `priv extern`", - "place the `pub` or `priv` on the individual external items \ - instead" - ), ObsoleteUnsafeExternFn => ( "unsafe external function", "external functions are always unsafe; remove the `unsafe` \ keyword" ), - ObsoletePrivVisibility => ( - "`priv` not necessary", - "an item without a visibility qualifier is private by default" - ), ObsoleteTraitFuncVisibility => ( "visibility not necessary", "trait functions inherit the visibility of the trait itself" diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 4aad5c24d0f3d..c0dcafa8fb2c1 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -922,7 +922,7 @@ impl Parser { let attrs = p.parse_outer_attributes(); let lo = p.span.lo; - let vis = p.parse_non_priv_visibility(); + let vis = p.parse_visibility(); let pur = p.parse_fn_purity(); // NB: at the moment, trait methods are public by default; this // could change. @@ -3753,7 +3753,7 @@ impl Parser { let attrs = self.parse_outer_attributes(); let lo = self.span.lo; - let visa = self.parse_non_priv_visibility(); + let visa = self.parse_visibility(); let pur = self.parse_fn_purity(); let ident = self.parse_ident(); let generics = self.parse_generics(); @@ -3801,7 +3801,7 @@ impl Parser { // Parses two variants (with the region/type params always optional): // impl Foo { ... } // impl ToStr for ~[T] { ... } - fn parse_item_impl(&self, visibility: ast::visibility) -> item_info { + fn parse_item_impl(&self) -> item_info { // First, parse type parameters if necessary. let generics = self.parse_generics(); @@ -3846,11 +3846,6 @@ impl Parser { None }; - // Do not allow visibility to be specified. - if visibility != ast::inherited { - self.obsolete(*self.span, ObsoleteImplVisibility); - } - let mut meths = ~[]; if !self.eat(&token::SEMI) { self.expect(&token::LBRACE); @@ -4012,18 +4007,6 @@ impl Parser { else { inherited } } - // parse visibility, but emits an obsolete error if it's private - fn parse_non_priv_visibility(&self) -> visibility { - match self.parse_visibility() { - public => public, - inherited => inherited, - private => { - self.obsolete(*self.last_span, ObsoletePrivVisibility); - inherited - } - } - } - fn parse_staticness(&self) -> bool { if self.eat_keyword(keywords::Static) { self.obsolete(*self.last_span, ObsoleteStaticMethod); @@ -4216,7 +4199,7 @@ impl Parser { // parse a function declaration from a foreign module fn parse_item_foreign_fn(&self, attrs: ~[Attribute]) -> @foreign_item { let lo = self.span.lo; - let vis = self.parse_non_priv_visibility(); + let vis = self.parse_visibility(); // Parse obsolete purity. let purity = self.parse_fn_purity(); @@ -4352,11 +4335,6 @@ impl Parser { self.obsolete(*self.last_span, ObsoleteNamedExternModule); } - // Do not allow visibility to be specified. - if visibility != ast::inherited { - self.obsolete(*self.last_span, ObsoleteExternVisibility); - } - let abis = opt_abis.unwrap_or(AbiSet::C()); let (inner, next) = self.parse_inner_attrs_and_next(); @@ -4367,7 +4345,7 @@ impl Parser { self.last_span.hi, ident, item_foreign_mod(m), - public, + visibility, maybe_append(attrs, Some(inner)))); } @@ -4614,7 +4592,7 @@ impl Parser { let lo = self.span.lo; - let visibility = self.parse_non_priv_visibility(); + let visibility = self.parse_visibility(); // must be a view item: if self.eat_keyword(keywords::Use) { @@ -4722,8 +4700,7 @@ impl Parser { } if self.eat_keyword(keywords::Impl) { // IMPL ITEM - let (ident, item_, extra_attrs) = - self.parse_item_impl(visibility); + let (ident, item_, extra_attrs) = self.parse_item_impl(); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); @@ -4746,7 +4723,7 @@ impl Parser { maybe_whole!(iovi self, nt_item); let lo = self.span.lo; - let visibility = self.parse_non_priv_visibility(); + let visibility = self.parse_visibility(); if (self.is_keyword(keywords::Const) || self.is_keyword(keywords::Static)) { // FOREIGN CONST ITEM diff --git a/src/test/auxiliary/issue2378a.rs b/src/test/auxiliary/issue2378a.rs index 88439e32b0dda..ea14229cc48a7 100644 --- a/src/test/auxiliary/issue2378a.rs +++ b/src/test/auxiliary/issue2378a.rs @@ -11,7 +11,7 @@ #[link (name = "issue2378a")]; #[crate_type = "lib"]; -enum maybe { just(T), nothing } +pub enum maybe { just(T), nothing } impl Index for maybe { fn index(&self, _idx: &uint) -> T { diff --git a/src/test/auxiliary/issue2378b.rs b/src/test/auxiliary/issue2378b.rs index d2c42bacc63a9..71c0bab138f46 100644 --- a/src/test/auxiliary/issue2378b.rs +++ b/src/test/auxiliary/issue2378b.rs @@ -15,7 +15,7 @@ extern mod issue2378a; use issue2378a::maybe; -struct two_maybes {a: maybe, b: maybe} +pub struct two_maybes {a: maybe, b: maybe} impl Index for two_maybes { fn index(&self, idx: &uint) -> (T, T) { diff --git a/src/test/auxiliary/nested_item.rs b/src/test/auxiliary/nested_item.rs index c2f38134d1ee9..96bae65639073 100644 --- a/src/test/auxiliary/nested_item.rs +++ b/src/test/auxiliary/nested_item.rs @@ -9,7 +9,7 @@ // except according to those terms. // original problem -fn foo() -> int { +pub fn foo() -> int { { static foo: int = 2; foo diff --git a/src/test/auxiliary/packed.rs b/src/test/auxiliary/packed.rs index 478d51b540cdf..150de8d314d8f 100644 --- a/src/test/auxiliary/packed.rs +++ b/src/test/auxiliary/packed.rs @@ -1,5 +1,5 @@ #[packed] -struct S { +pub struct S { a: u8, b: u32 } diff --git a/src/test/auxiliary/static_priv_by_default.rs b/src/test/auxiliary/static_priv_by_default.rs new file mode 100644 index 0000000000000..d46ccf299e822 --- /dev/null +++ b/src/test/auxiliary/static_priv_by_default.rs @@ -0,0 +1,57 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[crate_type = "lib"]; +#[no_std]; + +static private: int = 0; +pub static public: int = 0; + +pub struct A(()); + +impl A { + fn foo() {} +} + +mod foo { + pub static a: int = 0; + pub fn b() {} + pub struct c; + pub enum d {} + + pub struct A(()); + + impl A { + fn foo() {} + } + + // these are public so the parent can reexport them. + pub static reexported_a: int = 0; + pub fn reexported_b() {} + pub struct reexported_c; + pub enum reexported_d {} +} + +pub mod bar { + pub use e = foo::reexported_a; + pub use f = foo::reexported_b; + pub use g = foo::reexported_c; + pub use h = foo::reexported_d; +} + +pub static a: int = 0; +pub fn b() {} +pub struct c; +pub enum d {} + +static i: int = 0; +fn j() {} +struct k; +enum l {} diff --git a/src/test/compile-fail/obsolete-syntax.rs b/src/test/compile-fail/obsolete-syntax.rs index 49af0972341d1..872f3b1010e2a 100644 --- a/src/test/compile-fail/obsolete-syntax.rs +++ b/src/test/compile-fail/obsolete-syntax.rs @@ -54,9 +54,9 @@ extern mod obsolete_name { fn bar(); } -pub extern { - //~^ ERROR obsolete syntax: `pub extern` - pub fn bar(); +trait A { + pub fn foo(); //~ ERROR: visibility not necessary + pub fn bar(); //~ ERROR: visibility not necessary } fn main() { } diff --git a/src/test/compile-fail/priv-in-bad-locations.rs b/src/test/compile-fail/priv-in-bad-locations.rs new file mode 100644 index 0000000000000..db649ed0cc606 --- /dev/null +++ b/src/test/compile-fail/priv-in-bad-locations.rs @@ -0,0 +1,28 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub extern { + //~^ ERROR unnecessary visibility + pub fn bar(); +} + +trait A { + fn foo() {} +} + +struct B; + +pub impl B {} //~ ERROR: unnecessary visibility + +pub impl A for B { //~ ERROR: unnecessary visibility + pub fn foo() {} //~ ERROR: unnecessary visibility +} + +pub fn main() {} diff --git a/src/test/compile-fail/static-priv-by-default.rs b/src/test/compile-fail/static-priv-by-default.rs new file mode 100644 index 0000000000000..59d7e23855c18 --- /dev/null +++ b/src/test/compile-fail/static-priv-by-default.rs @@ -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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:static_priv_by_default.rs + +#[no_std]; + +extern mod static_priv_by_default; + +mod child { + pub mod childs_child { + static private: int = 0; + pub static public: int = 0; + } +} + +fn foo(_: int) {} + +fn full_ref() { + foo(static_priv_by_default::private); //~ ERROR: unresolved name + foo(static_priv_by_default::public); + foo(child::childs_child::private); //~ ERROR: unresolved name + foo(child::childs_child::public); +} + +fn medium_ref() { + use child::childs_child; + foo(childs_child::private); //~ ERROR: unresolved name + foo(childs_child::public); +} + +fn main() {} diff --git a/src/test/compile-fail/static-priv-by-default2.rs b/src/test/compile-fail/static-priv-by-default2.rs new file mode 100644 index 0000000000000..28a17cf5e1c5c --- /dev/null +++ b/src/test/compile-fail/static-priv-by-default2.rs @@ -0,0 +1,29 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:static_priv_by_default.rs + +extern mod static_priv_by_default; + +mod child { + pub mod childs_child { + static private: int = 0; + pub static public: int = 0; + } +} + +fn main() { + use static_priv_by_default::private; //~ ERROR: unresolved import + //~^ ERROR: failed to resolve + use static_priv_by_default::public; + use child::childs_child::private; //~ ERROR: unresolved import + //~^ ERROR: failed to resolve + use child::childs_child::public; +} diff --git a/src/test/compile-fail/useless-priv2.rs b/src/test/compile-fail/useless-priv2.rs index 0d94300329c2d..29c87e77ac02b 100644 --- a/src/test/compile-fail/useless-priv2.rs +++ b/src/test/compile-fail/useless-priv2.rs @@ -12,8 +12,3 @@ pub trait E { pub fn foo(); //~ ERROR: obsolete syntax } trait F { pub fn foo(); } //~ ERROR: obsolete syntax - -struct B; -impl E for B { - priv fn foo() {} //~ ERROR: obsolete syntax -} diff --git a/src/test/compile-fail/xc-private-method.rs b/src/test/compile-fail/xc-private-method.rs index 371bac7a902fe..b4a999766b541 100644 --- a/src/test/compile-fail/xc-private-method.rs +++ b/src/test/compile-fail/xc-private-method.rs @@ -1,16 +1,22 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + // xfail-fast // aux-build:xc_private_method_lib.rs extern mod xc_private_method_lib; fn main() { - // normal method on struct - let _ = xc_private_method_lib::Struct{ x: 10 }.meth_struct(); //~ ERROR method `meth_struct` is private - // static method on struct - let _ = xc_private_method_lib::Struct::static_meth_struct(); //~ ERROR method `static_meth_struct` is private + let _ = xc_private_method_lib::Struct::static_meth_struct(); + //~^ ERROR: unresolved name - // normal method on enum - let _ = xc_private_method_lib::Variant1(20).meth_enum(); //~ ERROR method `meth_enum` is private - // static method on enum - let _ = xc_private_method_lib::Enum::static_meth_enum(); //~ ERROR method `static_meth_enum` is private + let _ = xc_private_method_lib::Enum::static_meth_enum(); + //~^ ERROR: unresolved name } diff --git a/src/test/compile-fail/xc-private-method2.rs b/src/test/compile-fail/xc-private-method2.rs new file mode 100644 index 0000000000000..c2eaa9287f495 --- /dev/null +++ b/src/test/compile-fail/xc-private-method2.rs @@ -0,0 +1,20 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// xfail-fast +// aux-build:xc_private_method_lib.rs + +extern mod xc_private_method_lib; + +fn main() { + let _ = xc_private_method_lib::Struct{ x: 10 }.meth_struct(); //~ ERROR method `meth_struct` is private + + let _ = xc_private_method_lib::Variant1(20).meth_enum(); //~ ERROR method `meth_enum` is private +} diff --git a/src/test/compile-fail/xcrate-private-by-default.rs b/src/test/compile-fail/xcrate-private-by-default.rs new file mode 100644 index 0000000000000..38649981f939c --- /dev/null +++ b/src/test/compile-fail/xcrate-private-by-default.rs @@ -0,0 +1,57 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:static_priv_by_default.rs + +#[allow(unused_imports)]; +#[no_std]; + +extern mod static_priv_by_default; + +fn foo() {} + +#[start] +fn main(_: int, _: **u8, _: *u8) -> int { + // Actual public items should be public + static_priv_by_default::a; + static_priv_by_default::b; + static_priv_by_default::c; + foo::(); + + // publicly re-exported items should be available + static_priv_by_default::bar::e; + static_priv_by_default::bar::f; + static_priv_by_default::bar::g; + foo::(); + + // private items at the top should be inaccessible + static_priv_by_default::i; + //~^ ERROR: unresolved name + static_priv_by_default::j; + //~^ ERROR: unresolved name + static_priv_by_default::k; + //~^ ERROR: unresolved name + foo::(); + //~^ ERROR: use of undeclared type name + //~^^ ERROR: use of undeclared type name + + // public items in a private mod should be inaccessible + static_priv_by_default::foo::a; + //~^ ERROR: unresolved name + static_priv_by_default::foo::b; + //~^ ERROR: unresolved name + static_priv_by_default::foo::c; + //~^ ERROR: unresolved name + foo::(); + //~^ ERROR: use of undeclared type name + //~^^ ERROR: use of undeclared type name + + 3 +} From 30862a64c29985b044d9bf6f74fcf1394bc145c7 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 25 Sep 2013 00:43:37 -0700 Subject: [PATCH 2/2] Fix run-pass tests to have 'pub fn main' This is required by the check-fast target because each test is slurped up into a submodule. --- src/etc/combine-tests.py | 2 ++ src/test/run-pass/attr-no-drop-flag-size.rs | 2 +- src/test/run-pass/borrowck-macro-interaction-issue-6304.rs | 2 +- src/test/run-pass/borrowck-pat-enum.rs | 2 +- src/test/run-pass/borrowck-static-item-in-fn.rs | 2 +- src/test/run-pass/borrowck-unary-move-2.rs | 2 +- src/test/run-pass/borrowck-uniq-via-ref.rs | 2 +- ...owck-wg-autoderef-and-autoborrowvec-combined-issue-6272.rs | 2 +- src/test/run-pass/bug-7183-generics.rs | 2 +- .../run-pass/builtin-superkinds-capabilities-transitive.rs | 2 +- src/test/run-pass/builtin-superkinds-capabilities.rs | 2 +- src/test/run-pass/builtin-superkinds-phantom-typaram.rs | 2 +- src/test/run-pass/builtin-superkinds-self-type.rs | 2 +- src/test/run-pass/builtin-superkinds-simple.rs | 2 +- src/test/run-pass/builtin-superkinds-typaram.rs | 2 +- src/test/run-pass/cast-mutable-trait.rs | 4 ++-- src/test/run-pass/closure-bounds-can-capture-chan.rs | 2 +- src/test/run-pass/const-binops.rs | 2 +- src/test/run-pass/const-struct-offsets.rs | 2 +- src/test/run-pass/default-method-parsing.rs | 2 +- src/test/run-pass/default-method-supertrait-vtable.rs | 2 +- src/test/run-pass/deriving-clone-generic-enum.rs | 2 +- src/test/run-pass/deriving-clone-generic-tuple-struct.rs | 2 +- src/test/run-pass/deriving-clone-struct.rs | 2 +- src/test/run-pass/deriving-cmp-shortcircuit.rs | 2 +- src/test/run-pass/deriving-self-lifetime.rs | 2 +- src/test/run-pass/deriving-to-str.rs | 2 +- src/test/run-pass/deriving-zero.rs | 2 +- src/test/run-pass/enum-discr.rs | 2 +- src/test/run-pass/enum-vec-initializer.rs | 2 +- src/test/run-pass/expr-repeat-vstore.rs | 2 +- src/test/run-pass/extern-call-direct.rs | 2 +- src/test/run-pass/extern-compare-with-return-type.rs | 2 +- src/test/run-pass/extoption_env-not-defined.rs | 2 +- src/test/run-pass/filter-block-view-items.rs | 2 +- src/test/run-pass/foreach-external-iterators-break.rs | 2 +- .../foreach-external-iterators-hashmap-break-restart.rs | 4 ++-- src/test/run-pass/foreach-external-iterators-hashmap.rs | 4 ++-- src/test/run-pass/foreach-external-iterators-loop.rs | 2 +- src/test/run-pass/foreach-external-iterators-nested.rs | 2 +- src/test/run-pass/foreach-external-iterators.rs | 4 ++-- src/test/run-pass/func-arg-incomplete-pattern.rs | 4 ++-- src/test/run-pass/func-arg-ref-pattern.rs | 2 +- src/test/run-pass/func-arg-wild-pattern.rs | 2 +- src/test/run-pass/generic-static-methods.rs | 2 +- src/test/run-pass/hygiene-dodging-1.rs | 2 +- src/test/run-pass/issue-2611-3.rs | 2 +- src/test/run-pass/issue-3991.rs | 2 +- src/test/run-pass/issue-4333.rs | 2 +- src/test/run-pass/issue-4446.rs | 2 +- src/test/run-pass/issue-4735.rs | 2 +- .../run-pass/issue-5008-borrowed-traitobject-method-call.rs | 2 +- src/test/run-pass/issue-5060.rs | 2 +- src/test/run-pass/issue-5192.rs | 2 +- src/test/run-pass/issue-5239-2.rs | 2 +- src/test/run-pass/issue-5280.rs | 2 +- src/test/run-pass/issue-5315.rs | 2 +- src/test/run-pass/issue-5321-immediates-with-bare-self.rs | 2 +- src/test/run-pass/issue-5353.rs | 2 +- src/test/run-pass/issue-5517.rs | 2 +- src/test/run-pass/issue-5550.rs | 2 +- src/test/run-pass/issue-5572.rs | 2 +- src/test/run-pass/issue-5688.rs | 2 +- src/test/run-pass/issue-5708.rs | 2 +- src/test/run-pass/issue-5741.rs | 2 +- src/test/run-pass/issue-5917.rs | 2 +- src/test/run-pass/issue-6128.rs | 2 +- src/test/run-pass/issue-6130.rs | 2 +- src/test/run-pass/issue-6141-leaking-owned-fn.rs | 4 ++-- src/test/run-pass/issue-6153.rs | 2 +- src/test/run-pass/issue-6341.rs | 2 +- src/test/run-pass/issue-6344-let.rs | 2 +- src/test/run-pass/issue-6344-match.rs | 2 +- src/test/run-pass/issue-7012.rs | 2 +- src/test/run-pass/issue-7344.rs | 2 +- src/test/run-pass/issue-7519-match-unit-in-arg.rs | 2 +- .../run-pass/issue-7673-cast-generically-implemented-trait.rs | 2 +- src/test/run-pass/issue-7712.rs | 2 +- .../issue-8171-default-method-self-inherit-builtin-trait.rs | 2 +- src/test/run-pass/issue-8248.rs | 2 +- src/test/run-pass/issue-8249.rs | 2 +- src/test/run-pass/issue-8398.rs | 2 +- src/test/run-pass/issue-9047.rs | 2 +- src/test/run-pass/issue-9110.rs | 2 +- src/test/run-pass/let-destruct-ref.rs | 2 +- src/test/run-pass/let-var-hygiene.rs | 2 +- src/test/run-pass/link-section.rs | 2 +- src/test/run-pass/lint-cstack.rs | 2 +- ...lint-non-camel-case-types-non-uppercase-statics-unicode.rs | 2 +- .../lint-non-uppercase-statics-lowercase-mut-statics.rs | 2 +- src/test/run-pass/macro-local-data-key.rs | 2 +- src/test/run-pass/match-drop-strs-issue-4541.rs | 2 +- src/test/run-pass/match-in-macro.rs | 2 +- src/test/run-pass/match-pipe-binding.rs | 2 +- src/test/run-pass/match-range-static.rs | 2 +- src/test/run-pass/match-vec-rvalue.rs | 2 +- src/test/run-pass/mid-path-type-params.rs | 2 +- src/test/run-pass/move-out-of-field.rs | 2 +- src/test/run-pass/multibyte.rs | 2 +- src/test/run-pass/nested-enum-same-names.rs | 2 +- src/test/run-pass/nested-function-names-issue-8587.rs | 2 +- src/test/run-pass/newtype-struct-drop-run.rs | 2 +- src/test/run-pass/newtype-temporary.rs | 2 +- src/test/run-pass/objects-coerce-freeze-borrored.rs | 2 +- src/test/run-pass/objects-coerce-from-managed-to-borrowed.rs | 2 +- src/test/run-pass/owned-implies-static.rs | 2 +- src/test/run-pass/packed-struct-borrow-element.rs | 2 +- src/test/run-pass/packed-struct-generic-layout.rs | 2 +- src/test/run-pass/packed-struct-generic-size.rs | 2 +- src/test/run-pass/packed-struct-layout.rs | 2 +- src/test/run-pass/packed-struct-match.rs | 2 +- src/test/run-pass/packed-struct-size.rs | 2 +- src/test/run-pass/packed-struct-vec.rs | 2 +- src/test/run-pass/packed-tuple-struct-layout.rs | 2 +- src/test/run-pass/packed-tuple-struct-size.rs | 2 +- src/test/run-pass/pub-extern-privacy.rs | 2 +- src/test/run-pass/region-dependent-autofn.rs | 2 +- src/test/run-pass/region-dependent-autoslice.rs | 2 +- src/test/run-pass/send_str_hashmap.rs | 2 +- src/test/run-pass/send_str_treemap.rs | 2 +- src/test/run-pass/simd-binop.rs | 2 +- src/test/run-pass/simd-type.rs | 2 +- src/test/run-pass/sized-borrowed-pointer.rs | 2 +- src/test/run-pass/sized-owned-pointer.rs | 2 +- src/test/run-pass/static-assert.rs | 2 +- src/test/run-pass/struct-update-moves-and-copies.rs | 2 +- src/test/run-pass/syntax-extension-bytes.rs | 2 +- src/test/run-pass/tag-variant-disr-type-mismatch.rs | 2 +- src/test/run-pass/trait-bounds-basic.rs | 2 +- src/test/run-pass/trait-bounds-recursion.rs | 2 +- src/test/run-pass/trait-object-generics.rs | 2 +- src/test/run-pass/trait-with-bounds-default.rs | 2 +- src/test/run-pass/traits-default-method-mut.rs | 2 +- src/test/run-pass/transmute-non-immediate-to-immediate.rs | 2 +- src/test/run-pass/tuple-struct-constructor-pointer.rs | 2 +- src/test/run-pass/typeck-macro-interaction-issue-8852.rs | 4 ++-- src/test/run-pass/unfold-cross-crate.rs | 2 +- 137 files changed, 145 insertions(+), 143 deletions(-) diff --git a/src/etc/combine-tests.py b/src/etc/combine-tests.py index 36031d31149a9..692aa6871e604 100755 --- a/src/etc/combine-tests.py +++ b/src/etc/combine-tests.py @@ -29,6 +29,8 @@ def scrub(b): if not ("xfail-test" in s or "xfail-fast" in s or "xfail-win32" in s): + if not "pub fn main" in s and "fn main" in s: + print("Warning: no public entry point in " + t) stage2_tests.append(t) f.close() diff --git a/src/test/run-pass/attr-no-drop-flag-size.rs b/src/test/run-pass/attr-no-drop-flag-size.rs index e5470a1cff472..bbc6501bc774c 100644 --- a/src/test/run-pass/attr-no-drop-flag-size.rs +++ b/src/test/run-pass/attr-no-drop-flag-size.rs @@ -20,6 +20,6 @@ impl Drop for Test { fn drop(&mut self) { } } -fn main() { +pub fn main() { assert_eq!(size_of::(), size_of::>()); } diff --git a/src/test/run-pass/borrowck-macro-interaction-issue-6304.rs b/src/test/run-pass/borrowck-macro-interaction-issue-6304.rs index 65d377173c8e9..4e79013de833e 100644 --- a/src/test/run-pass/borrowck-macro-interaction-issue-6304.rs +++ b/src/test/run-pass/borrowck-macro-interaction-issue-6304.rs @@ -26,4 +26,4 @@ impl Foo { fn check_id(&mut self, s: int) { fail!() } } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/borrowck-pat-enum.rs b/src/test/run-pass/borrowck-pat-enum.rs index f320de39c8c3b..79cad643dfd86 100644 --- a/src/test/run-pass/borrowck-pat-enum.rs +++ b/src/test/run-pass/borrowck-pat-enum.rs @@ -43,5 +43,5 @@ fn match_mut_reg(v: &mut Option) { } } -fn main() { +pub fn main() { } diff --git a/src/test/run-pass/borrowck-static-item-in-fn.rs b/src/test/run-pass/borrowck-static-item-in-fn.rs index a3a7a1b8969d8..366752f46b003 100644 --- a/src/test/run-pass/borrowck-static-item-in-fn.rs +++ b/src/test/run-pass/borrowck-static-item-in-fn.rs @@ -10,6 +10,6 @@ // Regression test for issue #7740 -fn main() { +pub fn main() { static A: &'static char = &'A'; } diff --git a/src/test/run-pass/borrowck-unary-move-2.rs b/src/test/run-pass/borrowck-unary-move-2.rs index 2ab0f4262fb5c..87d42943fac97 100644 --- a/src/test/run-pass/borrowck-unary-move-2.rs +++ b/src/test/run-pass/borrowck-unary-move-2.rs @@ -26,7 +26,7 @@ fn noncopyable() -> noncopyable { struct wrapper(noncopyable); -fn main() { +pub fn main() { let x1 = wrapper(noncopyable()); let _x2 = *x1; } diff --git a/src/test/run-pass/borrowck-uniq-via-ref.rs b/src/test/run-pass/borrowck-uniq-via-ref.rs index 44f3a8f518a15..d50b4f15f4efe 100644 --- a/src/test/run-pass/borrowck-uniq-via-ref.rs +++ b/src/test/run-pass/borrowck-uniq-via-ref.rs @@ -50,5 +50,5 @@ fn box_imm_recs(v: &Outer) { borrow(v.f.g.h); // OK } -fn main() { +pub fn main() { } diff --git a/src/test/run-pass/borrowck-wg-autoderef-and-autoborrowvec-combined-issue-6272.rs b/src/test/run-pass/borrowck-wg-autoderef-and-autoborrowvec-combined-issue-6272.rs index 5da7a6f2b56cc..4ee0d42ae1315 100644 --- a/src/test/run-pass/borrowck-wg-autoderef-and-autoborrowvec-combined-issue-6272.rs +++ b/src/test/run-pass/borrowck-wg-autoderef-and-autoborrowvec-combined-issue-6272.rs @@ -27,7 +27,7 @@ // run-fail/borrowck-wg-autoderef-and-autoborrowvec-combined-fail-issue-6272.rs -fn main() { +pub fn main() { let a = @mut 3i; let b = @mut [a]; let c = @mut [3]; diff --git a/src/test/run-pass/bug-7183-generics.rs b/src/test/run-pass/bug-7183-generics.rs index 52264da2e80b6..45f4302a5afe3 100644 --- a/src/test/run-pass/bug-7183-generics.rs +++ b/src/test/run-pass/bug-7183-generics.rs @@ -33,7 +33,7 @@ impl Speak for Option { } -fn main() { +pub fn main() { assert_eq!(3.hi(), ~"hello: 3"); assert_eq!(Some(Some(3)).hi(), ~"something!something!hello: 3"); assert_eq!(None::.hi(), ~"hello - none"); diff --git a/src/test/run-pass/builtin-superkinds-capabilities-transitive.rs b/src/test/run-pass/builtin-superkinds-capabilities-transitive.rs index 74a218ac469a3..ec5af6929763f 100644 --- a/src/test/run-pass/builtin-superkinds-capabilities-transitive.rs +++ b/src/test/run-pass/builtin-superkinds-capabilities-transitive.rs @@ -26,7 +26,7 @@ fn foo(val: T, chan: comm::Chan) { chan.send(val); } -fn main() { +pub fn main() { let (p,c) = comm::stream(); foo(31337, c); assert!(p.recv() == 31337); diff --git a/src/test/run-pass/builtin-superkinds-capabilities.rs b/src/test/run-pass/builtin-superkinds-capabilities.rs index c2d2129b1c182..148fb5a340f15 100644 --- a/src/test/run-pass/builtin-superkinds-capabilities.rs +++ b/src/test/run-pass/builtin-superkinds-capabilities.rs @@ -22,7 +22,7 @@ fn foo(val: T, chan: comm::Chan) { chan.send(val); } -fn main() { +pub fn main() { let (p,c) = comm::stream(); foo(31337, c); assert!(p.recv() == 31337); diff --git a/src/test/run-pass/builtin-superkinds-phantom-typaram.rs b/src/test/run-pass/builtin-superkinds-phantom-typaram.rs index b6e58bfbf3d8f..740b8c2016a88 100644 --- a/src/test/run-pass/builtin-superkinds-phantom-typaram.rs +++ b/src/test/run-pass/builtin-superkinds-phantom-typaram.rs @@ -18,4 +18,4 @@ struct X(()); impl Foo for X { } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/builtin-superkinds-self-type.rs b/src/test/run-pass/builtin-superkinds-self-type.rs index 2285c471c9191..a8f5f27b4d9a3 100644 --- a/src/test/run-pass/builtin-superkinds-self-type.rs +++ b/src/test/run-pass/builtin-superkinds-self-type.rs @@ -21,7 +21,7 @@ trait Foo : Send { impl Foo for T { } -fn main() { +pub fn main() { let (p,c) = comm::stream(); 1193182.foo(c); assert!(p.recv() == 1193182); diff --git a/src/test/run-pass/builtin-superkinds-simple.rs b/src/test/run-pass/builtin-superkinds-simple.rs index 61a22d97498cb..9643e2986d2e5 100644 --- a/src/test/run-pass/builtin-superkinds-simple.rs +++ b/src/test/run-pass/builtin-superkinds-simple.rs @@ -14,4 +14,4 @@ trait Foo : Send { } impl Foo for int { } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/builtin-superkinds-typaram.rs b/src/test/run-pass/builtin-superkinds-typaram.rs index 7dfd1e0629f8b..d96679c69fd1b 100644 --- a/src/test/run-pass/builtin-superkinds-typaram.rs +++ b/src/test/run-pass/builtin-superkinds-typaram.rs @@ -15,4 +15,4 @@ trait Foo : Send { } impl Foo for T { } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/cast-mutable-trait.rs b/src/test/run-pass/cast-mutable-trait.rs index 633188b9a623b..ce026d3e2e026 100644 --- a/src/test/run-pass/cast-mutable-trait.rs +++ b/src/test/run-pass/cast-mutable-trait.rs @@ -25,10 +25,10 @@ fn bar(t: @mut T) { t.foo(); } -fn main() { +pub fn main() { let s = @mut S { unused: 0 }; let s2 = s as @mut T; s2.foo(); bar(s2); bar(s as @mut T); -} \ No newline at end of file +} diff --git a/src/test/run-pass/closure-bounds-can-capture-chan.rs b/src/test/run-pass/closure-bounds-can-capture-chan.rs index 95b0c9d79b7cb..d35d6d9f07e4e 100644 --- a/src/test/run-pass/closure-bounds-can-capture-chan.rs +++ b/src/test/run-pass/closure-bounds-can-capture-chan.rs @@ -14,7 +14,7 @@ fn foo(blk: ~fn:Send()) { blk(); } -fn main() { +pub fn main() { let (p,c) = comm::stream(); do foo { c.send(()); diff --git a/src/test/run-pass/const-binops.rs b/src/test/run-pass/const-binops.rs index cd87ca3ab537e..b3cb8580f7d64 100644 --- a/src/test/run-pass/const-binops.rs +++ b/src/test/run-pass/const-binops.rs @@ -56,7 +56,7 @@ static am: bool = 2 > 1; static an: bool = 2 > -2; static ao: bool = 1.0 > -2.0; -fn main() { +pub fn main() { assert_eq!(a, -1); assert_eq!(a2, 6); assert_approx_eq!(b, 5.7); diff --git a/src/test/run-pass/const-struct-offsets.rs b/src/test/run-pass/const-struct-offsets.rs index cd39c8df872d4..2bb0516cad449 100644 --- a/src/test/run-pass/const-struct-offsets.rs +++ b/src/test/run-pass/const-struct-offsets.rs @@ -10,4 +10,4 @@ struct Bar { static bar: Bar = Bar { i: 0, v: IntVal(0) }; -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/default-method-parsing.rs b/src/test/run-pass/default-method-parsing.rs index ec607102566aa..639ea59585efa 100644 --- a/src/test/run-pass/default-method-parsing.rs +++ b/src/test/run-pass/default-method-parsing.rs @@ -12,4 +12,4 @@ trait Foo { fn m(&self, _:int) { } } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/default-method-supertrait-vtable.rs b/src/test/run-pass/default-method-supertrait-vtable.rs index 90a2b91402124..0c6430fb36d09 100644 --- a/src/test/run-pass/default-method-supertrait-vtable.rs +++ b/src/test/run-pass/default-method-supertrait-vtable.rs @@ -31,6 +31,6 @@ impl Y for int { impl Z for int; -fn main() { +pub fn main() { assert_eq!(12.x(), 12); } diff --git a/src/test/run-pass/deriving-clone-generic-enum.rs b/src/test/run-pass/deriving-clone-generic-enum.rs index 78abbf504f366..61696c2eeac75 100644 --- a/src/test/run-pass/deriving-clone-generic-enum.rs +++ b/src/test/run-pass/deriving-clone-generic-enum.rs @@ -15,7 +15,7 @@ enum E { C } -fn main() { +pub fn main() { let _ = A::(1i).clone(); let _ = B(1i, 1.234).deep_clone(); } diff --git a/src/test/run-pass/deriving-clone-generic-tuple-struct.rs b/src/test/run-pass/deriving-clone-generic-tuple-struct.rs index c082a11eab84c..02043b524a9ce 100644 --- a/src/test/run-pass/deriving-clone-generic-tuple-struct.rs +++ b/src/test/run-pass/deriving-clone-generic-tuple-struct.rs @@ -11,6 +11,6 @@ #[deriving(Clone, DeepClone)] struct S(T, ()); -fn main() { +pub fn main() { let _ = S(1i, ()).clone().deep_clone(); } diff --git a/src/test/run-pass/deriving-clone-struct.rs b/src/test/run-pass/deriving-clone-struct.rs index d540b047af7f3..412cc3b3a858c 100644 --- a/src/test/run-pass/deriving-clone-struct.rs +++ b/src/test/run-pass/deriving-clone-struct.rs @@ -31,4 +31,4 @@ struct S { _nil: () } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/deriving-cmp-shortcircuit.rs b/src/test/run-pass/deriving-cmp-shortcircuit.rs index 7f5c78cf602ad..431c856ee88a5 100644 --- a/src/test/run-pass/deriving-cmp-shortcircuit.rs +++ b/src/test/run-pass/deriving-cmp-shortcircuit.rs @@ -35,7 +35,7 @@ struct ShortCircuit { y: FailCmp } -fn main() { +pub fn main() { let a = ShortCircuit { x: 1, y: FailCmp }; let b = ShortCircuit { x: 2, y: FailCmp }; diff --git a/src/test/run-pass/deriving-self-lifetime.rs b/src/test/run-pass/deriving-self-lifetime.rs index e65e189ea93cf..2b0245fa5d286 100644 --- a/src/test/run-pass/deriving-self-lifetime.rs +++ b/src/test/run-pass/deriving-self-lifetime.rs @@ -13,7 +13,7 @@ struct A<'self> { x: &'self int } -fn main() { +pub fn main() { let a = A { x: &1 }; let b = A { x: &2 }; diff --git a/src/test/run-pass/deriving-to-str.rs b/src/test/run-pass/deriving-to-str.rs index 1fc1d6815f5f4..a6068b52740d0 100644 --- a/src/test/run-pass/deriving-to-str.rs +++ b/src/test/run-pass/deriving-to-str.rs @@ -34,7 +34,7 @@ impl ToStr for Custom { fn to_str(&self) -> ~str { ~"yay" } } -fn main() { +pub fn main() { assert_eq!(B1.to_str(), ~"B1"); assert_eq!(B2.to_str(), ~"B2"); assert_eq!(C1(3).to_str(), ~"C1(3)"); diff --git a/src/test/run-pass/deriving-zero.rs b/src/test/run-pass/deriving-zero.rs index fb4ffb2c3c15d..59acc353fed60 100644 --- a/src/test/run-pass/deriving-zero.rs +++ b/src/test/run-pass/deriving-zero.rs @@ -33,7 +33,7 @@ struct Lots { j: (), } -fn main() { +pub fn main() { let lots: Lots = Zero::zero(); assert!(lots.is_zero()); } diff --git a/src/test/run-pass/enum-discr.rs b/src/test/run-pass/enum-discr.rs index 5a14f0050e866..28f38829167bb 100644 --- a/src/test/run-pass/enum-discr.rs +++ b/src/test/run-pass/enum-discr.rs @@ -12,7 +12,7 @@ enum Hero { Spiderman = -4 } -fn main() { +pub fn main() { let pet: Animal = Snake; let hero: Hero = Superman; assert!(pet as uint == 3); diff --git a/src/test/run-pass/enum-vec-initializer.rs b/src/test/run-pass/enum-vec-initializer.rs index d240e849ad049..a55b5eebefbae 100644 --- a/src/test/run-pass/enum-vec-initializer.rs +++ b/src/test/run-pass/enum-vec-initializer.rs @@ -15,7 +15,7 @@ enum Flopsy { static BAR:uint = Bunny as uint; static BAR2:uint = BAR; -fn main() { +pub fn main() { let _v = [0, .. Bunny as uint]; let _v = [0, .. BAR]; let _v = [0, .. BAR2]; diff --git a/src/test/run-pass/expr-repeat-vstore.rs b/src/test/run-pass/expr-repeat-vstore.rs index 5c94f059b49fa..48bce39970f98 100644 --- a/src/test/run-pass/expr-repeat-vstore.rs +++ b/src/test/run-pass/expr-repeat-vstore.rs @@ -1,6 +1,6 @@ use std::io::println; -fn main() { +pub fn main() { let v: ~[int] = ~[ 1, ..5 ]; println(v[0].to_str()); println(v[1].to_str()); diff --git a/src/test/run-pass/extern-call-direct.rs b/src/test/run-pass/extern-call-direct.rs index bc6ee63c0f457..925ec8e7ff720 100644 --- a/src/test/run-pass/extern-call-direct.rs +++ b/src/test/run-pass/extern-call-direct.rs @@ -12,7 +12,7 @@ extern fn f(x: uint) -> uint { x * 2 } -fn main() { +pub fn main() { #[fixed_stack_segment]; let x = f(22); diff --git a/src/test/run-pass/extern-compare-with-return-type.rs b/src/test/run-pass/extern-compare-with-return-type.rs index 5406fa283e7e7..53a5d3e962118 100644 --- a/src/test/run-pass/extern-compare-with-return-type.rs +++ b/src/test/run-pass/extern-compare-with-return-type.rs @@ -19,7 +19,7 @@ extern fn uintvoidret(_x: uint) {} extern fn uintuintuintuintret(x: uint, y: uint, z: uint) -> uint { x+y+z } -fn main() { +pub fn main() { assert_eq!(voidret1, voidret1); assert!(voidret1 != voidret2); diff --git a/src/test/run-pass/extoption_env-not-defined.rs b/src/test/run-pass/extoption_env-not-defined.rs index cbf4c36c5df3c..891133c78d477 100644 --- a/src/test/run-pass/extoption_env-not-defined.rs +++ b/src/test/run-pass/extoption_env-not-defined.rs @@ -8,6 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { assert!(option_env!("__HOPEFULLY_DOESNT_EXIST__").is_none()); } diff --git a/src/test/run-pass/filter-block-view-items.rs b/src/test/run-pass/filter-block-view-items.rs index 4286183371799..34272b145a29d 100644 --- a/src/test/run-pass/filter-block-view-items.rs +++ b/src/test/run-pass/filter-block-view-items.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { // Make sure that this view item is filtered out because otherwise it would // trigger a compilation error #[cfg(not_present)] use foo = bar; diff --git a/src/test/run-pass/foreach-external-iterators-break.rs b/src/test/run-pass/foreach-external-iterators-break.rs index f5e7d91c22520..87ed7826fed57 100644 --- a/src/test/run-pass/foreach-external-iterators-break.rs +++ b/src/test/run-pass/foreach-external-iterators-break.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { let x = [1,..100]; let mut y = 0; for i in x.iter() { diff --git a/src/test/run-pass/foreach-external-iterators-hashmap-break-restart.rs b/src/test/run-pass/foreach-external-iterators-hashmap-break-restart.rs index 17c5bb5c0e253..34ce8c4711329 100644 --- a/src/test/run-pass/foreach-external-iterators-hashmap-break-restart.rs +++ b/src/test/run-pass/foreach-external-iterators-hashmap-break-restart.rs @@ -14,7 +14,7 @@ use std::hashmap::HashMap; // outside the loop, breaks, then _picks back up_ and continues // iterating with it. -fn main() { +pub fn main() { let mut h = HashMap::new(); let kvs = [(1, 10), (2, 20), (3, 30)]; for &(k,v) in kvs.iter() { @@ -38,4 +38,4 @@ fn main() { assert_eq!(x, 6); assert_eq!(y, 60); -} \ No newline at end of file +} diff --git a/src/test/run-pass/foreach-external-iterators-hashmap.rs b/src/test/run-pass/foreach-external-iterators-hashmap.rs index 908adc0d7620d..365cde34dce82 100644 --- a/src/test/run-pass/foreach-external-iterators-hashmap.rs +++ b/src/test/run-pass/foreach-external-iterators-hashmap.rs @@ -10,7 +10,7 @@ use std::hashmap::HashMap; -fn main() { +pub fn main() { let mut h = HashMap::new(); let kvs = [(1, 10), (2, 20), (3, 30)]; for &(k,v) in kvs.iter() { @@ -24,4 +24,4 @@ fn main() { } assert_eq!(x, 6); assert_eq!(y, 60); -} \ No newline at end of file +} diff --git a/src/test/run-pass/foreach-external-iterators-loop.rs b/src/test/run-pass/foreach-external-iterators-loop.rs index c999d810ec6ba..ced538e163e80 100644 --- a/src/test/run-pass/foreach-external-iterators-loop.rs +++ b/src/test/run-pass/foreach-external-iterators-loop.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { let x = [1,..100]; let mut y = 0; for (n,i) in x.iter().enumerate() { diff --git a/src/test/run-pass/foreach-external-iterators-nested.rs b/src/test/run-pass/foreach-external-iterators-nested.rs index 904c90dc815d1..78aba778421b1 100644 --- a/src/test/run-pass/foreach-external-iterators-nested.rs +++ b/src/test/run-pass/foreach-external-iterators-nested.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { let x = [1,..100]; let y = [2,..100]; let mut p = 0; diff --git a/src/test/run-pass/foreach-external-iterators.rs b/src/test/run-pass/foreach-external-iterators.rs index c6f903821dd0e..593a996d8dfe9 100644 --- a/src/test/run-pass/foreach-external-iterators.rs +++ b/src/test/run-pass/foreach-external-iterators.rs @@ -8,11 +8,11 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { let x = [1,..100]; let mut y = 0; for i in x.iter() { y += *i } assert!(y == 100); -} \ No newline at end of file +} diff --git a/src/test/run-pass/func-arg-incomplete-pattern.rs b/src/test/run-pass/func-arg-incomplete-pattern.rs index b08d3beae1bfa..93c9d6b50ec0e 100644 --- a/src/test/run-pass/func-arg-incomplete-pattern.rs +++ b/src/test/run-pass/func-arg-incomplete-pattern.rs @@ -11,10 +11,10 @@ fn foo(Foo {x, _}: Foo) -> *uint { addr } -fn main() { +pub fn main() { let obj = ~1; let objptr: *uint = &*obj; let f = Foo {x: obj, y: ~2}; let xptr = foo(f); assert_eq!(objptr, xptr); -} \ No newline at end of file +} diff --git a/src/test/run-pass/func-arg-ref-pattern.rs b/src/test/run-pass/func-arg-ref-pattern.rs index 84c2b3acf3580..1b7d641fa8259 100644 --- a/src/test/run-pass/func-arg-ref-pattern.rs +++ b/src/test/run-pass/func-arg-ref-pattern.rs @@ -13,7 +13,7 @@ fn checkval(~ref x: ~uint) -> uint { *x } -fn main() { +pub fn main() { let obj = ~1; let objptr: *uint = &*obj; let xptr = getaddr(obj); diff --git a/src/test/run-pass/func-arg-wild-pattern.rs b/src/test/run-pass/func-arg-wild-pattern.rs index c2d60c8532993..ec58198d4a348 100644 --- a/src/test/run-pass/func-arg-wild-pattern.rs +++ b/src/test/run-pass/func-arg-wild-pattern.rs @@ -5,6 +5,6 @@ fn foo((x, _): (int, int)) -> int { x } -fn main() { +pub fn main() { assert_eq!(foo((22, 23)), 22); } diff --git a/src/test/run-pass/generic-static-methods.rs b/src/test/run-pass/generic-static-methods.rs index 4945a25967a09..2e281812d138f 100755 --- a/src/test/run-pass/generic-static-methods.rs +++ b/src/test/run-pass/generic-static-methods.rs @@ -22,6 +22,6 @@ impl vec_utils for ~[T] { } } -fn main() { +pub fn main() { assert_eq!(vec_utils::map_(&~[1,2,3], |&x| x+1), ~[2,3,4]); } diff --git a/src/test/run-pass/hygiene-dodging-1.rs b/src/test/run-pass/hygiene-dodging-1.rs index 55e15cc02dd39..3969394a26b93 100644 --- a/src/test/run-pass/hygiene-dodging-1.rs +++ b/src/test/run-pass/hygiene-dodging-1.rs @@ -12,7 +12,7 @@ mod x { pub fn g() -> uint {14} } -fn main(){ +pub fn main(){ // should *not* shadow the module x: let x = 9; // use it to avoid warnings: diff --git a/src/test/run-pass/issue-2611-3.rs b/src/test/run-pass/issue-2611-3.rs index 56c18d557f0da..3cc7296fa4a8e 100644 --- a/src/test/run-pass/issue-2611-3.rs +++ b/src/test/run-pass/issue-2611-3.rs @@ -23,4 +23,4 @@ impl A for E { fn b(_x: F) -> F { fail!() } //~ ERROR in method `b`, type parameter 0 has 1 bound, but } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/issue-3991.rs b/src/test/run-pass/issue-3991.rs index 842605b59297b..d5dd090009a1c 100644 --- a/src/test/run-pass/issue-3991.rs +++ b/src/test/run-pass/issue-3991.rs @@ -18,4 +18,4 @@ impl HasNested { } } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/issue-4333.rs b/src/test/run-pass/issue-4333.rs index 98280271bdea6..ebf29be6d5e45 100644 --- a/src/test/run-pass/issue-4333.rs +++ b/src/test/run-pass/issue-4333.rs @@ -10,7 +10,7 @@ use std::io; -fn main() { +pub fn main() { let stdout = &io::stdout() as &io::WriterUtil; stdout.write_line("Hello!"); } diff --git a/src/test/run-pass/issue-4446.rs b/src/test/run-pass/issue-4446.rs index accf7c4e6cd2d..ddcb544c64fca 100644 --- a/src/test/run-pass/issue-4446.rs +++ b/src/test/run-pass/issue-4446.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { let (port, chan) = stream(); do spawn { diff --git a/src/test/run-pass/issue-4735.rs b/src/test/run-pass/issue-4735.rs index 8451d281aa0ab..b28ba6811b7bc 100644 --- a/src/test/run-pass/issue-4735.rs +++ b/src/test/run-pass/issue-4735.rs @@ -21,7 +21,7 @@ impl Drop for NonCopyable { } } -fn main() { +pub fn main() { let t = ~0; let p = unsafe { transmute::<~int, *c_void>(t) }; let _z = NonCopyable(p); diff --git a/src/test/run-pass/issue-5008-borrowed-traitobject-method-call.rs b/src/test/run-pass/issue-5008-borrowed-traitobject-method-call.rs index ce9bb725a1b1b..dd3f54d97ecec 100644 --- a/src/test/run-pass/issue-5008-borrowed-traitobject-method-call.rs +++ b/src/test/run-pass/issue-5008-borrowed-traitobject-method-call.rs @@ -37,7 +37,7 @@ fn print_name(x: &Debuggable) println(fmt!("debug_name = %s", x.debug_name())); } -fn main() { +pub fn main() { let thing = Thing::new(); print_name(&thing as &Debuggable); } diff --git a/src/test/run-pass/issue-5060.rs b/src/test/run-pass/issue-5060.rs index 0922f555beaa4..c988110607106 100644 --- a/src/test/run-pass/issue-5060.rs +++ b/src/test/run-pass/issue-5060.rs @@ -22,7 +22,7 @@ macro_rules! print_hd_tl ( }) ) -fn main() { +pub fn main() { print_hd_tl!(x, y, z, w) } diff --git a/src/test/run-pass/issue-5192.rs b/src/test/run-pass/issue-5192.rs index b9048257cfb58..202a3cbcafa2b 100644 --- a/src/test/run-pass/issue-5192.rs +++ b/src/test/run-pass/issue-5192.rs @@ -39,6 +39,6 @@ impl Scheduler { } } -fn main() { +pub fn main() { let _sched = Scheduler::new(~UvEventLoop::new() as ~EventLoop); } diff --git a/src/test/run-pass/issue-5239-2.rs b/src/test/run-pass/issue-5239-2.rs index dac3c95e08a4f..ba70fac0e4e8f 100644 --- a/src/test/run-pass/issue-5239-2.rs +++ b/src/test/run-pass/issue-5239-2.rs @@ -10,7 +10,7 @@ // Regression test for issue #5239 -fn main() { +pub fn main() { let _f: &fn(int) -> int = |ref x: int| { *x }; let foo = 10; assert!(_f(foo) == 10); diff --git a/src/test/run-pass/issue-5280.rs b/src/test/run-pass/issue-5280.rs index 77df670ffb1bf..16fd45a5615f2 100644 --- a/src/test/run-pass/issue-5280.rs +++ b/src/test/run-pass/issue-5280.rs @@ -20,6 +20,6 @@ impl FontTableTagConversions for FontTableTag { } } -fn main() { +pub fn main() { 5.tag_to_str(); } diff --git a/src/test/run-pass/issue-5315.rs b/src/test/run-pass/issue-5315.rs index dde226ad9d83a..1d2e7b79931f9 100644 --- a/src/test/run-pass/issue-5315.rs +++ b/src/test/run-pass/issue-5315.rs @@ -10,7 +10,7 @@ struct A(bool); -fn main() { +pub fn main() { let f = A; f(true); } diff --git a/src/test/run-pass/issue-5321-immediates-with-bare-self.rs b/src/test/run-pass/issue-5321-immediates-with-bare-self.rs index 3f4b732af3276..3f1dc2f6986f6 100644 --- a/src/test/run-pass/issue-5321-immediates-with-bare-self.rs +++ b/src/test/run-pass/issue-5321-immediates-with-bare-self.rs @@ -20,6 +20,6 @@ impl Fooable for uint { } } -fn main() { +pub fn main() { 2.yes(); } diff --git a/src/test/run-pass/issue-5353.rs b/src/test/run-pass/issue-5353.rs index cc1bb2dd03738..cf11b9aa7b6cc 100644 --- a/src/test/run-pass/issue-5353.rs +++ b/src/test/run-pass/issue-5353.rs @@ -21,4 +21,4 @@ fn gl_err_str(err: u32) -> ~str } } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/issue-5517.rs b/src/test/run-pass/issue-5517.rs index b929dbf51d395..d63d8b13b4366 100644 --- a/src/test/run-pass/issue-5517.rs +++ b/src/test/run-pass/issue-5517.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() { +pub fn main() { let box1 = @mut 42; let _x = *(&mut *box1) == 42 || *(&mut *box1) == 31337; } diff --git a/src/test/run-pass/issue-5550.rs b/src/test/run-pass/issue-5550.rs index c1875988dc666..d68766d5886e9 100644 --- a/src/test/run-pass/issue-5550.rs +++ b/src/test/run-pass/issue-5550.rs @@ -10,7 +10,7 @@ #[allow(dead_assignment)]; -fn main() { +pub fn main() { let s: ~str = ~"foobar"; let mut t: &str = s; t = t.slice(0, 3); // for master: str::view(t, 0, 3) maybe diff --git a/src/test/run-pass/issue-5572.rs b/src/test/run-pass/issue-5572.rs index daf5edd1d28b8..d1a1fbf094005 100644 --- a/src/test/run-pass/issue-5572.rs +++ b/src/test/run-pass/issue-5572.rs @@ -1,3 +1,3 @@ fn foo(_t: T) { } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/issue-5688.rs b/src/test/run-pass/issue-5688.rs index 440e2a43e42f3..4ac4b3b33b7ec 100644 --- a/src/test/run-pass/issue-5688.rs +++ b/src/test/run-pass/issue-5688.rs @@ -19,7 +19,7 @@ failed to typecheck correctly. struct X { vec: &'static [int] } static V: &'static [X] = &[X { vec: &[1, 2, 3] }]; -fn main() { +pub fn main() { for &v in V.iter() { println(fmt!("%?", v.vec)); } diff --git a/src/test/run-pass/issue-5708.rs b/src/test/run-pass/issue-5708.rs index 51f6ad6aa30f2..aee1f8415eff9 100644 --- a/src/test/run-pass/issue-5708.rs +++ b/src/test/run-pass/issue-5708.rs @@ -39,7 +39,7 @@ impl<'self> Outer<'self> { } } -fn main() { +pub fn main() { let inner = 5; let outer = Outer::new(&inner as &Inner); outer.inner.print(); diff --git a/src/test/run-pass/issue-5741.rs b/src/test/run-pass/issue-5741.rs index 039d9bcd16e25..46ec68675e7f3 100644 --- a/src/test/run-pass/issue-5741.rs +++ b/src/test/run-pass/issue-5741.rs @@ -12,7 +12,7 @@ use std::io; -fn main() { +pub fn main() { return; while io::stdin().read_line() != ~"quit" { }; } diff --git a/src/test/run-pass/issue-5917.rs b/src/test/run-pass/issue-5917.rs index 326e92d3b7085..6fb5c25f7310e 100644 --- a/src/test/run-pass/issue-5917.rs +++ b/src/test/run-pass/issue-5917.rs @@ -10,6 +10,6 @@ struct T (&'static [int]); static t : T = T (&'static [5, 4, 3]); -fn main () { +pub fn main () { assert_eq!(t[0], 5); } diff --git a/src/test/run-pass/issue-6128.rs b/src/test/run-pass/issue-6128.rs index 54df0523dbbef..a01a04ebf8272 100644 --- a/src/test/run-pass/issue-6128.rs +++ b/src/test/run-pass/issue-6128.rs @@ -21,7 +21,7 @@ impl Graph for HashMap { } } -fn main() { +pub fn main() { let g : ~HashMap = ~HashMap::new(); let _g2 : ~Graph = g as ~Graph; } diff --git a/src/test/run-pass/issue-6130.rs b/src/test/run-pass/issue-6130.rs index 642308c0ca12f..d88397499feae 100644 --- a/src/test/run-pass/issue-6130.rs +++ b/src/test/run-pass/issue-6130.rs @@ -10,7 +10,7 @@ #[deny(type_limits)]; -fn main() { +pub fn main() { let i: uint = 0; assert!(i <= 0xFFFF_FFFF_u); diff --git a/src/test/run-pass/issue-6141-leaking-owned-fn.rs b/src/test/run-pass/issue-6141-leaking-owned-fn.rs index fe11bb0a972ad..98d2ca5d9424e 100644 --- a/src/test/run-pass/issue-6141-leaking-owned-fn.rs +++ b/src/test/run-pass/issue-6141-leaking-owned-fn.rs @@ -2,7 +2,7 @@ fn run(f: &fn()) { f() } -fn main() { +pub fn main() { let f: ~fn() = || (); run(f); -} \ No newline at end of file +} diff --git a/src/test/run-pass/issue-6153.rs b/src/test/run-pass/issue-6153.rs index a51b595f59f29..668d6f3ae45e3 100644 --- a/src/test/run-pass/issue-6153.rs +++ b/src/test/run-pass/issue-6153.rs @@ -13,7 +13,7 @@ fn swap(f: &fn(~[int]) -> ~[int]) -> ~[int] { f(x) } -fn main() { +pub fn main() { let v = swap(|mut x| { x.push(4); x }); let w = do swap |mut x| { x.push(4); x }; assert_eq!(v, w); diff --git a/src/test/run-pass/issue-6341.rs b/src/test/run-pass/issue-6341.rs index f57482b67e049..3859d15585158 100644 --- a/src/test/run-pass/issue-6341.rs +++ b/src/test/run-pass/issue-6341.rs @@ -15,4 +15,4 @@ impl Drop for A { fn drop(&mut self) {} } -fn main() {} \ No newline at end of file +pub fn main() {} diff --git a/src/test/run-pass/issue-6344-let.rs b/src/test/run-pass/issue-6344-let.rs index 6e0b6101d3748..9343f2b61c900 100644 --- a/src/test/run-pass/issue-6344-let.rs +++ b/src/test/run-pass/issue-6344-let.rs @@ -13,7 +13,7 @@ impl Drop for A { fn drop(&mut self) {} } -fn main() { +pub fn main() { let a = A { x: 0 }; let A { x: ref x } = a; diff --git a/src/test/run-pass/issue-6344-match.rs b/src/test/run-pass/issue-6344-match.rs index b9429fc63fd28..18d327aa360c4 100644 --- a/src/test/run-pass/issue-6344-match.rs +++ b/src/test/run-pass/issue-6344-match.rs @@ -13,7 +13,7 @@ impl Drop for A { fn drop(&mut self) {} } -fn main() { +pub fn main() { let a = A { x: 0 }; match a { diff --git a/src/test/run-pass/issue-7012.rs b/src/test/run-pass/issue-7012.rs index 777803d75a52b..2a56f2ad8bc47 100644 --- a/src/test/run-pass/issue-7012.rs +++ b/src/test/run-pass/issue-7012.rs @@ -21,7 +21,7 @@ static test1: signature<'static> = signature { pattern: &[0x243f6a88u32,0x85a308d3u32,0x13198a2eu32,0x03707344u32,0xa4093822u32,0x299f31d0u32] }; -fn main() { +pub fn main() { let test = &[0x243f6a88u32,0x85a308d3u32,0x13198a2eu32,0x03707344u32,0xa4093822u32,0x299f31d0u32]; println(fmt!("%b",test==test1.pattern)); } diff --git a/src/test/run-pass/issue-7344.rs b/src/test/run-pass/issue-7344.rs index acf55d2463bc3..9b1643bb22490 100644 --- a/src/test/run-pass/issue-7344.rs +++ b/src/test/run-pass/issue-7344.rs @@ -22,7 +22,7 @@ fn baz() { if "" == "" {} } -fn main() { +pub fn main() { bar(); baz(); } diff --git a/src/test/run-pass/issue-7519-match-unit-in-arg.rs b/src/test/run-pass/issue-7519-match-unit-in-arg.rs index ba84dd44b2f0a..75123243f47d6 100644 --- a/src/test/run-pass/issue-7519-match-unit-in-arg.rs +++ b/src/test/run-pass/issue-7519-match-unit-in-arg.rs @@ -14,6 +14,6 @@ fn foo(():()) { } -fn main() { +pub fn main() { foo(()); } diff --git a/src/test/run-pass/issue-7673-cast-generically-implemented-trait.rs b/src/test/run-pass/issue-7673-cast-generically-implemented-trait.rs index 2f2b736294a5e..af8b453856b05 100644 --- a/src/test/run-pass/issue-7673-cast-generically-implemented-trait.rs +++ b/src/test/run-pass/issue-7673-cast-generically-implemented-trait.rs @@ -14,7 +14,7 @@ */ -fn main() {} +pub fn main() {} trait A {} impl A for T {} diff --git a/src/test/run-pass/issue-7712.rs b/src/test/run-pass/issue-7712.rs index 1ea8312ddd927..fa7d68cf921fd 100644 --- a/src/test/run-pass/issue-7712.rs +++ b/src/test/run-pass/issue-7712.rs @@ -20,6 +20,6 @@ struct MyStruct; impl TraitWithDefaultMethod for MyStruct { } -fn main() { +pub fn main() { MyStruct.method(); } diff --git a/src/test/run-pass/issue-8171-default-method-self-inherit-builtin-trait.rs b/src/test/run-pass/issue-8171-default-method-self-inherit-builtin-trait.rs index be68d50c9615d..aaf2ecb71292e 100644 --- a/src/test/run-pass/issue-8171-default-method-self-inherit-builtin-trait.rs +++ b/src/test/run-pass/issue-8171-default-method-self-inherit-builtin-trait.rs @@ -22,4 +22,4 @@ trait TragicallySelfIsNotSend: Send { } } -fn main(){} +pub fn main(){} diff --git a/src/test/run-pass/issue-8248.rs b/src/test/run-pass/issue-8248.rs index 48f34805feee7..377b9ce262c73 100644 --- a/src/test/run-pass/issue-8248.rs +++ b/src/test/run-pass/issue-8248.rs @@ -14,7 +14,7 @@ impl A for B {} fn foo(_: &mut A) {} -fn main() { +pub fn main() { let mut b = B; foo(&mut b as &mut A); } diff --git a/src/test/run-pass/issue-8249.rs b/src/test/run-pass/issue-8249.rs index ad37196dce4a5..bfc1d94369031 100644 --- a/src/test/run-pass/issue-8249.rs +++ b/src/test/run-pass/issue-8249.rs @@ -20,6 +20,6 @@ fn foo(a: &mut A) { C{ foo: a }; } -fn main() { +pub fn main() { } diff --git a/src/test/run-pass/issue-8398.rs b/src/test/run-pass/issue-8398.rs index 5e04c96af72e7..31ac2c4629318 100644 --- a/src/test/run-pass/issue-8398.rs +++ b/src/test/run-pass/issue-8398.rs @@ -14,5 +14,5 @@ fn foo(a: &mut io::Writer) { a.write([]) } -fn main(){} +pub fn main(){} diff --git a/src/test/run-pass/issue-9047.rs b/src/test/run-pass/issue-9047.rs index fc9c22fb82cd1..053d6aa3c9061 100644 --- a/src/test/run-pass/issue-9047.rs +++ b/src/test/run-pass/issue-9047.rs @@ -16,4 +16,4 @@ fn decode() -> ~str { ~"" } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/issue-9110.rs b/src/test/run-pass/issue-9110.rs index 56f87f5e68628..27c2ed9e5adf9 100644 --- a/src/test/run-pass/issue-9110.rs +++ b/src/test/run-pass/issue-9110.rs @@ -19,4 +19,4 @@ macro_rules! silly_macro( silly_macro!() -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/let-destruct-ref.rs b/src/test/run-pass/let-destruct-ref.rs index 7f3f9110b1c5c..fdb2805ae1841 100644 --- a/src/test/run-pass/let-destruct-ref.rs +++ b/src/test/run-pass/let-destruct-ref.rs @@ -1,4 +1,4 @@ -fn main() { +pub fn main() { let x = ~"hello"; let ref y = x; assert_eq!(x.slice(0, x.len()), y.slice(0, y.len())); diff --git a/src/test/run-pass/let-var-hygiene.rs b/src/test/run-pass/let-var-hygiene.rs index 1e29d2e8969c5..93bb2ca98e8b5 100644 --- a/src/test/run-pass/let-var-hygiene.rs +++ b/src/test/run-pass/let-var-hygiene.rs @@ -10,7 +10,7 @@ // shouldn't affect evaluation of $ex: macro_rules! bad_macro (($ex:expr) => ({let _x = 9; $ex})) -fn main() { +pub fn main() { let _x = 8; assert_eq!(bad_macro!(_x),8) } diff --git a/src/test/run-pass/link-section.rs b/src/test/run-pass/link-section.rs index ff1e474039478..a5ea32e515743 100644 --- a/src/test/run-pass/link-section.rs +++ b/src/test/run-pass/link-section.rs @@ -26,7 +26,7 @@ static magic: uint = 42; #[link_section="__DATA,__mut"] static mut frobulator: uint = 0xdeadbeef; -fn main() { +pub fn main() { unsafe { frobulator = 0xcafebabe; printfln!("%? %? %?", i_live_in_more_text(), magic, frobulator); diff --git a/src/test/run-pass/lint-cstack.rs b/src/test/run-pass/lint-cstack.rs index b9e61b47e22df..80901475c04b5 100644 --- a/src/test/run-pass/lint-cstack.rs +++ b/src/test/run-pass/lint-cstack.rs @@ -23,5 +23,5 @@ trait A { } } -fn main() { +pub fn main() { } diff --git a/src/test/run-pass/lint-non-camel-case-types-non-uppercase-statics-unicode.rs b/src/test/run-pass/lint-non-camel-case-types-non-uppercase-statics-unicode.rs index 8c1dc366f2328..e3a0c8417d063 100644 --- a/src/test/run-pass/lint-non-camel-case-types-non-uppercase-statics-unicode.rs +++ b/src/test/run-pass/lint-non-camel-case-types-non-uppercase-statics-unicode.rs @@ -18,4 +18,4 @@ struct ヒ; static ラ: uint = 0; -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/lint-non-uppercase-statics-lowercase-mut-statics.rs b/src/test/run-pass/lint-non-uppercase-statics-lowercase-mut-statics.rs index 3a3648fbf6d83..cf6640275ed4f 100644 --- a/src/test/run-pass/lint-non-uppercase-statics-lowercase-mut-statics.rs +++ b/src/test/run-pass/lint-non-uppercase-statics-lowercase-mut-statics.rs @@ -14,4 +14,4 @@ static mut bar: int = 2; -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/macro-local-data-key.rs b/src/test/run-pass/macro-local-data-key.rs index b53d7b36d7925..23f418cfc691e 100644 --- a/src/test/run-pass/macro-local-data-key.rs +++ b/src/test/run-pass/macro-local-data-key.rs @@ -16,7 +16,7 @@ mod bar { local_data_key!(pub baz: float) } -fn main() { +pub fn main() { local_data::get(foo, |x| assert!(x.is_none())); local_data::get(bar::baz, |y| assert!(y.is_none())); diff --git a/src/test/run-pass/match-drop-strs-issue-4541.rs b/src/test/run-pass/match-drop-strs-issue-4541.rs index 92095335fc41a..e90d6b2862671 100644 --- a/src/test/run-pass/match-drop-strs-issue-4541.rs +++ b/src/test/run-pass/match-drop-strs-issue-4541.rs @@ -22,6 +22,6 @@ fn parse_args() -> ~str { return ~"" } -fn main() { +pub fn main() { io::println(parse_args()); } diff --git a/src/test/run-pass/match-in-macro.rs b/src/test/run-pass/match-in-macro.rs index 83d10627d2e4c..671ec5a3965c3 100644 --- a/src/test/run-pass/match-in-macro.rs +++ b/src/test/run-pass/match-in-macro.rs @@ -20,6 +20,6 @@ macro_rules! match_inside_expansion( ) ) -fn main() { +pub fn main() { assert_eq!(match_inside_expansion!(),129); } diff --git a/src/test/run-pass/match-pipe-binding.rs b/src/test/run-pass/match-pipe-binding.rs index b4933773c03e2..6df4c8123610f 100644 --- a/src/test/run-pass/match-pipe-binding.rs +++ b/src/test/run-pass/match-pipe-binding.rs @@ -59,7 +59,7 @@ fn test5() { } } -fn main() { +pub fn main() { test1(); test2(); test3(); diff --git a/src/test/run-pass/match-range-static.rs b/src/test/run-pass/match-range-static.rs index aa216b8d05487..0bf0d6e41fa40 100644 --- a/src/test/run-pass/match-range-static.rs +++ b/src/test/run-pass/match-range-static.rs @@ -1,7 +1,7 @@ static s: int = 1; static e: int = 42; -fn main() { +pub fn main() { match 7 { s..e => (), _ => (), diff --git a/src/test/run-pass/match-vec-rvalue.rs b/src/test/run-pass/match-vec-rvalue.rs index 5f68b0e9a6953..a6e61fbacd4be 100644 --- a/src/test/run-pass/match-vec-rvalue.rs +++ b/src/test/run-pass/match-vec-rvalue.rs @@ -1,6 +1,6 @@ // Tests that matching rvalues with drops does not crash. -fn main() { +pub fn main() { match ~[1, 2, 3] { x => { assert_eq!(x.len(), 3); diff --git a/src/test/run-pass/mid-path-type-params.rs b/src/test/run-pass/mid-path-type-params.rs index 1bc37a035e046..09435962ef748 100644 --- a/src/test/run-pass/mid-path-type-params.rs +++ b/src/test/run-pass/mid-path-type-params.rs @@ -26,7 +26,7 @@ impl Trait for S2 { } } -fn main() { +pub fn main() { let _ = S::::new::(1, 1.0); let _: S2 = Trait::::new::(1, 1.0); } diff --git a/src/test/run-pass/move-out-of-field.rs b/src/test/run-pass/move-out-of-field.rs index 93ea35e262956..6cf207e5cbc2c 100644 --- a/src/test/run-pass/move-out-of-field.rs +++ b/src/test/run-pass/move-out-of-field.rs @@ -12,7 +12,7 @@ fn to_str(sb: StringBuffer) -> ~str { sb.s } -fn main() { +pub fn main() { let mut sb = StringBuffer {s: ~""}; sb.append("Hello, "); sb.append("World!"); diff --git a/src/test/run-pass/multibyte.rs b/src/test/run-pass/multibyte.rs index 417662b65c6f1..a28008f3e0bab 100644 --- a/src/test/run-pass/multibyte.rs +++ b/src/test/run-pass/multibyte.rs @@ -9,6 +9,6 @@ // except according to those terms. // Test that multibyte characters don't crash the compiler -fn main() { +pub fn main() { println("마이너스 사인이 없으면"); } diff --git a/src/test/run-pass/nested-enum-same-names.rs b/src/test/run-pass/nested-enum-same-names.rs index 919b4b59dca8e..33c4ed6234eaa 100644 --- a/src/test/run-pass/nested-enum-same-names.rs +++ b/src/test/run-pass/nested-enum-same-names.rs @@ -30,4 +30,4 @@ impl Foo { } } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/nested-function-names-issue-8587.rs b/src/test/run-pass/nested-function-names-issue-8587.rs index 054e0e3ae265c..f697f0b59d65f 100644 --- a/src/test/run-pass/nested-function-names-issue-8587.rs +++ b/src/test/run-pass/nested-function-names-issue-8587.rs @@ -41,7 +41,7 @@ impl X { } } -fn main() { +pub fn main() { let n = X; assert_eq!(n.f(), 0); assert_eq!(n.g(), 1); diff --git a/src/test/run-pass/newtype-struct-drop-run.rs b/src/test/run-pass/newtype-struct-drop-run.rs index 578f80f1ca51e..54c4c06c5482f 100644 --- a/src/test/run-pass/newtype-struct-drop-run.rs +++ b/src/test/run-pass/newtype-struct-drop-run.rs @@ -19,7 +19,7 @@ impl Drop for Foo { } } -fn main() { +pub fn main() { let y = @mut 32; { let _x = Foo(y); diff --git a/src/test/run-pass/newtype-temporary.rs b/src/test/run-pass/newtype-temporary.rs index d2407f3d6059b..03e5d92676190 100644 --- a/src/test/run-pass/newtype-temporary.rs +++ b/src/test/run-pass/newtype-temporary.rs @@ -14,6 +14,6 @@ fn foo() -> Foo { Foo(42) } -fn main() { +pub fn main() { assert_eq!(*foo(), 42); } diff --git a/src/test/run-pass/objects-coerce-freeze-borrored.rs b/src/test/run-pass/objects-coerce-freeze-borrored.rs index 4dda5ca556eda..0bdc36750ae6d 100644 --- a/src/test/run-pass/objects-coerce-freeze-borrored.rs +++ b/src/test/run-pass/objects-coerce-freeze-borrored.rs @@ -39,7 +39,7 @@ fn do_it_imm(obj: &Foo, v: uint) { assert_eq!(v, y); } -fn main() { +pub fn main() { let mut x = 22_u; let obj = &mut x as &mut Foo; do_it_mut(obj); diff --git a/src/test/run-pass/objects-coerce-from-managed-to-borrowed.rs b/src/test/run-pass/objects-coerce-from-managed-to-borrowed.rs index fe4eb2ea48e49..40c854879bf47 100644 --- a/src/test/run-pass/objects-coerce-from-managed-to-borrowed.rs +++ b/src/test/run-pass/objects-coerce-from-managed-to-borrowed.rs @@ -37,7 +37,7 @@ fn do_it_imm(obj: &Foo, v: uint) { assert_eq!(v, y); } -fn main() { +pub fn main() { let x = @mut 22u as @mut Foo; do_it_mut(x); do_it_imm(x, 23u); diff --git a/src/test/run-pass/owned-implies-static.rs b/src/test/run-pass/owned-implies-static.rs index 4ee552394768a..f327f6bc0dc75 100644 --- a/src/test/run-pass/owned-implies-static.rs +++ b/src/test/run-pass/owned-implies-static.rs @@ -10,6 +10,6 @@ fn f(_x: T) {} -fn main() { +pub fn main() { f(~5); } diff --git a/src/test/run-pass/packed-struct-borrow-element.rs b/src/test/run-pass/packed-struct-borrow-element.rs index a331b80a894ea..1434e1da4c758 100644 --- a/src/test/run-pass/packed-struct-borrow-element.rs +++ b/src/test/run-pass/packed-struct-borrow-element.rs @@ -14,7 +14,7 @@ struct Foo { baz: uint } -fn main() { +pub fn main() { let foo = Foo { bar: 1, baz: 2 }; let brw = &foo.baz; diff --git a/src/test/run-pass/packed-struct-generic-layout.rs b/src/test/run-pass/packed-struct-generic-layout.rs index 18b3cf2f91e9a..91b49944be2ef 100644 --- a/src/test/run-pass/packed-struct-generic-layout.rs +++ b/src/test/run-pass/packed-struct-generic-layout.rs @@ -17,7 +17,7 @@ struct S { c: S } -fn main() { +pub fn main() { unsafe { let s = S { a: 0xff_ff_ff_ffu32, b: 1, c: 0xaa_aa_aa_aa as i32 }; let transd : [u8, .. 9] = cast::transmute(s); diff --git a/src/test/run-pass/packed-struct-generic-size.rs b/src/test/run-pass/packed-struct-generic-size.rs index 98e922c3288dd..798acc646be73 100644 --- a/src/test/run-pass/packed-struct-generic-size.rs +++ b/src/test/run-pass/packed-struct-generic-size.rs @@ -17,7 +17,7 @@ struct S { c: S } -fn main() { +pub fn main() { assert_eq!(sys::size_of::>(), 3); assert_eq!(sys::size_of::>(), 11); diff --git a/src/test/run-pass/packed-struct-layout.rs b/src/test/run-pass/packed-struct-layout.rs index ea51bbcea32d4..f361db4a4b568 100644 --- a/src/test/run-pass/packed-struct-layout.rs +++ b/src/test/run-pass/packed-struct-layout.rs @@ -22,7 +22,7 @@ struct S5 { b: u32 } -fn main() { +pub fn main() { unsafe { let s4 = S4 { a: 1, b: [2,3,4] }; let transd : [u8, .. 4] = cast::transmute(s4); diff --git a/src/test/run-pass/packed-struct-match.rs b/src/test/run-pass/packed-struct-match.rs index 15e7b6b0ce0c5..27ab2c83e5566 100644 --- a/src/test/run-pass/packed-struct-match.rs +++ b/src/test/run-pass/packed-struct-match.rs @@ -14,7 +14,7 @@ struct Foo { baz: uint } -fn main() { +pub fn main() { let foo = Foo { bar: 1, baz: 2 }; match foo { Foo {bar, baz} => { diff --git a/src/test/run-pass/packed-struct-size.rs b/src/test/run-pass/packed-struct-size.rs index 6dcb1f04a4d5e..f0175da9cbad1 100644 --- a/src/test/run-pass/packed-struct-size.rs +++ b/src/test/run-pass/packed-struct-size.rs @@ -51,7 +51,7 @@ struct S7_Option { } -fn main() { +pub fn main() { assert_eq!(sys::size_of::(), 4); assert_eq!(sys::size_of::(), 5); assert_eq!(sys::size_of::(), 13 + sys::size_of::<~str>()); diff --git a/src/test/run-pass/packed-struct-vec.rs b/src/test/run-pass/packed-struct-vec.rs index e66c4619b3cab..6cf519a387f1e 100644 --- a/src/test/run-pass/packed-struct-vec.rs +++ b/src/test/run-pass/packed-struct-vec.rs @@ -19,7 +19,7 @@ struct Foo { baz: u64 } -fn main() { +pub fn main() { let foos = [Foo { bar: 1, baz: 2 }, .. 10]; assert_eq!(sys::size_of::<[Foo, .. 10]>(), 90); diff --git a/src/test/run-pass/packed-tuple-struct-layout.rs b/src/test/run-pass/packed-tuple-struct-layout.rs index 3691f47509820..b3261faddfa2a 100644 --- a/src/test/run-pass/packed-tuple-struct-layout.rs +++ b/src/test/run-pass/packed-tuple-struct-layout.rs @@ -16,7 +16,7 @@ struct S4(u8,[u8, .. 3]); #[packed] struct S5(u8,u32); -fn main() { +pub fn main() { unsafe { let s4 = S4(1, [2,3,4]); let transd : [u8, .. 4] = cast::transmute(s4); diff --git a/src/test/run-pass/packed-tuple-struct-size.rs b/src/test/run-pass/packed-tuple-struct-size.rs index c8f2dda61dbe2..dd38a6b7d122a 100644 --- a/src/test/run-pass/packed-tuple-struct-size.rs +++ b/src/test/run-pass/packed-tuple-struct-size.rs @@ -30,7 +30,7 @@ struct S3_Foo(u8, u16, Foo); #[packed] struct S7_Option(f32, u8, u16, Option<@mut f64>); -fn main() { +pub fn main() { assert_eq!(sys::size_of::(), 4); assert_eq!(sys::size_of::(), 5); diff --git a/src/test/run-pass/pub-extern-privacy.rs b/src/test/run-pass/pub-extern-privacy.rs index 360ac75b3e753..e4e260ab36ec0 100644 --- a/src/test/run-pass/pub-extern-privacy.rs +++ b/src/test/run-pass/pub-extern-privacy.rs @@ -7,7 +7,7 @@ mod a { } #[fixed_stack_segment] #[inline(never)] -fn main() { +pub fn main() { unsafe { a::free(transmute(0)); } diff --git a/src/test/run-pass/region-dependent-autofn.rs b/src/test/run-pass/region-dependent-autofn.rs index 82d4115d66d9f..bce2159cc7b9f 100644 --- a/src/test/run-pass/region-dependent-autofn.rs +++ b/src/test/run-pass/region-dependent-autofn.rs @@ -17,6 +17,6 @@ fn both<'r>(v: &'r fn()) -> &'r fn() { subslice(subslice(v)) } -fn main() { +pub fn main() { both(main); } diff --git a/src/test/run-pass/region-dependent-autoslice.rs b/src/test/run-pass/region-dependent-autoslice.rs index 10c2988fc9f26..dab881549c44c 100644 --- a/src/test/run-pass/region-dependent-autoslice.rs +++ b/src/test/run-pass/region-dependent-autoslice.rs @@ -17,7 +17,7 @@ fn both<'r>(v: &'r [uint]) -> &'r [uint] { subslice1(subslice1(v)) } -fn main() { +pub fn main() { let v = ~[1,2,3]; both(v); } diff --git a/src/test/run-pass/send_str_hashmap.rs b/src/test/run-pass/send_str_hashmap.rs index a33cb99682bb0..1e3bd5897a9d5 100644 --- a/src/test/run-pass/send_str_hashmap.rs +++ b/src/test/run-pass/send_str_hashmap.rs @@ -19,7 +19,7 @@ use std::to_str::ToStr; use std::hashmap::HashMap; use std::option::Some; -fn main() { +pub fn main() { let mut map: HashMap = HashMap::new(); assert!(map.insert(SendStrStatic("foo"), 42)); assert!(!map.insert(SendStrOwned(~"foo"), 42)); diff --git a/src/test/run-pass/send_str_treemap.rs b/src/test/run-pass/send_str_treemap.rs index 7094dca7c4dc6..23ad0ac309102 100644 --- a/src/test/run-pass/send_str_treemap.rs +++ b/src/test/run-pass/send_str_treemap.rs @@ -21,7 +21,7 @@ use std::to_str::ToStr; use self::extra::treemap::TreeMap; use std::option::Some; -fn main() { +pub fn main() { let mut map: TreeMap = TreeMap::new(); assert!(map.insert(SendStrStatic("foo"), 42)); assert!(!map.insert(SendStrOwned(~"foo"), 42)); diff --git a/src/test/run-pass/simd-binop.rs b/src/test/run-pass/simd-binop.rs index 1e6c8b07fa0ee..74502b54d8e39 100644 --- a/src/test/run-pass/simd-binop.rs +++ b/src/test/run-pass/simd-binop.rs @@ -22,7 +22,7 @@ fn test_float(e: f32) -> f32 { e2 } -fn main() { +pub fn main() { assert_eq!(test_int(3i32), 9i32); assert_eq!(test_float(3f32), 9f32); } diff --git a/src/test/run-pass/simd-type.rs b/src/test/run-pass/simd-type.rs index c3bcc9d0b7a02..643daad397ca5 100644 --- a/src/test/run-pass/simd-type.rs +++ b/src/test/run-pass/simd-type.rs @@ -6,4 +6,4 @@ struct RGBA { a: f32 } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/sized-borrowed-pointer.rs b/src/test/run-pass/sized-borrowed-pointer.rs index 9012791800299..348b7562f8460 100644 --- a/src/test/run-pass/sized-borrowed-pointer.rs +++ b/src/test/run-pass/sized-borrowed-pointer.rs @@ -12,4 +12,4 @@ fn bar() { } fn foo() { bar::<&T>() } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/sized-owned-pointer.rs b/src/test/run-pass/sized-owned-pointer.rs index fe9c63621b284..0c05fdd616ba6 100644 --- a/src/test/run-pass/sized-owned-pointer.rs +++ b/src/test/run-pass/sized-owned-pointer.rs @@ -12,4 +12,4 @@ fn bar() { } fn foo() { bar::<~T>() } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/static-assert.rs b/src/test/run-pass/static-assert.rs index 81b0c9ff28c3f..93c8d67c9c0a5 100644 --- a/src/test/run-pass/static-assert.rs +++ b/src/test/run-pass/static-assert.rs @@ -10,5 +10,5 @@ static d: bool = 1 != 2; #[static_assert] static f: bool = (4/2) == 2; -fn main() { +pub fn main() { } diff --git a/src/test/run-pass/struct-update-moves-and-copies.rs b/src/test/run-pass/struct-update-moves-and-copies.rs index f257b9ac0dee7..a0fb31e64bf67 100644 --- a/src/test/run-pass/struct-update-moves-and-copies.rs +++ b/src/test/run-pass/struct-update-moves-and-copies.rs @@ -94,7 +94,7 @@ fn test2() { assert_eq!(c.noncopy.v, 22); } -fn main() { +pub fn main() { test0(); test1(); test2(); diff --git a/src/test/run-pass/syntax-extension-bytes.rs b/src/test/run-pass/syntax-extension-bytes.rs index bdaae65bc3cc8..5b66d5f28a926 100644 --- a/src/test/run-pass/syntax-extension-bytes.rs +++ b/src/test/run-pass/syntax-extension-bytes.rs @@ -10,7 +10,7 @@ static static_vec: &'static [u8] = bytes!("abc", 0xFF, '!'); -fn main() { +pub fn main() { let vec = bytes!("abc"); assert_eq!(vec, &[97_u8, 98_u8, 99_u8]); diff --git a/src/test/run-pass/tag-variant-disr-type-mismatch.rs b/src/test/run-pass/tag-variant-disr-type-mismatch.rs index 514f868db54a1..3d63acd5b8383 100644 --- a/src/test/run-pass/tag-variant-disr-type-mismatch.rs +++ b/src/test/run-pass/tag-variant-disr-type-mismatch.rs @@ -13,4 +13,4 @@ enum color { blue = 2, } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/trait-bounds-basic.rs b/src/test/run-pass/trait-bounds-basic.rs index cc2c12e410901..9fef70a4dda88 100644 --- a/src/test/run-pass/trait-bounds-basic.rs +++ b/src/test/run-pass/trait-bounds-basic.rs @@ -29,4 +29,4 @@ fn e(x: ~Foo) { // sugar for ~Foo:Owned b(x); } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/trait-bounds-recursion.rs b/src/test/run-pass/trait-bounds-recursion.rs index 043aa358fa07a..49f8999cd45e4 100644 --- a/src/test/run-pass/trait-bounds-recursion.rs +++ b/src/test/run-pass/trait-bounds-recursion.rs @@ -24,4 +24,4 @@ trait C { fn id>(x:T) -> T { x.j() } } -fn main() { } +pub fn main() { } diff --git a/src/test/run-pass/trait-object-generics.rs b/src/test/run-pass/trait-object-generics.rs index 12b6af295202d..3629316e14d3d 100644 --- a/src/test/run-pass/trait-object-generics.rs +++ b/src/test/run-pass/trait-object-generics.rs @@ -40,7 +40,7 @@ impl Trait for () { fn method(&self, _x: Type<(u8,V)>) -> int { 0 } } -fn main () { +pub fn main () { let a = @() as @Trait; assert_eq!(a.method(Constant), 0); } diff --git a/src/test/run-pass/trait-with-bounds-default.rs b/src/test/run-pass/trait-with-bounds-default.rs index 689df437fb4ba..ba2f32a04990b 100644 --- a/src/test/run-pass/trait-with-bounds-default.rs +++ b/src/test/run-pass/trait-with-bounds-default.rs @@ -34,7 +34,7 @@ impl Getter for Option { } -fn main() { +pub fn main() { assert_eq!(3.do_get2(), (3, 3)); assert_eq!(Some(~"hi").do_get2(), (~"hi", ~"hi")); } diff --git a/src/test/run-pass/traits-default-method-mut.rs b/src/test/run-pass/traits-default-method-mut.rs index 0c5be72432c30..4b217ba0ebbde 100644 --- a/src/test/run-pass/traits-default-method-mut.rs +++ b/src/test/run-pass/traits-default-method-mut.rs @@ -15,4 +15,4 @@ trait Foo { fn foo(&self, mut v: int) { v = 1; } } -fn main() {} +pub fn main() {} diff --git a/src/test/run-pass/transmute-non-immediate-to-immediate.rs b/src/test/run-pass/transmute-non-immediate-to-immediate.rs index 2f097bc90a942..9cdcd8759527a 100644 --- a/src/test/run-pass/transmute-non-immediate-to-immediate.rs +++ b/src/test/run-pass/transmute-non-immediate-to-immediate.rs @@ -11,7 +11,7 @@ // Issue #7988 // Transmuting non-immediate type to immediate type -fn main() { +pub fn main() { unsafe { ::std::cast::transmute::<[int,..1],int>([1]) }; diff --git a/src/test/run-pass/tuple-struct-constructor-pointer.rs b/src/test/run-pass/tuple-struct-constructor-pointer.rs index dbb5db649ef31..e51e6ffd52abc 100644 --- a/src/test/run-pass/tuple-struct-constructor-pointer.rs +++ b/src/test/run-pass/tuple-struct-constructor-pointer.rs @@ -13,7 +13,7 @@ struct Foo(int); #[deriving(Eq)] struct Bar(int, int); -fn main() { +pub fn main() { let f: extern fn(int) -> Foo = Foo; let g: extern fn(int, int) -> Bar = Bar; assert_eq!(f(42), Foo(42)); diff --git a/src/test/run-pass/typeck-macro-interaction-issue-8852.rs b/src/test/run-pass/typeck-macro-interaction-issue-8852.rs index a1368365c4000..19a3c52dea8c3 100644 --- a/src/test/run-pass/typeck-macro-interaction-issue-8852.rs +++ b/src/test/run-pass/typeck-macro-interaction-issue-8852.rs @@ -17,6 +17,6 @@ macro_rules! test( test!(x + y) -fn main() { +pub fn main() { foo(A(1), A(2)); -} \ No newline at end of file +} diff --git a/src/test/run-pass/unfold-cross-crate.rs b/src/test/run-pass/unfold-cross-crate.rs index 42e680d95e19c..0b8447aa0cdff 100644 --- a/src/test/run-pass/unfold-cross-crate.rs +++ b/src/test/run-pass/unfold-cross-crate.rs @@ -13,7 +13,7 @@ use std::iter::*; // Unfold had a bug with 'self that mean it didn't work // cross-crate -fn main() { +pub fn main() { fn count(st: &mut uint) -> Option { if *st < 10 { let ret = Some(*st);