Skip to content

Commit b6e4f18

Browse files
committed
Replace some aborts with Results
Fixes #31207 by removing abort_if_new_errors
1 parent 9041b93 commit b6e4f18

File tree

9 files changed

+79
-83
lines changed

9 files changed

+79
-83
lines changed

src/librustc/middle/resolve_lifetime.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,12 @@ type Scope<'a> = &'a ScopeChain<'a>;
9393

9494
static ROOT_SCOPE: ScopeChain<'static> = RootScope;
9595

96-
pub fn krate(sess: &Session, krate: &hir::Crate, def_map: &DefMap) -> NamedRegionMap {
96+
pub fn krate(sess: &Session,
97+
krate: &hir::Crate,
98+
def_map: &DefMap)
99+
-> Result<NamedRegionMap, usize> {
97100
let mut named_region_map = NodeMap();
98-
sess.abort_if_new_errors(|| {
101+
try!(sess.track_errors(|| {
99102
krate.visit_all_items(&mut LifetimeContext {
100103
sess: sess,
101104
named_region_map: &mut named_region_map,
@@ -104,8 +107,8 @@ pub fn krate(sess: &Session, krate: &hir::Crate, def_map: &DefMap) -> NamedRegio
104107
trait_ref_hack: false,
105108
labels_in_fn: vec![],
106109
});
107-
});
108-
named_region_map
110+
}));
111+
Ok(named_region_map)
109112
}
110113

111114
impl<'a, 'v> Visitor<'v> for LifetimeContext<'a> {

src/librustc/session/mod.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -188,17 +188,6 @@ impl Session {
188188
Err(count)
189189
}
190190
}
191-
pub fn abort_if_new_errors<F, T>(&self, f: F) -> T
192-
where F: FnOnce() -> T
193-
{
194-
match self.track_errors(f) {
195-
Ok(result) => result,
196-
Err(_) => {
197-
self.abort_if_errors();
198-
unreachable!();
199-
}
200-
}
201-
}
202191
pub fn span_warn<S: Into<MultiSpan>>(&self, sp: S, msg: &str) {
203192
self.diagnostic().span_warn(sp, msg)
204193
}
@@ -515,3 +504,15 @@ pub fn early_warn(output: config::ErrorOutputType, msg: &str) {
515504
};
516505
emitter.emit(None, msg, None, errors::Level::Warning);
517506
}
507+
508+
// Err(0) means compilation was stopped, but no errors were found.
509+
// This would be better as a dedicated enum, but using try! is so convenient.
510+
pub type CompileResult = Result<(), usize>;
511+
512+
pub fn compile_result_from_err_count(err_count: usize) -> CompileResult {
513+
if err_count == 0 {
514+
Ok(())
515+
} else {
516+
Err(err_count)
517+
}
518+
}

src/librustc_driver/driver.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use rustc::front;
1212
use rustc::front::map as hir_map;
1313
use rustc_mir as mir;
1414
use rustc_mir::mir_map::MirMap;
15-
use rustc::session::Session;
15+
use rustc::session::{Session, CompileResult, compile_result_from_err_count};
1616
use rustc::session::config::{self, Input, OutputFilenames, OutputType};
1717
use rustc::session::search_paths::PathKind;
1818
use rustc::lint;
@@ -35,7 +35,7 @@ use rustc_plugin as plugin;
3535
use rustc_front::hir;
3636
use rustc_front::lowering::{lower_crate, LoweringContext};
3737
use rustc_passes::{no_asm, loops, consts, const_fn, rvalues, static_recursion};
38-
use super::{Compilation, CompileResult, compile_result_from_err_count};
38+
use super::Compilation;
3939

4040
use serialize::json;
4141

@@ -659,9 +659,9 @@ pub fn phase_2_configure_and_expand(sess: &Session,
659659
})
660660
}));
661661

662-
time(time_passes,
663-
"const fn bodies and arguments",
664-
|| const_fn::check_crate(sess, &krate));
662+
try!(time(time_passes,
663+
"const fn bodies and arguments",
664+
|| const_fn::check_crate(sess, &krate)));
665665

