about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJonas Schievink <jonas@schievink.net>2016-02-19 14:43:13 +0100
committerJonas Schievink <jonas@schievink.net>2016-02-19 14:43:13 +0100
commit11e0ba43401b0fcf4d61a4e91ad8d7020da74994 (patch)
tree01c74259cb1ec68446f1add4af0e926cad61b91d /src
parent3a872782d396e9ed3827a515a54d1f0a634c0b77 (diff)
downloadrust-11e0ba43401b0fcf4d61a4e91ad8d7020da74994.tar.gz
rust-11e0ba43401b0fcf4d61a4e91ad8d7020da74994.zip
Do less panicking in general
Diffstat (limited to 'src')
-rw-r--r--src/librustc_driver/driver.rs8
-rw-r--r--src/librustc_driver/lib.rs14
-rw-r--r--src/libsyntax/parse/mod.rs4
3 files changed, 24 insertions, 2 deletions
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs
index 736633c1614..6ef42984905 100644
--- a/src/librustc_driver/driver.rs
+++ b/src/librustc_driver/driver.rs
@@ -84,7 +84,13 @@ pub fn compile_input(sess: &Session,
     // possible to keep the peak memory usage low
     let (outputs, trans) = {
         let (outputs, expanded_crate, id) = {
-            let krate = panictry!(phase_1_parse_input(sess, cfg, input));
+            let krate = match phase_1_parse_input(sess, cfg, input) {
+                Ok(krate) => krate,
+                Err(mut parse_error) => {
+                    parse_error.emit();
+                    return Err(1);
+                }
+            };
 
             controller_entry_point!(after_parse,
                                     sess,
diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs
index 05317097d0c..6f28d475aa6 100644
--- a/src/librustc_driver/lib.rs
+++ b/src/librustc_driver/lib.rs
@@ -529,7 +529,19 @@ impl RustcDefaultCalls {
             return Compilation::Continue;
         }
 
-        let attrs = input.map(|input| panictry!(parse_crate_attrs(sess, input)));
+        let attrs = match input {
+            None => None,
+            Some(input) => {
+                let result = parse_crate_attrs(sess, input);
+                match result {
+                    Ok(attrs) => Some(attrs),
+                    Err(mut parse_error) => {
+                        parse_error.emit();
+                        return Compilation::Stop;
+                    }
+                }
+            }
+        };
         for req in &sess.opts.prints {
             match *req {
                 PrintRequest::TargetList => {
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index 9bcf1079a64..ea5d6739e6d 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -120,6 +120,10 @@ pub fn parse_expr_from_source_str<'a>(name: String,
     p.parse_expr()
 }
 
+/// Parses an item.
+///
+/// Returns `Ok(Some(item))` when successful, `Ok(None)` when no item was found, and`Err`
+/// when a syntax error occurred.
 pub fn parse_item_from_source_str<'a>(name: String,
                                       source: String,
                                       cfg: ast::CrateConfig,