From 84096e05304794138098395a230028756f9f3b83 Mon Sep 17 00:00:00 2001
From: Unreachable <unreachable@ubuntu2.localdomain>
Date: Fri, 5 Apr 2019 03:05:33 +0000
Subject: [PATCH 1/8] improve docs for std::hint::unreachable_unchecked()

---
 src/libcore/hint.rs | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/libcore/hint.rs b/src/libcore/hint.rs
index d43e6c49f4c..cd4962d30df 100644
--- a/src/libcore/hint.rs
+++ b/src/libcore/hint.rs
@@ -21,9 +21,8 @@ use intrinsics;
 /// difficult-to-debug problems.
 ///
 /// Use this function only when you can prove that the code will never call it.
-///
-/// The [`unreachable!()`] macro is the safe counterpart of this function, which
-/// will panic instead when executed.
+/// Otherwise, consider using the [`unreachable!()`] macro, which does not allow
+/// optimizations but will panic when executed.
 ///
 /// [`unreachable!()`]: ../macro.unreachable.html
 ///

From 62a7bfd1ba299f451421306cb3705d697619359a Mon Sep 17 00:00:00 2001
From: Unreachable <unreachable@ubuntu2.localdomain>
Date: Fri, 5 Apr 2019 17:42:09 +0000
Subject: [PATCH 2/8] Remove parens

---
 src/libcore/hint.rs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/libcore/hint.rs b/src/libcore/hint.rs
index cd4962d30df..89bf3640968 100644
--- a/src/libcore/hint.rs
+++ b/src/libcore/hint.rs
@@ -21,10 +21,10 @@ use intrinsics;
 /// difficult-to-debug problems.
 ///
 /// Use this function only when you can prove that the code will never call it.
-/// Otherwise, consider using the [`unreachable!()`] macro, which does not allow
+/// Otherwise, consider using the [`unreachable!`] macro, which does not allow
 /// optimizations but will panic when executed.
 ///
-/// [`unreachable!()`]: ../macro.unreachable.html
+/// [`unreachable!`]: ../macro.unreachable.html
 ///
 /// # Example
 ///

From 13a05a27e9a5747cad090b1670c0a6b0baa624b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Esteban=20K=C3=BCber?= <esteban@kuber.com.ar>
Date: Thu, 11 Apr 2019 20:01:19 -0700
Subject: [PATCH 3/8] Continue evaluating after missing main

