diff --git a/src/librustc/middle/entry.rs b/src/librustc/middle/entry.rs index c20454a8822..df77033ebef 100644 --- a/src/librustc/middle/entry.rs +++ b/src/librustc/middle/entry.rs @@ -163,7 +163,6 @@ fn configure_main( err.span_note(span, "here is a function named 'main'"); } err.emit(); - tcx.sess.abort_if_errors(); } else { if let Some(ref filename) = tcx.sess.local_crate_source_file { err.note(&format!("consider adding a `main` function to `{}`", filename.display())); diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index 3fd684f5d97..2f01254ed5f 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -886,10 +886,11 @@ fn analysis<'tcx>( assert_eq!(cnum, LOCAL_CRATE); let sess = tcx.sess; + let mut entry_point = None; time(sess, "misc checking 1", || { parallel!({ - time(sess, "looking for entry point", || { + entry_point = time(sess, "looking for entry point", || { middle::entry::find_entry_point(tcx) }); @@ -937,7 +938,10 @@ fn analysis<'tcx>( // Abort so we don't try to construct MIR with liveness errors. // We also won't want to continue with errors from rvalue promotion - tcx.sess.abort_if_errors(); + // We only do so if the only error found so far *isn't* a missing `fn main()` + if !(entry_point.is_none() && sess.err_count() == 1) { + tcx.sess.abort_if_errors(); + } time(sess, "borrow checking", || { if tcx.use_ast_borrowck() { diff --git a/src/test/ui/continue-after-missing-main.rs b/src/test/ui/continue-after-missing-main.rs new file mode 100644 index 00000000000..7455c2a431d --- /dev/null +++ b/src/test/ui/continue-after-missing-main.rs @@ -0,0 +1,32 @@ +#![allow(dead_code)] + +// error-pattern:`main` function not found in crate + +struct Tableau<'a, MP> { + provider: &'a MP, +} + +impl<'adapted_matrix_provider, 'original_data, MP> + Tableau<'adapted_matrix_provider, AdaptedMatrixProvider<'original_data, MP>> +{ + fn provider(&self) -> &'adapted_matrix_provider AdaptedMatrixProvider { + self.provider + } +} + +struct AdaptedMatrixProvider<'a, T> { + original_problem: &'a T, +} + +impl<'a, T> AdaptedMatrixProvider<'a, T> { + fn clone_with_extra_bound(&self) -> Self { + AdaptedMatrixProvider { original_problem: self.original_problem } + } +} + +fn create_and_solve_subproblems<'data_provider, 'original_data, MP>( + tableau: Tableau<'data_provider, AdaptedMatrixProvider<'original_data, MP>>, +) { + let _: AdaptedMatrixProvider<'original_data, MP> = tableau.provider().clone_with_extra_bound(); + //~^ ERROR lifetime mismatch +} diff --git a/src/test/ui/continue-after-missing-main.stderr b/src/test/ui/continue-after-missing-main.stderr new file mode 100644 index 00000000000..8d64fee8bda --- /dev/null +++ b/src/test/ui/continue-after-missing-main.stderr @@ -0,0 +1,17 @@ +error[E0601]: `main` function not found in crate `continue_after_missing_main` + | + = note: consider adding a `main` function to `$DIR/continue-after-missing-main.rs` + +error[E0623]: lifetime mismatch + --> $DIR/continue-after-missing-main.rs:30:56 + | +LL | tableau: Tableau<'data_provider, AdaptedMatrixProvider<'original_data, MP>>, + | ------------------------------------------------------------------ these two types are declared with different lifetimes... +LL | ) { +LL | let _: AdaptedMatrixProvider<'original_data, MP> = tableau.provider().clone_with_extra_bound(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...but data from `tableau` flows into `tableau` here + +error: aborting due to 2 previous errors + +Some errors occurred: E0601, E0623. +For more information about an error, try `rustc --explain E0601`.