about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndy Russell <arussell123@gmail.com>2019-04-15 13:09:37 -0400
committerAndy Russell <arussell123@gmail.com>2019-04-15 13:09:37 -0400
commit74560f3ab36bb4f7f3aef3c66a3e9717f9ee1978 (patch)
treeb3439a51605f6be33380f96050b4d37ff532a157
parent5b96425699476ccfc4c56185067d80cb792044a3 (diff)
downloadrust-74560f3ab36bb4f7f3aef3c66a3e9717f9ee1978.tar.gz
rust-74560f3ab36bb4f7f3aef3c66a3e9717f9ee1978.zip
include mode in unused binding suggestion span
-rw-r--r--src/librustc/middle/liveness.rs17
-rw-r--r--src/test/ui/lint/issue-54180-unused-ref-field.fixed34
-rw-r--r--src/test/ui/lint/issue-54180-unused-ref-field.rs34
-rw-r--r--src/test/ui/lint/issue-54180-unused-ref-field.stderr39
4 files changed, 119 insertions, 5 deletions
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
+