-#![feature(plugin)]
-#![plugin(clippy)]
-#![deny(needless_bool)]
+// Copyright 2014-2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
-#[allow(if_same_then_else)]
+#![warn(clippy::needless_bool)]
+
+use std::cell::Cell;
+
+macro_rules! bool_comparison_trigger {
+ ($($i:ident: $def:expr, $stb:expr );+ $(;)*) => (
+
+ #[derive(Clone)]
+ pub struct Trigger {
+ $($i: (Cell<bool>, bool, bool)),+
+ }
+
+ #[allow(dead_code)]
+ impl Trigger {
+ pub fn trigger(&self, key: &str) -> bool {
+ $(
+ if let stringify!($i) = key {
+ return self.$i.1 && self.$i.2 == $def;
+ }
+ )+
+ false
+ }
+ }
+ )
+}
+
+#[allow(clippy::if_same_then_else)]
fn main() {
let x = true;
let y = false;
- if x { true } else { true }; //~ERROR this if-then-else expression will always return true
- if x { false } else { false }; //~ERROR this if-then-else expression will always return false
- if x { true } else { false };
- //~^ ERROR this if-then-else expression returns a bool literal
- //~| HELP you can reduce it to
- //~| SUGGESTION x
- if x { false } else { true };
- //~^ ERROR this if-then-else expression returns a bool literal
- //~| HELP you can reduce it to
- //~| SUGGESTION !x
- if x && y { false } else { true };
- //~^ ERROR this if-then-else expression returns a bool literal
- //~| HELP you can reduce it to
- //~| SUGGESTION !(x && y)
- if x { x } else { false }; // would also be questionable, but we don't catch this yet
+ if x {
+ true
+ } else {
+ true
+ };
+ if x {
+ false
+ } else {
+ false
+ };
+ if x {
+ true
+ } else {
+ false
+ };
+ if x {
+ false
+ } else {
+ true
+ };
+ if x && y {
+ false
+ } else {
+ true
+ };
+ if x {
+ x
+ } else {
+ false
+ }; // would also be questionable, but we don't catch this yet
bool_ret(x);
bool_ret2(x);
bool_ret3(x);
bool_ret5(x, x);
bool_ret4(x);
bool_ret6(x, x);
+ needless_bool(x);
+ needless_bool2(x);
+ needless_bool3(x);
}
-#[allow(if_same_then_else, needless_return)]
+#[allow(clippy::if_same_then_else, clippy::needless_return)]
fn bool_ret(x: bool) -> bool {
- if x { return true } else { return true };
- //~^ ERROR this if-then-else expression will always return true
+ if x {
+ return true;
+ } else {
+ return true;
+ };
}
-#[allow(if_same_then_else, needless_return)]
+#[allow(clippy::if_same_then_else, clippy::needless_return)]
fn bool_ret2(x: bool) -> bool {
- if x { return false } else { return false };
- //~^ ERROR this if-then-else expression will always return false
+ if x {
+ return false;
+ } else {
+ return false;
+ };
}
-#[allow(needless_return)]
+#[allow(clippy::needless_return)]
fn bool_ret3(x: bool) -> bool {
- if x { return true } else { return false };
- //~^ ERROR this if-then-else expression returns a bool literal
- //~| HELP you can reduce it to
- //~| SUGGESTION return x
+ if x {
+ return true;
+ } else {
+ return false;
+ };
}
-#[allow(needless_return)]
+#[allow(clippy::needless_return)]
fn bool_ret5(x: bool, y: bool) -> bool {
- if x && y { return true } else { return false };
- //~^ ERROR this if-then-else expression returns a bool literal
- //~| HELP you can reduce it to
- //~| SUGGESTION return x && y
+ if x && y {
+ return true;
+ } else {
+ return false;
+ };
}
-#[allow(needless_return)]
+#[allow(clippy::needless_return)]
fn bool_ret4(x: bool) -> bool {
- if x { return false } else { return true };
- //~^ ERROR this if-then-else expression returns a bool literal
- //~| HELP you can reduce it to
- //~| SUGGESTION return !x
+ if x {
+ return false;
+ } else {
+ return true;
+ };
}
-#[allow(needless_return)]
+#[allow(clippy::needless_return)]
fn bool_ret6(x: bool, y: bool) -> bool {
- if x && y { return false } else { return true };
- //~^ ERROR this if-then-else expression returns a bool literal
- //~| HELP you can reduce it to
- //~| SUGGESTION return !(x && y)
+ if x && y {
+ return false;
+ } else {
+ return true;
+ };
+}
+
+fn needless_bool(x: bool) {
+ if x == true {};
+}
+
+fn needless_bool2(x: bool) {
+ if x == false {};
+}
+
+fn needless_bool3(x: bool) {
+ bool_comparison_trigger! {
+ test_one: false, false;
+ test_three: false, false;
+ test_two: true, true;
+ }
+
+ if x == true {};
+ if x == false {};
}