about summary refs log tree commit diff
diff options
context:
space:
mode:
authorflip1995 <hello@philkrones.com>2019-08-05 09:30:24 +0200
committerflip1995 <hello@philkrones.com>2019-08-05 09:31:08 +0200
commit385f4474da199a0f21c93be454043b9bb25f2cd7 (patch)
tree7ae9a090d128a284daaf4f3651508ba180275ec6
parentc5ad0b075a1bf37c0dad43fbe763d1fa56b12c3f (diff)
downloadrust-385f4474da199a0f21c93be454043b9bb25f2cd7.tar.gz
rust-385f4474da199a0f21c93be454043b9bb25f2cd7.zip
Add tests for auto fixable let_unit suggestion
-rw-r--r--tests/ui/let_unit.fixed63
-rw-r--r--tests/ui/let_unit.rs17
-rw-r--r--tests/ui/let_unit.stderr35
3 files changed, 108 insertions, 7 deletions
diff --git a/tests/ui/let_unit.fixed b/tests/ui/let_unit.fixed
new file mode 100644
index 00000000000..f398edc23cb
--- /dev/null
+++ b/tests/ui/let_unit.fixed
@@ -0,0 +1,63 @@
+// run-rustfix
+
+#![warn(clippy::let_unit_value)]
+#![allow(clippy::no_effect)]
+#![allow(unused_variables)]
+
+macro_rules! let_and_return {
+    ($n:expr) => {{
+        let ret = $n;
+    }};
+}
+
+fn main() {
+    println!("x");
+    let _y = 1; // this is fine
+    let _z = ((), 1); // this as well
+    if true {
+        ();
+    }
+
+    consume_units_with_for_loop(); // should be fine as well
+
+    multiline_sugg();
+
+    let_and_return!(()) // should be fine
+}
+
+// Related to issue #1964
+fn consume_units_with_for_loop() {
+    // `for_let_unit` lint should not be triggered by consuming them using for loop.
+    let v = vec![(), (), ()];
+    let mut count = 0;
+    for _ in v {
+        count += 1;
+    }
+    assert_eq!(count, 3);
+
+    // Same for consuming from some other Iterator<Item = ()>.
+    let (tx, rx) = ::std::sync::mpsc::channel();
+    tx.send(()).unwrap();
+    drop(tx);
+
+    count = 0;
+    for _ in rx.iter() {
+        count += 1;
+    }
+    assert_eq!(count, 1);
+}
+
+fn multiline_sugg() {
+    let v: Vec<u8> = vec![2];
+
+    v
+        .into_iter()
+        .map(|i| i * 2)
+        .filter(|i| i % 2 == 0)
+        .map(|_| ())
+        .next()
+        .unwrap();
+}
+
+#[derive(Copy, Clone)]
+pub struct ContainsUnit(()); // should be fine
diff --git a/tests/ui/let_unit.rs b/tests/ui/let_unit.rs
index dc17c98f6a8..af5b1fb2ac7 100644
--- a/tests/ui/let_unit.rs
+++ b/tests/ui/let_unit.rs
@@ -1,4 +1,7 @@
+// run-rustfix
+
 #![warn(clippy::let_unit_value)]
+#![allow(clippy::no_effect)]
 #![allow(unused_variables)]
 
 macro_rules! let_and_return {
@@ -17,6 +20,8 @@ fn main() {
 
     consume_units_with_for_loop(); // should be fine as well
 
+    multiline_sugg();
+
     let_and_return!(()) // should be fine
 }
 
@@ -42,5 +47,17 @@ fn consume_units_with_for_loop() {
     assert_eq!(count, 1);
 }
 
+fn multiline_sugg() {
+    let v: Vec<u8> = vec![2];
+
+    let _ = v
+        .into_iter()
+        .map(|i| i * 2)
+        .filter(|i| i % 2 == 0)
+        .map(|_| ())
+        .next()
+        .unwrap();
+}
+
 #[derive(Copy, Clone)]
 pub struct ContainsUnit(()); // should be fine
diff --git a/tests/ui/let_unit.stderr b/tests/ui/let_unit.stderr
index e1773a40225..7130fcd870e 100644
--- a/tests/ui/let_unit.stderr
+++ b/tests/ui/let_unit.stderr
@@ -1,16 +1,37 @@
-error: this let-binding has unit value. Consider omitting `let _x =`
-  --> $DIR/let_unit.rs:11:5
+error: this let-binding has unit value
+  --> $DIR/let_unit.rs:14:5
    |
 LL |     let _x = println!("x");
-   |     ^^^^^^^^^^^^^^^^^^^^^^^
+   |     ^^^^^^^^^^^^^^^^^^^^^^^ help: omit the `let` binding: `println!("x");`
    |
    = note: `-D clippy::let-unit-value` implied by `-D warnings`
 
-error: this let-binding has unit value. Consider omitting `let _a =`
-  --> $DIR/let_unit.rs:15:9
+error: this let-binding has unit value
+  --> $DIR/let_unit.rs:18:9
    |
 LL |         let _a = ();
-   |         ^^^^^^^^^^^^
+   |         ^^^^^^^^^^^^ help: omit the `let` binding: `();`
 
-error: aborting due to 2 previous errors
+error: this let-binding has unit value
+  --> $DIR/let_unit.rs:53:5
+   |
+LL | /     let _ = v
+LL | |         .into_iter()
+LL | |         .map(|i| i * 2)
+LL | |         .filter(|i| i % 2 == 0)
+LL | |         .map(|_| ())
+LL | |         .next()
+LL | |         .unwrap();
+   | |__________________^
+help: omit the `let` binding
+   |
+LL |     v
+LL |         .into_iter()
+LL |         .map(|i| i * 2)
+LL |         .filter(|i| i % 2 == 0)
+LL |         .map(|_| ())
+LL |         .next()
+ ...
+
+error: aborting due to 3 previous errors