summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/tests/ui/blocks_in_conditions_closure.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/tests/ui/blocks_in_conditions_closure.rs')
-rw-r--r--src/tools/clippy/tests/ui/blocks_in_conditions_closure.rs89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/tools/clippy/tests/ui/blocks_in_conditions_closure.rs b/src/tools/clippy/tests/ui/blocks_in_conditions_closure.rs
new file mode 100644
index 000000000..db31e4ae1
--- /dev/null
+++ b/src/tools/clippy/tests/ui/blocks_in_conditions_closure.rs
@@ -0,0 +1,89 @@
+#![warn(clippy::blocks_in_conditions)]
+#![allow(
+ unused,
+ clippy::let_and_return,
+ clippy::needless_if,
+ clippy::unnecessary_literal_unwrap
+)]
+
+fn predicate<F: FnOnce(T) -> bool, T>(pfn: F, val: T) -> bool {
+ pfn(val)
+}
+
+fn pred_test() {
+ let v = 3;
+ let sky = "blue";
+ // This is a sneaky case, where the block isn't directly in the condition,
+ // but is actually inside a closure that the condition is using.
+ // The same principle applies -- add some extra expressions to make sure
+ // linter isn't confused by them.
+ if v == 3
+ && sky == "blue"
+ && predicate(
+ |x| {
+ //~^ ERROR: in an `if` condition, avoid complex blocks or closures with blocks
+ //~| NOTE: `-D clippy::blocks-in-conditions` implied by `-D warnings`
+ let target = 3;
+ x == target
+ },
+ v,
+ )
+ {}
+
+ if predicate(
+ |x| {
+ //~^ ERROR: in an `if` condition, avoid complex blocks or closures with blocks; in
+ let target = 3;
+ x == target
+ },
+ v,
+ ) {}
+}
+
+fn closure_without_block() {
+ if predicate(|x| x == 3, 6) {}
+}
+
+fn macro_in_closure() {
+ let option = Some(true);
+
+ if option.unwrap_or_else(|| unimplemented!()) {
+ unimplemented!()
+ }
+}
+
+fn closure(_: impl FnMut()) -> bool {
+ true
+}
+
+fn function_with_empty_closure() {
+ if closure(|| {}) {}
+}
+
+// issue #11814
+fn match_with_pred() {
+ let v = 3;
+ match Some(predicate(
+ |x| {
+ //~^ ERROR: in a `match` scrutinee, avoid complex blocks or closures with blocks
+ let target = 3;
+ x == target
+ },
+ v,
+ )) {
+ Some(true) => 1,
+ Some(false) => 2,
+ None => 3,
+ };
+}
+
+#[rustfmt::skip]
+fn main() {
+ let mut range = 0..10;
+ range.all(|i| {i < 10} );
+
+ let v = vec![1, 2, 3];
+ if v.into_iter().any(|x| {x == 4}) {
+ println!("contains 4!");
+ }
+}