about summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-02-23 17:24:33 +0000
committerbors <bors@rust-lang.org>2021-02-23 17:24:33 +0000
commitfe1bf8e05c39bdcc73fc09e246b7209444e389bc (patch)
tree9265dd81347434a5b0b6785222fa0b5901e43a1e /src/test/ui
parent019610754363d1d92a8d0f364d2c0909d6f53dfd (diff)
parent51511c75b558beddab7fb4b6d8277a872714b87a (diff)
downloadrust-fe1bf8e05c39bdcc73fc09e246b7209444e389bc.tar.gz
rust-fe1bf8e05c39bdcc73fc09e246b7209444e389bc.zip
Auto merge of #82443 - Dylan-DPC:rollup-yni7uio, r=Dylan-DPC
Rollup of 10 pull requests

Successful merges:

 - #81629 (Point out implicit deref coercions in borrow)
 - #82113 (Improve non_fmt_panic lint.)
 - #82258 (Implement -Z hir-stats for nested foreign items)
 - #82296 (Support `pub` on `macro_rules`)
 - #82297 (Consider auto derefs before warning about write only fields)
 - #82305 (Remove many RefCells from DocContext)
 - #82308 (Lower condition of `if` expression before it's "then" block)
 - #82311 (Jsondocck improvements)
 - #82362 (Fix mir-cfg dumps)
 - #82391 (disable atomic_max/min tests in Miri)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