---
 src/librustc/middle/entry.rs                  |  1 -
 src/librustc_interface/passes.rs              |  8 +++--
 src/test/ui/continue-after-missing-main.rs    | 32 +++++++++++++++++++
 .../ui/continue-after-missing-main.stderr     | 17 ++++++++++
 4 files changed, 55 insertions(+), 3 deletions(-)
 create mode 100644 src/test/ui/continue-after-missing-main.rs
 create mode 100644 src/test/ui/continue-after-missing-main.stderr

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 1547e15fd48..dc43d3c1aca 100644
--- a/src/librustc_interface/passes.rs
+++ b/src/librustc_interface/passes.rs
@@ -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
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</*'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
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`.

From 40536548f998fb5830777304a756f839ec8b96de Mon Sep 17 00:00:00 2001
From: vlad-boroda <enity.w@gmail.com>
Date: Sun, 14 Apr 2019 22:54:08 +0300
Subject: [PATCH 4/8] Fix rustdoc sidebar z-index

---
 src/librustdoc/html/static/rustdoc.css | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 2228e58b0d2..6dae600a6fa 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -166,6 +166,7 @@ nav.sub {
 	top: 0;
 	height: 100vh;
 	overflow: auto;
+	z-index: 1;
 }
 
 .sidebar .block > ul > li {

From 1c0e1c10d5c6463147690aba7696a7cbcf2840a1 Mon Sep 17 00:00:00 2001
From: QuietMisdreavus <grey@quietmisdreavus.net>
Date: Mon, 15 Apr 2019 11:20:08 -0500
Subject: [PATCH 5/8] use --static-root-path for settings.js

---
 src/librustdoc/html/render.rs        | 3 ++-
 src/test/rustdoc/static-root-path.rs | 4 ++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 3ee131d8f5c..d91b78c8416 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -2113,7 +2113,8 @@ impl Context {
                  &final_file);
 
         // Generating settings page.
-        let settings = Settings::new("./", &self.shared.resource_suffix);
+        let settings = Settings::new(self.shared.static_root_path.deref().unwrap_or("./"),
+                                     &self.shared.resource_suffix);
         page.title = "Rustdoc settings";
         page.description = "Settings of Rustdoc";
         page.root_path = "./";
diff --git a/src/test/rustdoc/static-root-path.rs b/src/test/rustdoc/static-root-path.rs
index 84b32f90c89..2f7c89c5f1e 100644
--- a/src/test/rustdoc/static-root-path.rs
+++ b/src/test/rustdoc/static-root-path.rs
@@ -12,3 +12,7 @@ pub struct SomeStruct;
 // @!matches - '"\.\./\.\./source-script\.js"'
 // @matches - '"\.\./\.\./source-files.js"'
 // @!matches - '"/cache/source-files\.js"'
+
+// @has settings.html
+// @matches - '/cache/settings\.js'
+// @!matches - '\./settings\.js'

From 74560f3ab36bb4f7f3aef3c66a3e9717f9ee1978 Mon Sep 17 00:00:00 2001
From: Andy Russell <arussell123@gmail.com>
Date: Mon, 15 Apr 2019 13:09:37 -0400
Subject: [PATCH 6/8] include mode in unused binding suggestion span

---
 src/librustc/middle/liveness.rs               | 17 +++++---
 .../lint/issue-54180-unused-ref-field.fixed   | 34 ++++++++++++++++
 .../ui/lint/issue-54180-unused-ref-field.rs   | 34 ++++++++++++++++
 .../lint/issue-54180-unused-ref-field.stderr  | 39 +++++++++++++++++++
 4 files changed, 119 insertions(+), 5 deletions(-)
 create mode 100644 src/test/ui/lint/issue-54180-unused-ref-field.fixed
 create mode 100644 src/test/ui/lint/issue-54180-unused-ref-field.rs
 create mode 100644 src/test/ui/lint/issue-54180-unused-ref-field.stderr

diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs
index f5a95d7004b..2fbe79ec8eb 100644
--- a/src/librustc/middle/liveness.rs
+++ b/src/librustc/middle/liveness.rs
@@ -1627,11 +1627,18 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
                     );
 
                     if self.ir.variable_is_shorthand(var) {
-                        err.multipart_suggestion(
-                            "try ignoring the field",
-                            spans.iter().map(|span| (*span, format!("{}: _", name))).collect(),
-                            Applicability::MachineApplicable
-                        );
+                        if let Node::Binding(pat) = self.ir.tcx.hir().get_by_hir_id(hir_id) {
+                            // Handle `ref` and `ref mut`.
+                            let spans = spans.iter()
+                                .map(|_span| (pat.span, format!("{}: _", name)))
+                                .collect();
+
+                            err.multipart_suggestion(
+                                "try ignoring the field",
+                                spans,
+                                Applicability::MachineApplicable,
+                            );
+                        }
                     } else {
                         err.multipart_suggestion(
                             "consider prefixing with an underscore",
diff --git a/src/test/ui/lint/issue-54180-unused-ref-field.fixed b/src/test/ui/lint/issue-54180-unused-ref-field.fixed
new file mode 100644
index 00000000000..1350b7ca699
--- /dev/null
+++ b/src/test/ui/lint/issue-54180-unused-ref-field.fixed
@@ -0,0 +1,34 @@
+// run-rustfix
+
+#![deny(unused)]
+
+pub struct S {
+    pub f1: i32,
+}
+
+pub struct Point {
+    pub x: i32,
+    pub y: i32,
+}
+
+pub enum E {
+    Variant { field: String }
+}
+
+pub fn foo(arg: &E) {
+    match arg {
+        E::Variant { field: _ } => (), //~ ERROR unused variable
+    }
+}
+
+fn main() {
+    let s = S { f1: 123 };
+    let S { f1: _ } = s; //~ ERROR unused variable
+
+    let points = vec![Point { x: 1, y: 2 }];
+    let _: i32 = points.iter().map(|Point { x: _, y }| y).sum(); //~ ERROR unused variable
+
+    match (Point { x: 1, y: 2 }) {
+        Point { y, x: _ } => y, //~ ERROR unused variable
+    };
+}
diff --git a/src/test/ui/lint/issue-54180-unused-ref-field.rs b/src/test/ui/lint/issue-54180-unused-ref-field.rs
new file mode 100644
index 00000000000..7b3392b609a
--- /dev/null
+++ b/src/test/ui/lint/issue-54180-unused-ref-field.rs
@@ -0,0 +1,34 @@
+// run-rustfix
+
+#![deny(unused)]
+
+pub struct S {
+    pub f1: i32,
+}
+
+pub struct Point {
+    pub x: i32,
+    pub y: i32,
+}
+
+pub enum E {
+    Variant { field: String }
+}
+
+pub fn foo(arg: &E) {
+    match arg {
+        E::Variant { ref field } => (), //~ ERROR unused variable
+    }
+}
+
+fn main() {
+    let s = S { f1: 123 };
+    let S { ref f1 } = s; //~ ERROR unused variable
+
+    let points = vec![Point { x: 1, y: 2 }];
+    let _: i32 = points.iter().map(|Point { x, y }| y).sum(); //~ ERROR unused variable
+
+    match (Point { x: 1, y: 2 }) {
+        Point { y, ref mut x } => y, //~ ERROR unused variable
+    };
+}
diff --git a/src/test/ui/lint/issue-54180-unused-ref-field.stderr b/src/test/ui/lint/issue-54180-unused-ref-field.stderr
new file mode 100644
index 00000000000..9f47554a1a6
--- /dev/null
+++ b/src/test/ui/lint/issue-54180-unused-ref-field.stderr
@@ -0,0 +1,39 @@
+error: unused variable: `field`
+  --> $DIR/issue-54180-unused-ref-field.rs:20:26
+   |
+LL |         E::Variant { ref field } => (),
+   |                      ----^^^^^
+   |                      |
+   |                      help: try ignoring the field: `field: _`
+   |
+note: lint level defined here
+  --> $DIR/issue-54180-unused-ref-field.rs:3:9
+   |
+LL | #![deny(unused)]
+   |         ^^^^^^
+   = note: #[deny(unused_variables)] implied by #[deny(unused)]
+
+error: unused variable: `x`
+  --> $DIR/issue-54180-unused-ref-field.rs:29:45
+   |
+LL |     let _: i32 = points.iter().map(|Point { x, y }| y).sum();
+   |                                             ^ help: try ignoring the field: `x: _`
+
+error: unused variable: `f1`
+  --> $DIR/issue-54180-unused-ref-field.rs:26:17
+   |
+LL |     let S { ref f1 } = s;
+   |             ----^^
+   |             |
+   |             help: try ignoring the field: `f1: _`
+
+error: unused variable: `x`
+  --> $DIR/issue-54180-unused-ref-field.rs:32:28
+   |
+LL |         Point { y, ref mut x } => y,
+   |                    --------^
+   |                    |
+   |                    help: try ignoring the field: `x: _`
+
+error: aborting due to 4 previous errors
+

From 9e171937b64f513f7848593257364cd8495399d5 Mon Sep 17 00:00:00 2001
From: vlad-boroda <enity.w@gmail.com>
Date: Mon, 15 Apr 2019 20:18:53 +0300
Subject: [PATCH 7/8] change word wrapping mode

---
 src/librustdoc/html/static/rustdoc.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 6dae600a6fa..8cf70b9a995 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -346,7 +346,7 @@ nav.sub {
 	margin: 0;
 }
 .docblock-short code {
-	white-space: nowrap;
+	white-space: pre-wrap;
 }
 
 .docblock h1, .docblock h2, .docblock h3, .docblock h4, .docblock h5 {

From 3db489bdcfcf2c31034194a30ca60a7cc2ba5adb Mon Sep 17 00:00:00 2001
From: Pietro Albini <pietro@pietroalbini.org>
Date: Mon, 15 Apr 2019 23:52:59 +0200
Subject: [PATCH 8/8] add repo-specific triagebot configuration

---
 triagebot.toml | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 triagebot.toml

diff --git a/triagebot.toml b/triagebot.toml
new file mode 100644
index 00000000000..6f60481600c
--- /dev/null
+++ b/triagebot.toml
@@ -0,0 +1,6 @@
+[relabel]
+allow-unauthenticated = [
+    "C-*", "A-*", "E-*", "NLL-*", "O-*", "S-*", "T-*", "WG-*",
+    # I-* without I-nominated
+    "I-compilemem", "I-compiletime", "I-crash", "I-hang", "I-ICE", "I-slow",
+]