diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 736633c1614ef..6ef429849050b 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 05317097d0c87..6f28d475aa633 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 9bcf1079a6481..ea5d6739e6dd3 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,