From 3f637cb369bb29338f3c6e313981f006d8509039 Mon Sep 17 00:00:00 2001 From: Philipp Hansch Date: Thu, 25 Apr 2019 21:46:34 +0200 Subject: [PATCH] Add two more tests for redundant_closure These two cases were fixed by #4008. Closes #1439 changelog: none --- tests/ui/eta.fixed | 24 ++++++++++++++++++++++++ tests/ui/eta.rs | 24 ++++++++++++++++++++++++ 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 bae9b09c6977..cef4bda24b6a 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(Box T>); + +impl Thunk { + fn new T>(f: F) -> Thunk { + 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) diff --git a/tests/ui/eta.rs b/tests/ui/eta.rs index a23da73bde75..5f029eac4c1d 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(Box T>); + +impl Thunk { + fn new T>(f: F) -> Thunk { + 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) diff --git a/tests/ui/eta.stderr b/tests/ui/eta.stderr index eb55a251bcc9..afcafc46b3e0 100644 --- a/tests/ui/eta.stderr +++ b/tests/ui/eta.stderr @@ -69,16 +69,22 @@ LL | let e: std::vec::Vec = 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