about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPhilipp Hansch <dev@phansch.net>2019-04-25 21:46:34 +0200
committerPhilipp Hansch <dev@phansch.net>2019-04-26 06:48:27 +0200
commit3f637cb369bb29338f3c6e313981f006d8509039 (patch)
tree0ef535ddf5308d94f197c184708c5700d69b5976
parent910d538ef1f643334974aa0c2f45ff44a74d92b1 (diff)
downloadrust-3f637cb369bb29338f3c6e313981f006d8509039.tar.gz
rust-3f637cb369bb29338f3c6e313981f006d8509039.zip
Add two more tests for redundant_closure
These two cases were fixed by #4008.

Closes #1439

changelog: none
-rw-r--r--tests/ui/eta.fixed24
-rw-r--r--tests/ui/eta.rs24
-rw-r--r--tests/ui/eta.stderr12
3 files changed, 57 insertions, 3 deletions
diff --git a/tests/ui/eta.fixed b/tests/ui/eta.fixed
index bae9b09c697..cef4bda24b6 100644
--- a/tests/ui/eta.fixed
+++ b/tests/ui/eta.fixed
@@ -98,6 +98,30 @@ fn test_redundant_closures_containing_method_calls() {
         t.iter().filter(|x| x.trait_foo_ref());
         t.iter().map(|x| x.trait_foo_ref());
     }
+
+    let mut some = Some(|x| x * x);
+    let arr = [Ok(1), Err(2)];
+    let _: Vec<_> = arr.iter().map(|x| x.map_err(some.take().unwrap())).collect();
+}
+
+struct Thunk<T>(Box<FnMut() -> T>);
+
+impl<T> Thunk<T> {
+    fn new<F: 'static + FnOnce() -> T>(f: F) -> Thunk<T> {
+        let mut option = Some(f);
+        // This should not trigger redundant_closure (#1439)
+        Thunk(Box::new(move || option.take().unwrap()()))
+    }
+
+    fn unwrap(self) -> T {
+        let Thunk(mut f) = self;
+        f()
+    }
+}
+
+fn foobar() {
+    let thunk = Thunk::new(|| println!("Hello, world!"));
+    thunk.unwrap()
 }
 
 fn meta<F>(f: F)
diff --git a/tests/ui/eta.rs b/tests/ui/eta.rs
index a23da73bde7..5f029eac4c1 100644
--- a/tests/ui/eta.rs
+++ b/tests/ui/eta.rs
@@ -98,6 +98,30 @@ fn test_redundant_closures_containing_method_calls() {
         t.iter().filter(|x| x.trait_foo_ref());
         t.iter().map(|x| x.trait_foo_ref());
     }
+
+    let mut some = Some(|x| x * x);
+    let arr = [Ok(1), Err(2)];
+    let _: Vec<_> = arr.iter().map(|x| x.map_err(|e| some.take().unwrap()(e))).collect();
+}
+
+struct Thunk<T>(Box<FnMut() -> T>);
+
+impl<T> Thunk<T> {
+    fn new<F: 'static + FnOnce() -> T>(f: F) -> Thunk<T> {
+        let mut option = Some(f);
+        // This should not trigger redundant_closure (#1439)
+        Thunk(Box::new(move || option.take().unwrap()()))
+    }
+
+    fn unwrap(self) -> T {
+        let Thunk(mut f) = self;
+        f()
+    }
+}
+
+fn foobar() {
+    let thunk = Thunk::new(|| println!("Hello, world!"));
+    thunk.unwrap()
 }
 
 fn meta<F>(f: F)
diff --git a/tests/ui/eta.stderr b/tests/ui/eta.stderr
index eb55a251bcc..afcafc46b3e 100644
--- a/tests/ui/eta.stderr
+++ b/tests/ui/eta.stderr
@@ -69,16 +69,22 @@ LL |     let e: std::vec::Vec<char> = vec!['a', 'b', 'c'].iter().map(|c| c.to_as
    |                                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `char::to_ascii_uppercase`
 
 error: redundant closure found
-  --> $DIR/eta.rs:145:27
+  --> $DIR/eta.rs:104:50
+   |
+LL |     let _: Vec<_> = arr.iter().map(|x| x.map_err(|e| some.take().unwrap()(e))).collect();
+   |                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `some.take().unwrap()`
+
+error: redundant closure found
+  --> $DIR/eta.rs:169:27
    |
 LL |     let a = Some(1u8).map(|a| foo_ptr(a));
    |                           ^^^^^^^^^^^^^^ help: remove closure as shown: `foo_ptr`
 
 error: redundant closure found
-  --> $DIR/eta.rs:150:27
+  --> $DIR/eta.rs:174:27
    |
 LL |     let a = Some(1u8).map(|a| closure(a));
    |                           ^^^^^^^^^^^^^^ help: remove closure as shown: `closure`
 
-error: aborting due to 13 previous errors
+error: aborting due to 14 previous errors