]> git.lizzy.rs Git - rust.git/commitdiff
Continue evaluating after missing main
authorEsteban Küber <esteban@kuber.com.ar>
Fri, 12 Apr 2019 03:01:19 +0000 (20:01 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Fri, 12 Apr 2019 03:01:19 +0000 (20:01 -0700)
src/librustc/middle/entry.rs
src/librustc_interface/passes.rs
src/test/ui/continue-after-missing-main.rs [new file with mode: 0644]
src/test/ui/continue-after-missing-main.stderr [new file with mode: 0644]

index c20454a8822cd65915aadf872bd6246a4c99d4d8..df77033ebef3b5999d489a8dcc3ee6368a95364a 100644 (file)
@@ -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()));
index 1547e15fd48c579733e8d0ed9828100496a5c312..dc43d3c1aca2ae8dc621a54a9df3eb16c9098d2b 100644 (file)
@@ -888,10 +888,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)
             });
 
@@ -939,7 +940,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 (file)
index 0000000..7455c2a
--- /dev/null
@@ -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</*'original_data,*/ MP> {
+        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 (file)
index 0000000..8d64fee
--- /dev/null
@@ -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`.