Diffstat (limited to 'src/test/ui')
-rw-r--r--src/test/ui/borrowck/issue-81365-1.rs26
-rw-r--r--src/test/ui/borrowck/issue-81365-1.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-10.rs26
-rw-r--r--src/test/ui/borrowck/issue-81365-10.stderr13
-rw-r--r--src/test/ui/borrowck/issue-81365-11.rs32
-rw-r--r--src/test/ui/borrowck/issue-81365-11.stderr13
-rw-r--r--src/test/ui/borrowck/issue-81365-2.rs30
-rw-r--r--src/test/ui/borrowck/issue-81365-2.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-3.rs37
-rw-r--r--src/test/ui/borrowck/issue-81365-3.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-4.rs38
-rw-r--r--src/test/ui/borrowck/issue-81365-4.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-5.rs33
-rw-r--r--src/test/ui/borrowck/issue-81365-5.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-6.rs23
-rw-r--r--src/test/ui/borrowck/issue-81365-6.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-7.rs24
-rw-r--r--src/test/ui/borrowck/issue-81365-7.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-8.rs26
-rw-r--r--src/test/ui/borrowck/issue-81365-8.stderr20
-rw-r--r--src/test/ui/borrowck/issue-81365-9.rs26
-rw-r--r--src/test/ui/borrowck/issue-81365-9.stderr13
-rw-r--r--src/test/ui/did_you_mean/pub-macro-rules.rs16
-rw-r--r--src/test/ui/did_you_mean/pub-macro-rules.stderr8
-rw-r--r--src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs10
-rw-r--r--src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr39
-rw-r--r--src/test/ui/issues/issue-81918.rs11
-rw-r--r--src/test/ui/lint/dead-code/write-only-field.rs49
-rw-r--r--src/test/ui/lint/dead-code/write-only-field.stderr20
-rw-r--r--src/test/ui/macros/macro-export-on-modularized-macros.rs11
-rw-r--r--src/test/ui/macros/macro-export-on-modularized-macros.stderr14
-rw-r--r--src/test/ui/macros/pub-macro-rules-fail.rs28
-rw-r--r--src/test/ui/macros/pub-macro-rules-fail.stderr48
-rw-r--r--src/test/ui/macros/pub-macro-rules.rs20
-rw-r--r--src/test/ui/non-fmt-panic.rs11
-rw-r--r--src/test/ui/non-fmt-panic.stderr69
-rw-r--r--src/test/ui/pattern/issue-82290.rs7
-rw-r--r--src/test/ui/pattern/issue-82290.stderr20
38 files changed, 872 insertions, 29 deletions
diff --git a/src/test/ui/borrowck/issue-81365-1.rs b/src/test/ui/borrowck/issue-81365-1.rs
new file mode 100644
index 00000000000..8e212a77016
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-1.rs
@@ -0,0 +1,26 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+impl Container {
+    fn bad_borrow(&mut self) {
+        let first = &self.target_field;
+        self.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-1.stderr b/src/test/ui/borrowck/issue-81365-1.stderr
new file mode 100644
index 00000000000..ef88d7f14a3
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-1.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `self.container_field` because it is borrowed
+  --> $DIR/issue-81365-1.rs:21:9
+   |
+LL |         let first = &self.target_field;
+   |                      ---- borrow of `self.container_field` occurs here
+LL |         self.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `DerefTarget`
+note: deref defined here
+  --> $DIR/issue-81365-1.rs:12:5
+   |
+LL |     type Target = DerefTarget;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-10.rs b/src/test/ui/borrowck/issue-81365-10.rs
new file mode 100644
index 00000000000..7602e184a9f
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-10.rs
@@ -0,0 +1,26 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+impl Container {
+    fn bad_borrow(&mut self) {
+        let first = &self.deref().target_field;
+        self.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-10.stderr b/src/test/ui/borrowck/issue-81365-10.stderr
new file mode 100644
index 00000000000..891f70ed7f6
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-10.stderr
@@ -0,0 +1,13 @@
+error[E0506]: cannot assign to `self.container_field` because it is borrowed
+  --> $DIR/issue-81365-10.rs:21:9
+   |
+LL |         let first = &self.deref().target_field;
+   |                      ---- borrow of `self.container_field` occurs here
+LL |         self.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-11.rs b/src/test/ui/borrowck/issue-81365-11.rs
new file mode 100644
index 00000000000..6b558c65d3d
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-11.rs
@@ -0,0 +1,32 @@
+use std::ops::{Deref, DerefMut};
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+impl DerefMut for Container {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.target
+    }
+}
+
+impl Container {
+    fn bad_borrow(&mut self) {
+        let first = &mut self.target_field;
+        self.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-11.stderr b/src/test/ui/borrowck/issue-81365-11.stderr
new file mode 100644
index 00000000000..0770c136632
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-11.stderr
@@ -0,0 +1,13 @@
+error[E0506]: cannot assign to `self.container_field` because it is borrowed
+  --> $DIR/issue-81365-11.rs:27:9
+   |
+LL |         let first = &mut self.target_field;
+   |                          ---- borrow of `self.container_field` occurs here
+LL |         self.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-2.rs b/src/test/ui/borrowck/issue-81365-2.rs
new file mode 100644
index 00000000000..fbbdd93b97c
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-2.rs
@@ -0,0 +1,30 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+struct Outer {
+    container: Container,
+}
+
+impl Outer {
+    fn bad_borrow(&mut self) {
+        let first = &self.container.target_field;
+        self.container.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-2.stderr b/src/test/ui/borrowck/issue-81365-2.stderr
new file mode 100644
index 00000000000..e71edb50964
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-2.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `self.container.container_field` because it is borrowed
+  --> $DIR/issue-81365-2.rs:25:9
+   |
+LL |         let first = &self.container.target_field;
+   |                      -------------- borrow of `self.container.container_field` occurs here
+LL |         self.container.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `DerefTarget`
+note: deref defined here
+  --> $DIR/issue-81365-2.rs:12:5
+   |
+LL |     type Target = DerefTarget;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-3.rs b/src/test/ui/borrowck/issue-81365-3.rs
new file mode 100644
index 00000000000..9a9e3a31358
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-3.rs
@@ -0,0 +1,37 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+struct Outer {
+    container: Container,
+}
+
+impl Deref for Outer {
+    type Target = Container;
+    fn deref(&self) -> &Self::Target {
+        &self.container
+    }
+}
+
+impl Outer {
+    fn bad_borrow(&mut self) {
+        let first = &self.target_field;
+        self.container.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-3.stderr b/src/test/ui/borrowck/issue-81365-3.stderr
new file mode 100644
index 00000000000..70bb6bb93a9
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-3.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `self.container.container_field` because it is borrowed
+  --> $DIR/issue-81365-3.rs:32:9
+   |
+LL |         let first = &self.target_field;
+   |                      ---- borrow of `self.container.container_field` occurs here
+LL |         self.container.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `Container`
+note: deref defined here
+  --> $DIR/issue-81365-3.rs:23:5
+   |
+LL |     type Target = Container;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-4.rs b/src/test/ui/borrowck/issue-81365-4.rs
new file mode 100644
index 00000000000..b2643eb3358
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-4.rs
@@ -0,0 +1,38 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+struct Outer {
+    container: Container,
+    outer_field: bool,
+}
+
+impl Deref for Outer {
+    type Target = Container;
+    fn deref(&self) -> &Self::Target {
+        &self.container
+    }
+}
+
+impl Outer {
+    fn bad_borrow(&mut self) {
+        let first = &self.target_field;
+        self.outer_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-4.stderr b/src/test/ui/borrowck/issue-81365-4.stderr
new file mode 100644
index 00000000000..e714bb86d1c
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-4.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `self.outer_field` because it is borrowed
+  --> $DIR/issue-81365-4.rs:33:9
+   |
+LL |         let first = &self.target_field;
+   |                      ---- borrow of `self.outer_field` occurs here
+LL |         self.outer_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.outer_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `Container`
+note: deref defined here
+  --> $DIR/issue-81365-4.rs:24:5
+   |
+LL |     type Target = Container;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-5.rs b/src/test/ui/borrowck/issue-81365-5.rs
new file mode 100644
index 00000000000..d36b79615e3
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-5.rs
@@ -0,0 +1,33 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+
+impl DerefTarget {
+    fn get(&self) -> &bool {
+        &self.target_field
+    }
+}
+
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+impl Container {
+    fn bad_borrow(&mut self) {
+        let first = self.get();
+        self.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-5.stderr b/src/test/ui/borrowck/issue-81365-5.stderr
new file mode 100644
index 00000000000..7c0e9f43bd0
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-5.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `self.container_field` because it is borrowed
+  --> $DIR/issue-81365-5.rs:28:9
+   |
+LL |         let first = self.get();
+   |                     ---- borrow of `self.container_field` occurs here
+LL |         self.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `DerefTarget`
+note: deref defined here
+  --> $DIR/issue-81365-5.rs:19:5
+   |
+LL |     type Target = DerefTarget;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-6.rs b/src/test/ui/borrowck/issue-81365-6.rs
new file mode 100644
index 00000000000..85ea77756b3
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-6.rs
@@ -0,0 +1,23 @@
+use std::ops::Deref;
+
+struct Container {
+    target: Vec<()>,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = [()];
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+impl Container {
+    fn bad_borrow(&mut self) {
+        let first = &self[0];
+        self.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-6.stderr b/src/test/ui/borrowck/issue-81365-6.stderr
new file mode 100644
index 00000000000..85ed6acca3d
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-6.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `self.container_field` because it is borrowed
+  --> $DIR/issue-81365-6.rs:18:9
+   |
+LL |         let first = &self[0];
+   |                      ---- borrow of `self.container_field` occurs here
+LL |         self.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `[()]`
+note: deref defined here
+  --> $DIR/issue-81365-6.rs:9:5
+   |
+LL |     type Target = [()];
+   |     ^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-7.rs b/src/test/ui/borrowck/issue-81365-7.rs
new file mode 100644
index 00000000000..cbf70f11a9a
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-7.rs
@@ -0,0 +1,24 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+fn bad_borrow(c: &mut Container) {
+    let first = &c.target_field;
+    c.container_field = true; //~ ERROR E0506
+    first;
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-7.stderr b/src/test/ui/borrowck/issue-81365-7.stderr
new file mode 100644
index 00000000000..506732ec0c5
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-7.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `c.container_field` because it is borrowed
+  --> $DIR/issue-81365-7.rs:20:5
+   |
+LL |     let first = &c.target_field;
+   |                  - borrow of `c.container_field` occurs here
+LL |     c.container_field = true;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `c.container_field` occurs here
+LL |     first;
+   |     ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `DerefTarget`
+note: deref defined here
+  --> $DIR/issue-81365-7.rs:12:5
+   |
+LL |     type Target = DerefTarget;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-8.rs b/src/test/ui/borrowck/issue-81365-8.rs
new file mode 100644
index 00000000000..0bb1033fb42
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-8.rs
@@ -0,0 +1,26 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+impl Container {
+    fn bad_borrow(&mut self) {
+        let first = &(*self).target_field;
+        self.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-8.stderr b/src/test/ui/borrowck/issue-81365-8.stderr
new file mode 100644
index 00000000000..716b6e9b51f
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-8.stderr
@@ -0,0 +1,20 @@
+error[E0506]: cannot assign to `self.container_field` because it is borrowed
+  --> $DIR/issue-81365-8.rs:21:9
+   |
+LL |         let first = &(*self).target_field;
+   |                      ------- borrow of `self.container_field` occurs here
+LL |         self.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+   |
+   = note: borrow occurs due to deref coercion to `DerefTarget`
+note: deref defined here
+  --> $DIR/issue-81365-8.rs:12:5
+   |
+LL |     type Target = DerefTarget;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/borrowck/issue-81365-9.rs b/src/test/ui/borrowck/issue-81365-9.rs
new file mode 100644
index 00000000000..cd57afa288d
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-9.rs
@@ -0,0 +1,26 @@
+use std::ops::Deref;
+
+struct DerefTarget {
+    target_field: bool,
+}
+struct Container {
+    target: DerefTarget,
+    container_field: bool,
+}
+
+impl Deref for Container {
+    type Target = DerefTarget;
+    fn deref(&self) -> &Self::Target {
+        &self.target
+    }
+}
+
+impl Container {
+    fn bad_borrow(&mut self) {
+        let first = &Deref::deref(self).target_field;
+        self.container_field = true; //~ ERROR E0506
+        first;
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-81365-9.stderr b/src/test/ui/borrowck/issue-81365-9.stderr
new file mode 100644
index 00000000000..c7d48214fd4
--- /dev/null
+++ b/src/test/ui/borrowck/issue-81365-9.stderr
@@ -0,0 +1,13 @@
+error[E0506]: cannot assign to `self.container_field` because it is borrowed
+  --> $DIR/issue-81365-9.rs:21:9
+   |
+LL |         let first = &Deref::deref(self).target_field;
+   |                                   ---- borrow of `self.container_field` occurs here
+LL |         self.container_field = true;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
+LL |         first;
+   |         ----- borrow later used here
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0506`.
diff --git a/src/test/ui/did_you_mean/pub-macro-rules.rs b/src/test/ui/did_you_mean/pub-macro-rules.rs
deleted file mode 100644
index c5393703f70..00000000000
--- a/src/test/ui/did_you_mean/pub-macro-rules.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-#[macro_use] mod bleh {
-    pub macro_rules! foo { //~ ERROR can't qualify macro_rules invocation
-        ($n:ident) => (
-            fn $n () -> i32 {
-                1
-            }
-        )
-    }
-
-}
-
-foo!(meh);
-
-fn main() {
-    println!("{}", meh());
-}
diff --git a/src/test/ui/did_you_mean/pub-macro-rules.stderr b/src/test/ui/did_you_mean/pub-macro-rules.stderr
deleted file mode 100644
index 0bde5783b8c..00000000000
--- a/src/test/ui/did_you_mean/pub-macro-rules.stderr
+++ /dev/null
@@ -1,8 +0,0 @@
-error: can't qualify macro_rules invocation with `pub`
-  --> $DIR/pub-macro-rules.rs:2:5
-   |
-LL |     pub macro_rules! foo {
-   |     ^^^ help: try exporting the macro: `#[macro_export]`
-
-error: aborting due to previous error
-
diff --git a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs
new file mode 100644
index 00000000000..5504ec317ae
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs
@@ -0,0 +1,10 @@
+pub macro_rules! m1 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable
+
+#[cfg(FALSE)]
+pub macro_rules! m2 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable
+
+pub(crate) macro_rules! m3 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable
+
+pub(in self) macro_rules! m4 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable
+
+fn main() {}
diff --git a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr
new file mode 100644
index 00000000000..bfaec398d9a
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr
@@ -0,0 +1,39 @@
+error[E0658]: `pub` on `macro_rules` items is unstable
+  --> $DIR/feature-gate-pub_macro_rules.rs:1:1
+   |
+LL | pub macro_rules! m1 { () => {} }
+   | ^^^
+   |
+   = note: see issue #78855 <https://github.com/rust-lang/rust/issues/78855> for more information
+   = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable
+
+error[E0658]: `pub` on `macro_rules` items is unstable
+  --> $DIR/feature-gate-pub_macro_rules.rs:4:1
+   |
+LL | pub macro_rules! m2 { () => {} }
+   | ^^^
+   |
+   = note: see issue #78855 <https://github.com/rust-lang/rust/issues/78855> for more information
+   = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable
+
+error[E0658]: `pub` on `macro_rules` items is unstable
+  --> $DIR/feature-gate-pub_macro_rules.rs:6:1
+   |
+LL | pub(crate) macro_rules! m3 { () => {} }
+   | ^^^^^^^^^^
+   |
+   = note: see issue #78855 <https://github.com/rust-lang/rust/issues/78855> for more information
+   = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable
+
+error[E0658]: `pub` on `macro_rules` items is unstable
+  --> $DIR/feature-gate-pub_macro_rules.rs:8:1
+   |
+LL | pub(in self) macro_rules! m4 { () => {} }
+   | ^^^^^^^^^^^^
+   |
+   = note: see issue #78855 <https://github.com/rust-lang/rust/issues/78855> for more information
+   = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/issues/issue-81918.rs b/src/test/ui/issues/issue-81918.rs
new file mode 100644
index 00000000000..8938b8a6f2c
--- /dev/null
+++ b/src/test/ui/issues/issue-81918.rs
@@ -0,0 +1,11 @@
+// check-pass
+// dont-check-compiler-stdout
+// compile-flags: -Z unpretty=mir-cfg
+
+// This checks that unpretty=mir-cfg does not panic. See #81918.
+
+const TAG: &'static str = "ABCD";
+
+fn main() {
+    if TAG == "" {}
+}
diff --git a/src/test/ui/lint/dead-code/write-only-field.rs b/src/test/ui/lint/dead-code/write-only-field.rs
index 78cfcfda8f9..7b3f1e9f5b6 100644
--- a/src/test/ui/lint/dead-code/write-only-field.rs
+++ b/src/test/ui/lint/dead-code/write-only-field.rs
@@ -17,4 +17,53 @@ fn field_write(s: &mut S) {
 fn main() {
     let mut s = S { f: 0, sub: Sub { f: 0 } };
     field_write(&mut s);
+
+    auto_deref();
+    nested_boxes();
+}
+
+fn auto_deref() {
+    struct E {
+        x: bool,
+        y: bool, //~ ERROR: field is never read
+    }
+
+    struct P<'a> {
+        e: &'a mut E
+    }
+
+    impl P<'_> {
+        fn f(&mut self) {
+            self.e.x = true;
+            self.e.y = true;
+        }
+    }
+
+    let mut e = E { x: false, y: false };
+    let mut p = P { e: &mut e };
+    p.f();
+    assert!(e.x);
+}
+
+fn nested_boxes() {
+    struct A {
+        b: Box<B>,
+    }
+
+    struct B {
+        c: Box<C>,
+    }
+
+    struct C {
+        u: u32, //~ ERROR: field is never read
+        v: u32, //~ ERROR: field is never read
+    }
+
+    let mut a = A {
+        b: Box::new(B {
+            c: Box::new(C { u: 0, v: 0 }),
+        }),
+    };
+    a.b.c.v = 10;
+    a.b.c = Box::new(C { u: 1, v: 2 });
 }
diff --git a/src/test/ui/lint/dead-code/write-only-field.stderr b/src/test/ui/lint/dead-code/write-only-field.stderr
index 70d2149665b..a191d22c8b9 100644
--- a/src/test/ui/lint/dead-code/write-only-field.stderr
+++ b/src/test/ui/lint/dead-code/write-only-field.stderr
@@ -22,5 +22,23 @@ error: field is never read: `f`
 LL |     f: i32,
    |     ^^^^^^
 
-error: aborting due to 3 previous errors
+error: field is never read: `y`
+  --> $DIR/write-only-field.rs:28:9
+   |
+LL |         y: bool,
+   |         ^^^^^^^
+
+error: field is never read: `u`
+  --> $DIR/write-only-field.rs:58:9
+   |
+LL |         u: u32,
+   |         ^^^^^^
+
+error: field is never read: `v`
+  --> $DIR/write-only-field.rs:59:9
+   |
+LL |         v: u32,
+   |         ^^^^^^
+
+error: aborting due to 6 previous errors
 
diff --git a/src/test/ui/macros/macro-export-on-modularized-macros.rs b/src/test/ui/macros/macro-export-on-modularized-macros.rs
new file mode 100644
index 00000000000..467c6ba7b78
--- /dev/null
+++ b/src/test/ui/macros/macro-export-on-modularized-macros.rs
@@ -0,0 +1,11 @@
+#![feature(decl_macro)]
+#![feature(pub_macro_rules)]
+
+#[macro_export]
+macro m1() {} //~ ERROR `#[macro_export]` cannot be used on `macro` items
+
+#[macro_export]
+pub macro_rules! m2 { () => {} }
+//~^ ERROR `#[macro_export]` cannot be used on `macro_rules` with `pub`
+
+fn main() {}
diff --git a/src/test/ui/macros/macro-export-on-modularized-macros.stderr b/src/test/ui/macros/macro-export-on-modularized-macros.stderr
new file mode 100644
index 00000000000..8bb031e12cb
--- /dev/null
+++ b/src/test/ui/macros/macro-export-on-modularized-macros.stderr
@@ -0,0 +1,14 @@
+error: `#[macro_export]` cannot be used on `macro` items
+  --> $DIR/macro-export-on-modularized-macros.rs:5:1
+   |
+LL | macro m1() {}
+   | ^^^^^^^^^^^^^
+
+error: `#[macro_export]` cannot be used on `macro_rules` with `pub`
+  --> $DIR/macro-export-on-modularized-macros.rs:8:1
+   |
+LL | pub macro_rules! m2 { () => {} }
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/macros/pub-macro-rules-fail.rs b/src/test/ui/macros/pub-macro-rules-fail.rs
new file mode 100644
index 00000000000..bdb4c73f18b
--- /dev/null
+++ b/src/test/ui/macros/pub-macro-rules-fail.rs
@@ -0,0 +1,28 @@
+#![feature(pub_macro_rules)]
+
+#[macro_use]
+mod m {
+    pub macro_rules! mac { () => {} }
+
+    // `pub` `macro_rules` cannot be redefined in the same module.
+    pub macro_rules! mac { () => {} } //~ ERROR the name `mac` is defined multiple times
+
+    pub(self) macro_rules! private_mac { () => {} }
+}
+
+const _: () = {
+    pub macro_rules! block_mac { () => {} }
+};
+
+mod n {
+    // Scope of `pub` `macro_rules` is not extended by `#[macro_use]`.
+    mac!(); //~ ERROR cannot find macro `mac` in this scope
+
+    // `pub` `macro_rules` doesn't put the macro into the root module, unlike `#[macro_export]`.
+    crate::mac!(); //~ ERROR failed to resolve: maybe a missing crate `mac`
+    crate::block_mac!(); //~ ERROR failed to resolve: maybe a missing crate `block_mac`
+
+    crate::m::private_mac!(); //~ ERROR macro `private_mac` is private
+}
+
+fn main() {}
diff --git a/src/test/ui/macros/pub-macro-rules-fail.stderr b/src/test/ui/macros/pub-macro-rules-fail.stderr
new file mode 100644
index 00000000000..588d79dd76a
--- /dev/null
+++ b/src/test/ui/macros/pub-macro-rules-fail.stderr
@@ -0,0 +1,48 @@
+error[E0428]: the name `mac` is defined multiple times
+  --> $DIR/pub-macro-rules-fail.rs:8:5
+   |
+LL |     pub macro_rules! mac { () => {} }
+   |     -------------------- previous definition of the macro `mac` here
+...
+LL |     pub macro_rules! mac { () => {} }
+   |     ^^^^^^^^^^^^^^^^^^^^ `mac` redefined here
+   |
+   = note: `mac` must be defined only once in the macro namespace of this module
+
+error[E0433]: failed to resolve: maybe a missing crate `mac`?
+  --> $DIR/pub-macro-rules-fail.rs:22:12
+   |
+LL |     crate::mac!();
+   |            ^^^ maybe a missing crate `mac`?
+
+error[E0433]: failed to resolve: maybe a missing crate `block_mac`?
+  --> $DIR/pub-macro-rules-fail.rs:23:12
+   |
+LL |     crate::block_mac!();
+   |            ^^^^^^^^^ maybe a missing crate `block_mac`?
+
+error: cannot find macro `mac` in this scope
+  --> $DIR/pub-macro-rules-fail.rs:19:5
+   |
+LL |     mac!();
+   |     ^^^
+   |
+   = note: consider importing this macro:
+           m::mac
+
+error[E0603]: macro `private_mac` is private
+  --> $DIR/pub-macro-rules-fail.rs:25:15
+   |
+LL |     crate::m::private_mac!();
+   |               ^^^^^^^^^^^ private macro
+   |
+note: the macro `private_mac` is defined here
+  --> $DIR/pub-macro-rules-fail.rs:10:5
+   |
+LL |     pub(self) macro_rules! private_mac { () => {} }
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 5 previous errors
+
+Some errors have detailed explanations: E0428, E0433, E0603.
+For more information about an error, try `rustc --explain E0428`.
diff --git a/src/test/ui/macros/pub-macro-rules.rs b/src/test/ui/macros/pub-macro-rules.rs
new file mode 100644
index 00000000000..cd4a845f7c0
--- /dev/null
+++ b/src/test/ui/macros/pub-macro-rules.rs
@@ -0,0 +1,20 @@
+// check-pass
+
+#![feature(pub_macro_rules)]
+
+mod m {
+    // `pub` `macro_rules` can be used earlier in item order than they are defined.
+    foo!();
+
+    pub macro_rules! foo { () => {} }
+
+    // `pub(...)` works too.
+    pub(super) macro_rules! bar { () => {} }
+}
+
+// `pub` `macro_rules` are available by module path.
+m::foo!();
+
+m::bar!();
+
+fn main() {}
diff --git a/src/test/ui/non-fmt-panic.rs b/src/test/ui/non-fmt-panic.rs
index 25c53316e12..c80a90b3eaa 100644
--- a/src/test/ui/non-fmt-panic.rs
+++ b/src/test/ui/non-fmt-panic.rs
@@ -29,6 +29,17 @@ fn main() {
     fancy_panic::fancy_panic!(S);
     //~^ WARN panic message is not a string literal
 
+    macro_rules! a {
+        () => { 123 };
+    }
+
+    panic!(a!()); //~ WARN panic message is not a string literal
+
+    panic!(format!("{}", 1)); //~ WARN panic message is not a string literal
+
+    panic![123]; //~ WARN panic message is not a string literal
+    panic!{123}; //~ WARN panic message is not a string literal
+
     // Check that the lint only triggers for std::panic and core::panic,
     // not any panic macro:
     macro_rules! panic {
diff --git a/src/test/ui/non-fmt-panic.stderr b/src/test/ui/non-fmt-panic.stderr
index 45187c518c4..7a333b3e76a 100644
--- a/src/test/ui/non-fmt-panic.stderr
+++ b/src/test/ui/non-fmt-panic.stderr
@@ -93,7 +93,7 @@ LL |     panic!("{}", C);
 help: or use std::panic::panic_any instead
    |
 LL |     std::panic::panic_any(C);
-   |     ^^^^^^^^^^^^^^^^^^^^^^
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 warning: panic message is not a string literal
   --> $DIR/non-fmt-panic.rs:20:12
@@ -109,7 +109,7 @@ LL |     panic!("{}", S);
 help: or use std::panic::panic_any instead
    |
 LL |     std::panic::panic_any(S);
-   |     ^^^^^^^^^^^^^^^^^^^^^^
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 warning: panic message is not a string literal
   --> $DIR/non-fmt-panic.rs:21:17
@@ -125,7 +125,7 @@ LL |     std::panic!("{}", 123);
 help: or use std::panic::panic_any instead
    |
 LL |     std::panic::panic_any(123);
-   |     ^^^^^^^^^^^^^^^^^^^^^^
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 warning: panic message is not a string literal
   --> $DIR/non-fmt-panic.rs:22:18
@@ -183,5 +183,66 @@ LL |     fancy_panic::fancy_panic!(S);
    |
    = note: this is no longer accepted in Rust 2021
 
-warning: 14 warnings emitted
+warning: panic message is not a string literal
+  --> $DIR/non-fmt-panic.rs:36:12
+   |
+LL |     panic!(a!());
+   |            ^^^^
+   |
+   = note: this is no longer accepted in Rust 2021
+help: add a "{}" format string to Display the message
+   |
+LL |     panic!("{}", a!());
+   |            ^^^^^
+help: or use std::panic::panic_any instead
+   |
+LL |     std::panic::panic_any(a!());
+   |     ^^^^^^^^^^^^^^^^^^^^^
+
+warning: panic message is not a string literal
+  --> $DIR/non-fmt-panic.rs:38:12
+   |
+LL |     panic!(format!("{}", 1));
+   |            ^^^^^^^^^^^^^^^^
+   |
+   = note: this is no longer accepted in Rust 2021
+   = note: the panic!() macro supports formatting, so there's no need for the format!() macro here
+help: remove the `format!(..)` macro call
+   |
+LL |     panic!("{}", 1);
+   |           --     --
+
+warning: panic message is not a string literal
+  --> $DIR/non-fmt-panic.rs:40:12
+   |
+LL |     panic![123];
+   |            ^^^
+   |
+   = note: this is no longer accepted in Rust 2021
+help: add a "{}" format string to Display the message
+   |
+LL |     panic!["{}", 123];
+   |            ^^^^^
+help: or use std::panic::panic_any instead
+   |
+LL |     std::panic::panic_any(123);
+   |     ^^^^^^^^^^^^^^^^^^^^^^   ^
+
+warning: panic message is not a string literal
+  --> $DIR/non-fmt-panic.rs:41:12
+   |
+LL |     panic!{123};
+   |            ^^^
+   |
+   = note: this is no longer accepted in Rust 2021
+help: add a "{}" format string to Display the message
+   |
+LL |     panic!{"{}", 123};
+   |            ^^^^^
+help: or use std::panic::panic_any instead
+   |
+LL |     std::panic::panic_any(123);
+   |     ^^^^^^^^^^^^^^^^^^^^^^   ^
+
+warning: 18 warnings emitted
 
diff --git a/src/test/ui/pattern/issue-82290.rs b/src/test/ui/pattern/issue-82290.rs
new file mode 100644
index 00000000000..67f0274fe74
--- /dev/null
+++ b/src/test/ui/pattern/issue-82290.rs
@@ -0,0 +1,7 @@
+#![feature(let_chains)] //~ WARN the feature `let_chains` is incomplete
+
+fn main() {
+    if true && let x = 1 { //~ ERROR `let` expressions are not supported here
+        let _ = x;
+    }
+}
diff --git a/src/test/ui/pattern/issue-82290.stderr b/src/test/ui/pattern/issue-82290.stderr
new file mode 100644
index 00000000000..65ef018dc97
--- /dev/null
+++ b/src/test/ui/pattern/issue-82290.stderr
@@ -0,0 +1,20 @@
+error: `let` expressions are not supported here
+  --> $DIR/issue-82290.rs:4:16
+   |
+LL |     if true && let x = 1 {
+   |                ^^^^^^^^^
+   |
+   = note: only supported directly in conditions of `if`- and `while`-expressions
+   = note: as well as when nested within `&&` and parenthesis in those conditions
+
+warning: the feature `let_chains` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/issue-82290.rs:1:12
+   |
+LL | #![feature(let_chains)]
+   |            ^^^^^^^^^^
+   |
+   = note: `#[warn(incomplete_features)]` on by default
+   = note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
+
+error: aborting due to previous error; 1 warning emitted
+