666666
if sess.opts.debugging_opts.input_stats {
667667
println!("Post-expansion node count: {}", count_nodes(&krate));
@@ -739,9 +739,11 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
739739
"resolution",
740740
|| resolve::resolve_crate(sess, &hir_map, make_glob_map));
741741

742-
let named_region_map = time(time_passes,
743-
"lifetime resolution",
744-
|| middle::resolve_lifetime::krate(sess, krate, &def_map.borrow()));
742+
let named_region_map = try!(time(time_passes,
743+
"lifetime resolution",
744+
|| middle::resolve_lifetime::krate(sess,
745+
krate,
746+
&def_map.borrow())));
745747

746748
time(time_passes,
747749
"looking for entry point",
@@ -759,9 +761,9 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
759761
"loop checking",
760762
|| loops::check_crate(sess, krate));
761763

762-
time(time_passes,
763-
"static item recursion checking",
764-
|| static_recursion::check_crate(sess, krate, &def_map.borrow(), &hir_map));
764+
try!(time(time_passes,
765+
"static item recursion checking",
766+
|| static_recursion::check_crate(sess, krate, &def_map.borrow(), &hir_map)));
765767

766768
ty::ctxt::create_and_enter(sess,
767769
arenas,
@@ -774,7 +776,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
774776
stability::Index::new(krate),
775777
|tcx| {
776778
// passes are timed inside typeck
777-
typeck::check_crate(tcx, trait_map);
779+
try!(typeck::check_crate(tcx, trait_map));
778780

779781
time(time_passes,
780782
"const checking",

src/librustc_driver/lib.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ use pretty::{PpMode, UserIdentifiedItem};
6363
use rustc_resolve as resolve;
6464
use rustc_trans::back::link;
6565
use rustc_trans::save;
66-
use rustc::session::{config, Session, build_session};
66+
use rustc::session::{config, Session, build_session, CompileResult};
6767
use rustc::session::config::{Input, PrintRequest, OutputType, ErrorOutputType};
6868
use rustc::middle::cstore::CrateStore;
6969
use rustc::lint::Lint;
@@ -105,18 +105,6 @@ pub mod target_features;
105105
const BUG_REPORT_URL: &'static str = "https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.\
106106
md#bug-reports";
107107

108-
// Err(0) means compilation was stopped, but no errors were found.
109-
// This would be better as a dedicated enum, but using try! is so convenient.
110-
pub type CompileResult = Result<(), usize>;
111-
112-
pub fn compile_result_from_err_count(err_count: usize) -> CompileResult {
113-
if err_count == 0 {
114-
Ok(())
115-
} else {
116-
Err(err_count)
117-
}
118-
}
119-
120108
#[inline]
121109
fn abort_msg(err_count: usize) -> String {
122110
match err_count {

src/librustc_passes/const_fn.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@
1111
//! Verifies that const fn arguments are immutable by value bindings
1212
//! and the const fn body doesn't contain any statements
1313
14-
use rustc::session::Session;
14+
use rustc::session::{Session, CompileResult};
1515

1616
use syntax::ast;
1717
use syntax::visit::{self, Visitor, FnKind};
1818
use syntax::codemap::Span;
1919

20-
pub fn check_crate(sess: &Session, krate: &ast::Crate) {
21-
sess.abort_if_new_errors(|| {
20+
pub fn check_crate(sess: &Session, krate: &ast::Crate) -> CompileResult {
21+
sess.track_errors(|| {
2222
visit::walk_crate(&mut CheckConstFn{ sess: sess }, krate);
23-
});
23+
})
2424
}
2525

2626
struct CheckConstFn<'a> {

src/librustc_passes/static_recursion.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// recursively.
1313

1414
use rustc::front::map as ast_map;
15-
use rustc::session::Session;
15+
use rustc::session::{Session, CompileResult};
1616
use rustc::middle::def::{Def, DefMap};
1717
use rustc::util::nodemap::NodeMap;
1818

@@ -92,16 +92,16 @@ impl<'a, 'ast: 'a> Visitor<'ast> for CheckCrateVisitor<'a, 'ast> {
9292
pub fn check_crate<'ast>(sess: &Session,
9393
krate: &'ast hir::Crate,
9494
def_map: &DefMap,
95-
ast_map: &ast_map::Map<'ast>) {
95+
ast_map: &ast_map::Map<'ast>) -> CompileResult {
9696
let mut visitor = CheckCrateVisitor {
9797
sess: sess,
9898
def_map: def_map,
9999
ast_map: ast_map,
100100
discriminant_map: RefCell::new(NodeMap()),
101101
};
102-
sess.abort_if_new_errors(|| {
102+
sess.track_errors(|| {
103103
krate.visit_all_items(&mut visitor);
104-
});
104+
})
105105
}
106106

107107
struct CheckItemRecursionVisitor<'a, 'ast: 'a> {

src/librustc_typeck/check/mod.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ use middle::ty::fold::{TypeFolder, TypeFoldable};
105105
use middle::ty::util::Representability;
106106
use require_c_abi_if_variadic;
107107
use rscope::{ElisionFailureInfo, RegionScope};
108-
use session::Session;
108+
use session::{Session, CompileResult};
109109
use {CrateCtxt, lookup_full_def};
110110
use TypeAndSubsts;
111111
use lint;
@@ -383,29 +383,29 @@ impl<'a, 'tcx> Visitor<'tcx> for CheckItemBodiesVisitor<'a, 'tcx> {
383383
}
384384
}
385385

386-
pub fn check_wf_new(ccx: &CrateCtxt) {
387-
ccx.tcx.sess.abort_if_new_errors(|| {
386+
pub fn check_wf_new(ccx: &CrateCtxt) -> CompileResult {
387+
ccx.tcx.sess.track_errors(|| {
388388
let mut visit = wfcheck::CheckTypeWellFormedVisitor::new(ccx);
389389
ccx.tcx.visit_all_items_in_krate(DepNode::WfCheck, &mut visit);
390-
});
390+
})
391391
}
392392

393-
pub fn check_item_types(ccx: &CrateCtxt) {
394-
ccx.tcx.sess.abort_if_new_errors(|| {
393+
pub fn check_item_types(ccx: &CrateCtxt) -> CompileResult {
394+
ccx.tcx.sess.track_errors(|| {
395395
let mut visit = CheckItemTypesVisitor { ccx: ccx };
396396
ccx.tcx.visit_all_items_in_krate(DepNode::TypeckItemType, &mut visit);
397-
});
397+
})
398398
}
399399

400-
pub fn check_item_bodies(ccx: &CrateCtxt) {
401-
ccx.tcx.sess.abort_if_new_errors(|| {
400+
pub fn check_item_bodies(ccx: &CrateCtxt) -> CompileResult {
401+
ccx.tcx.sess.track_errors(|| {
402402
let mut visit = CheckItemBodiesVisitor { ccx: ccx };
403403
ccx.tcx.visit_all_items_in_krate(DepNode::TypeckItemBody, &mut visit);
404-
});
404+
})
405405
}
406406

407-
pub fn check_drop_impls(ccx: &CrateCtxt) {
408-
ccx.tcx.sess.abort_if_new_errors(|| {
407+
pub fn check_drop_impls(ccx: &CrateCtxt) -> CompileResult {
408+
ccx.tcx.sess.track_errors(|| {
409409
let _task = ccx.tcx.dep_graph.in_task(DepNode::Dropck);
410410
let drop_trait = match ccx.tcx.lang_items.drop_trait() {
411411
Some(id) => ccx.tcx.lookup_trait_def(id), None => { return }
@@ -421,7 +421,7 @@ pub fn check_drop_impls(ccx: &CrateCtxt) {
421421
}
422422
}
423423
});
424-
});
424+
})
425425
}
426426

427427
fn check_bare_fn<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,

src/librustc_typeck/lib.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ use middle::def::Def;
105105
use middle::infer::{self, TypeOrigin};
106106
use middle::subst;
107107
use middle::ty::{self, Ty, TypeFoldable};
108-
use session::config;
108+
use session::{config, CompileResult};
109109
use util::common::time;
110110
use rustc_front::hir;
111111

@@ -323,7 +323,7 @@ fn check_for_entry_fn(ccx: &CrateCtxt) {
323323
}
324324
}
325325

326-
pub fn check_crate(tcx: &ty::ctxt, trait_map: ty::TraitMap) {
326+
pub fn check_crate(tcx: &ty::ctxt, trait_map: ty::TraitMap) -> CompileResult {
327327
let time_passes = tcx.sess.time_passes();
328328
let ccx = CrateCtxt {
329329
trait_map: trait_map,
@@ -333,34 +333,40 @@ pub fn check_crate(tcx: &ty::ctxt, trait_map: ty::TraitMap) {
333333

334334
// this ensures that later parts of type checking can assume that items
335335
// have valid types and not error
336-
tcx.sess.abort_if_new_errors(|| {
336+
try!(tcx.sess.track_errors(|| {
337337
time(time_passes, "type collecting", ||
338338
collect::collect_item_types(tcx));
339339

340-
});
340+
}));
341341

342342
time(time_passes, "variance inference", ||
343343
variance::infer_variance(tcx));
344344

345-
tcx.sess.abort_if_new_errors(|| {
345+
try!(tcx.sess.track_errors(|| {
346346
time(time_passes, "coherence checking", ||
347347
coherence::check_coherence(&ccx));
348-
});
348+
}));
349349

350-
time(time_passes, "wf checking", ||
351-
check::check_wf_new(&ccx));
350+
try!(time(time_passes, "wf checking", ||
351+
check::check_wf_new(&ccx)));
352352

353-
time(time_passes, "item-types checking", ||
354-
check::check_item_types(&ccx));
353+
try!(time(time_passes, "item-types checking", ||
354+
check::check_item_types(&ccx)));
355355

356-
time(time_passes, "item-bodies checking", ||
357-
check::check_item_bodies(&ccx));
356+
try!(time(time_passes, "item-bodies checking", ||
357+
check::check_item_bodies(&ccx)));
358358

359-
time(time_passes, "drop-impl checking", ||
360-
check::check_drop_impls(&ccx));
359+
try!(time(time_passes, "drop-impl checking", ||
360+
check::check_drop_impls(&ccx)));
361361

362362
check_for_entry_fn(&ccx);
363-
tcx.sess.abort_if_errors();
363+
364+
let err_count = tcx.sess.err_count();
365+
if err_count == 0 {
366+
Ok(())
367+
} else {
368+
Err(err_count)
369+
}
364370
}
365371

366372
__build_diagnostic_array! { librustc_typeck, DIAGNOSTICS }

src/libsyntax/parse/parser.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2483,8 +2483,7 @@ impl<'a> Parser<'a> {
24832483
float.trunc() as usize,
24842484
format!(".{}", fstr.splitn(2, ".").last().unwrap())));
24852485
}
2486-
err.emit();
2487-
self.abort_if_errors();
2486+
return Err(err);
24882487

24892488
}
24902489
_ => {
@@ -4117,9 +4116,7 @@ impl<'a> Parser<'a> {
41174116
or did you mean the comma-separated arguments \
41184117
'a, Type?");
41194118
err.span_note(mk_sp(span_lo, span_hi), &msg);
4120-
err.emit();
4121-
4122-
self.abort_if_errors()
4119+
return Err(err);
41234120
}
41244121

41254122
// First parse types.
@@ -5189,8 +5186,7 @@ impl<'a> Parser<'a> {
51895186
of possibly redeclaring it",
51905187
paths.name));
51915188
}
5192-
err.emit();
5193-
self.abort_if_errors();
5189+
return Err(err);
51945190
}
51955191

51965192
match paths.result {

0 commit comments

Comments
 (0)