@@ -69,8 +69,8 @@ pub fn compile_input(sess: Session,
6969 let state = $make_state;
7070 ( control. $point. callback) ( state) ;
7171
72- $tsess. abort_if_errors( ) ;
7372 if control. $point. stop == Compilation :: Stop {
73+ $tsess. abort_if_errors( ) ;
7474 return ;
7575 }
7676 } ) }
@@ -470,7 +470,11 @@ pub fn phase_2_configure_and_expand(sess: &Session,
470470
471471 let mut feature_gated_cfgs = vec ! [ ] ;
472472 krate = time ( time_passes, "configuration 1" , || {
473- syntax:: config:: strip_unconfigured_items ( sess. diagnostic ( ) , krate, & mut feature_gated_cfgs)
473+ sess. abort_if_new_errors ( || {
474+ syntax:: config:: strip_unconfigured_items ( sess. diagnostic ( ) ,
475+ krate,
476+ & mut feature_gated_cfgs)
477+ } )
474478 } ) ;
475479
476480 * sess. crate_types . borrow_mut ( ) = collect_crate_types ( sess, & krate. attrs ) ;
@@ -481,13 +485,15 @@ pub fn phase_2_configure_and_expand(sess: &Session,
481485 } ) ;
482486
483487 time ( time_passes, "gated macro checking" , || {
484- let features = syntax:: feature_gate:: check_crate_macros ( sess. codemap ( ) ,
485- & sess. parse_sess . span_diagnostic ,
486- & krate) ;
487-
488- // these need to be set "early" so that expansion sees `quote` if enabled.
489- * sess. features . borrow_mut ( ) = features;
490- sess. abort_if_errors ( ) ;
488+ sess. abort_if_new_errors ( || {
489+ let features =
490+ syntax:: feature_gate:: check_crate_macros ( sess. codemap ( ) ,
491+ & sess. parse_sess . span_diagnostic ,
492+ & krate) ;
493+
494+ // these need to be set "early" so that expansion sees `quote` if enabled.
495+ * sess. features . borrow_mut ( ) = features;
496+ } ) ;
491497 } ) ;
492498
493499
@@ -525,7 +531,7 @@ pub fn phase_2_configure_and_expand(sess: &Session,
525531 let Registry { syntax_exts, early_lint_passes, late_lint_passes, lint_groups,
526532 llvm_passes, attributes, .. } = registry;
527533
528- {
534+ sess . abort_if_new_errors ( || {
529535 let mut ls = sess. lint_store . borrow_mut ( ) ;
530536 for pass in early_lint_passes {
531537 ls. register_early_pass ( Some ( sess) , true , pass) ;
@@ -540,17 +546,14 @@ pub fn phase_2_configure_and_expand(sess: &Session,
540546
541547 * sess. plugin_llvm_passes . borrow_mut ( ) = llvm_passes;
542548 * sess. plugin_attributes . borrow_mut ( ) = attributes. clone ( ) ;
543- }
549+ } ) ;
544550
545551 // Lint plugins are registered; now we can process command line flags.
546552 if sess. opts . describe_lints {
547553 super :: describe_lints ( & * sess. lint_store . borrow ( ) , true ) ;
548554 return None ;
549555 }
550- sess. lint_store . borrow_mut ( ) . process_command_line ( sess) ;
551-
552- // Abort if there are errors from lint processing or a plugin registrar.
553- sess. abort_if_errors ( ) ;
556+ sess. abort_if_new_errors ( || sess. lint_store . borrow_mut ( ) . process_command_line ( sess) ) ;
554557
555558 krate = time ( time_passes, "expansion" , || {
556559 // Windows dlls do not have rpaths, so they don't know how to find their
@@ -594,29 +597,36 @@ pub fn phase_2_configure_and_expand(sess: &Session,
594597 // much as possible (e.g. help the programmer avoid platform
595598 // specific differences)
596599 time ( time_passes, "complete gated feature checking 1" , || {
597- let features = syntax:: feature_gate:: check_crate ( sess. codemap ( ) ,
598- & sess. parse_sess . span_diagnostic ,
599- & krate,
600- & attributes,
601- sess. opts . unstable_features ) ;
602- * sess. features . borrow_mut ( ) = features;
603- sess. abort_if_errors ( ) ;
600+ sess. abort_if_new_errors ( || {
601+ let features = syntax:: feature_gate:: check_crate ( sess. codemap ( ) ,
602+ & sess. parse_sess . span_diagnostic ,
603+ & krate,
604+ & attributes,
605+ sess. opts . unstable_features ) ;
606+ * sess. features . borrow_mut ( ) = features;
607+ } ) ;
604608 } ) ;
605609
606610 // JBC: make CFG processing part of expansion to avoid this problem:
607611
608612 // strip again, in case expansion added anything with a #[cfg].
609- krate = time ( time_passes, "configuration 2" , || {
610- syntax:: config:: strip_unconfigured_items ( sess. diagnostic ( ) , krate, & mut feature_gated_cfgs)
611- } ) ;
613+ krate = sess. abort_if_new_errors ( || {
614+ let krate = time ( time_passes, "configuration 2" , || {
615+ syntax:: config:: strip_unconfigured_items ( sess. diagnostic ( ) ,
616+ krate,
617+ & mut feature_gated_cfgs)
618+ } ) ;
612619
613- time ( time_passes, "gated configuration checking" , || {
614- let features = sess. features . borrow ( ) ;
615- feature_gated_cfgs. sort ( ) ;
616- feature_gated_cfgs. dedup ( ) ;
617- for cfg in & feature_gated_cfgs {
618- cfg. check_and_emit ( sess. diagnostic ( ) , & features, sess. codemap ( ) ) ;
619- }
620+ time ( time_passes, "gated configuration checking" , || {
621+ let features = sess. features . borrow ( ) ;
622+ feature_gated_cfgs. sort ( ) ;
623+ feature_gated_cfgs. dedup ( ) ;
624+ for cfg in & feature_gated_cfgs {
625+ cfg. check_and_emit ( sess. diagnostic ( ) , & features, sess. codemap ( ) ) ;
626+ }
627+ } ) ;
628+
629+ krate
620630 } ) ;
621631
622632 krate = time ( time_passes, "maybe building test harness" , || {
@@ -639,13 +649,14 @@ pub fn phase_2_configure_and_expand(sess: &Session,
639649 // later, to make sure we've got everything (e.g. configuration
640650 // can insert new attributes via `cfg_attr`)
641651 time ( time_passes, "complete gated feature checking 2" , || {
642- let features = syntax:: feature_gate:: check_crate ( sess. codemap ( ) ,
643- & sess. parse_sess . span_diagnostic ,
644- & krate,
645- & attributes,
646- sess. opts . unstable_features ) ;
647- * sess. features . borrow_mut ( ) = features;
648- sess. abort_if_errors ( ) ;
652+ sess. abort_if_new_errors ( || {
653+ let features = syntax:: feature_gate:: check_crate ( sess. codemap ( ) ,
654+ & sess. parse_sess . span_diagnostic ,
655+ & krate,
656+ & attributes,
657+ sess. opts . unstable_features ) ;
658+ * sess. features . borrow_mut ( ) = features;
659+ } ) ;
649660 } ) ;
650661
651662 time ( time_passes,
@@ -711,9 +722,11 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
711722 "external crate/lib resolution" ,
712723 || LocalCrateReader :: new ( sess, cstore, & hir_map) . read_crates ( krate) ) ;
713724
714- let lang_items = time ( time_passes,
715- "language item collection" ,
716- || middle:: lang_items:: collect_language_items ( & sess, & hir_map) ) ;
725+ let lang_items = time ( time_passes, "language item collection" , || {
726+ sess. abort_if_new_errors ( || {
727+ middle:: lang_items:: collect_language_items ( & sess, & hir_map)
728+ } )
729+ } ) ;
717730
718731 let resolve:: CrateMap {
719732 def_map,
0 commit comments