]> git.lizzy.rs Git - rust.git/commitdiff
auto merge of #8279 : pcwalton/rust/no-main, r=brson
authorbors <bors@rust-lang.org>
Mon, 5 Aug 2013 11:37:58 +0000 (04:37 -0700)
committerbors <bors@rust-lang.org>
Mon, 5 Aug 2013 11:37:58 +0000 (04:37 -0700)
Useful for SDL and possibly Android too.

r? @brson

src/librustc/driver/session.rs
src/librustc/middle/entry.rs
src/librustc/middle/trans/base.rs
src/librustc/middle/typeck/mod.rs

index e43f85008d5c365d9803c0f64a25ce29c3535e85..d725e2db1eba109474b71b0a65eaf6d655fd8e6c 100644 (file)
@@ -179,7 +179,8 @@ pub struct crate_metadata {
 #[deriving(Eq)]
 pub enum EntryFnType {
     EntryMain,
-    EntryStart
+    EntryStart,
+    EntryNone,
 }
 
 pub struct Session_ {
index 1bf5c944fabb00e0b8c5c34756d37f98ffb7b62a..34aeaf8a6cebec8fdff7622bf60eee665d54b07c 100644 (file)
@@ -50,6 +50,12 @@ pub fn find_entry_point(session: Session, crate: &Crate, ast_map: ast_map::map)
         return;
     }
 
+    // If the user wants no main function at all, then stop here.
+    if attr::contains_name(crate.attrs, "no_main") {
+        *session.entry_type = Some(session::EntryNone);
+        return
+    }
+
     let ctxt = @mut EntryContext {
         session: session,
         ast_map: ast_map,
index fc39af095b79c9a1dea95f31d789d7190ce4c2fb..0a28da5f88a7ce0fa575e7927cc18ab9c71b336c 100644 (file)
@@ -2268,13 +2268,16 @@ pub fn is_entry_fn(sess: &Session, node_id: ast::NodeId) -> bool {
 // Create a _rust_main(args: ~[str]) function which will be called from the
 // runtime rust_start function
 pub fn create_entry_wrapper(ccx: @mut CrateContext,
-                           _sp: span, main_llfn: ValueRef) {
+                           _sp: span,
+                           main_llfn: ValueRef) {
     let et = ccx.sess.entry_type.unwrap();
-    if et == session::EntryMain {
-        let llfn = create_main(ccx, main_llfn);
-        create_entry_fn(ccx, llfn, true);
-    } else {
-        create_entry_fn(ccx, main_llfn, false);
+    match et {
+        session::EntryMain => {
+            let llfn = create_main(ccx, main_llfn);
+            create_entry_fn(ccx, llfn, true);
+        }
+        session::EntryStart => create_entry_fn(ccx, main_llfn, false),
+        session::EntryNone => {}    // Do nothing.
     }
 
     fn create_main(ccx: @mut CrateContext, main_llfn: ValueRef) -> ValueRef {
index 6128c16996742a4152a9b17594dbbbe3b8920311..e6c27fc8f836d1ee5db0a598ae661a551a939885 100644 (file)
@@ -408,9 +408,10 @@ fn check_for_entry_fn(ccx: &CrateCtxt) {
           Some((id, sp)) => match *tcx.sess.entry_type {
               Some(session::EntryMain) => check_main_fn_ty(ccx, id, sp),
               Some(session::EntryStart) => check_start_fn_ty(ccx, id, sp),
+              Some(session::EntryNone) => {}
               None => tcx.sess.bug("entry function without a type")
           },
-          None => tcx.sess.bug("type checking without entry function")
+          None => {}
         }
     }
 }