diff options
| author | Philipp Hansch <dev@phansch.net> | 2019-04-25 21:46:34 +0200 |
|---|---|---|
| committer | Philipp Hansch <dev@phansch.net> | 2019-04-26 06:48:27 +0200 |
| commit | 3f637cb369bb29338f3c6e313981f006d8509039 (patch) | |
| tree | 0ef535ddf5308d94f197c184708c5700d69b5976 | |
| parent | 910d538ef1f643334974aa0c2f45ff44a74d92b1 (diff) | |
| download | rust-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.fixed | 24 | ||||
| -rw-r--r-- | tests/ui/eta.rs | 24 | ||||
| -rw-r--r-- | tests/ui/eta.stderr | 12 |
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 |
