2016-03-07 16:31:38 +01:00
|
|
|
#![feature(plugin, inclusive_range_syntax)]
|
2016-05-27 14:24:28 +02:00
|
|
|
#![feature(dotdot_in_tuple_patterns)]
|
2016-01-30 18:03:53 +01:00
|
|
|
#![plugin(clippy)]
|
|
|
|
|
2016-05-13 16:43:47 +02:00
|
|
|
#![allow(dead_code, no_effect, unnecessary_operation)]
|
2016-01-30 20:10:14 +01:00
|
|
|
#![allow(let_and_return)]
|
|
|
|
#![allow(needless_return)]
|
|
|
|
#![allow(unused_variables)]
|
2016-02-10 01:22:53 +01:00
|
|
|
#![allow(cyclomatic_complexity)]
|
2016-02-22 15:42:24 +01:00
|
|
|
#![allow(blacklisted_name)]
|
2016-06-21 23:53:45 +02:00
|
|
|
#![allow(collapsible_if)]
|
2016-07-13 19:02:28 +02:00
|
|
|
#![allow(zero_divided_by_zero, eq_op)]
|
2016-01-30 18:03:53 +01:00
|
|
|
|
2016-02-10 01:22:53 +01:00
|
|
|
fn bar<T>(_: T) {}
|
2016-01-30 18:03:53 +01:00
|
|
|
fn foo() -> bool { unimplemented!() }
|
|
|
|
|
2016-03-07 16:31:38 +01:00
|
|
|
struct Foo {
|
|
|
|
bar: u8,
|
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
#[deny(if_same_then_else)]
|
2016-02-10 01:22:53 +01:00
|
|
|
#[deny(match_same_arms)]
|
2016-02-13 15:36:57 +01:00
|
|
|
fn if_same_then_else() -> Result<&'static str, ()> {
|
2016-02-09 16:45:47 +01:00
|
|
|
if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-03-07 16:31:38 +01:00
|
|
|
Foo { bar: 42 };
|
|
|
|
0..10;
|
|
|
|
..;
|
|
|
|
0..;
|
|
|
|
..10;
|
|
|
|
0...10;
|
2016-01-30 19:16:49 +01:00
|
|
|
foo();
|
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else { //~ERROR this `if` has identical blocks
|
2016-03-07 16:31:38 +01:00
|
|
|
Foo { bar: 42 };
|
|
|
|
0..10;
|
|
|
|
..;
|
|
|
|
0..;
|
|
|
|
..10;
|
|
|
|
0...10;
|
2016-01-30 19:16:49 +01:00
|
|
|
foo();
|
|
|
|
}
|
|
|
|
|
2016-03-07 16:31:38 +01:00
|
|
|
if true {
|
|
|
|
Foo { bar: 42 };
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Foo { bar: 43 };
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
0..10;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
0...10;
|
|
|
|
}
|
|
|
|
|
2016-01-30 19:16:49 +01:00
|
|
|
if true {
|
|
|
|
foo();
|
|
|
|
foo();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
foo();
|
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
let _ = if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-01-30 19:16:49 +01:00
|
|
|
foo();
|
|
|
|
42
|
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else { //~ERROR this `if` has identical blocks
|
2016-01-30 19:16:49 +01:00
|
|
|
foo();
|
|
|
|
42
|
|
|
|
};
|
|
|
|
|
|
|
|
if true {
|
|
|
|
foo();
|
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
let _ = if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-01-30 19:16:49 +01:00
|
|
|
42
|
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else { //~ERROR this `if` has identical blocks
|
2016-01-30 19:16:49 +01:00
|
|
|
42
|
|
|
|
};
|
2016-01-30 20:10:14 +01:00
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-01-30 20:10:14 +01:00
|
|
|
let bar = if true {
|
|
|
|
42
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
43
|
|
|
|
};
|
|
|
|
|
|
|
|
while foo() { break; }
|
|
|
|
bar + 1;
|
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else { //~ERROR this `if` has identical blocks
|
2016-01-30 20:10:14 +01:00
|
|
|
let bar = if true {
|
|
|
|
42
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
43
|
|
|
|
};
|
|
|
|
|
|
|
|
while foo() { break; }
|
|
|
|
bar + 1;
|
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-02-10 01:22:53 +01:00
|
|
|
let _ = match 42 {
|
|
|
|
42 => 1,
|
|
|
|
a if a > 0 => 2,
|
|
|
|
10...15 => 3,
|
|
|
|
_ => 4,
|
|
|
|
};
|
2016-01-30 20:10:14 +01:00
|
|
|
}
|
2016-02-09 16:45:47 +01:00
|
|
|
else if false {
|
|
|
|
foo();
|
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else if foo() { //~ERROR this `if` has identical blocks
|
|
|
|
let _ = match 42 {
|
|
|
|
42 => 1,
|
|
|
|
a if a > 0 => 2,
|
|
|
|
10...15 => 3,
|
|
|
|
_ => 4,
|
|
|
|
};
|
2016-01-30 20:10:14 +01:00
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-02-09 16:45:47 +01:00
|
|
|
if let Some(a) = Some(42) {}
|
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else { //~ERROR this `if` has identical blocks
|
2016-02-09 16:45:47 +01:00
|
|
|
if let Some(a) = Some(42) {}
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:24:28 +02:00
|
|
|
if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-05-27 14:24:28 +02:00
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
else { //~ERROR this `if` has identical blocks
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if let (.., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if let (.., 4) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if let (.., 1, 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
if true {
|
2016-01-30 20:10:14 +01:00
|
|
|
if let Some(a) = Some(42) {}
|
|
|
|
}
|
|
|
|
else {
|
2016-02-09 16:45:47 +01:00
|
|
|
if let Some(a) = Some(43) {}
|
2016-01-30 20:10:14 +01:00
|
|
|
}
|
|
|
|
|
2016-02-10 01:22:53 +01:00
|
|
|
let _ = match 42 {
|
|
|
|
42 => foo(),
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
|
|
|
//~|NOTE `42 | 51`
|
2016-02-10 01:22:53 +01:00
|
|
|
51 => foo(), //~ERROR this `match` has identical arm bodies
|
|
|
|
_ => true,
|
|
|
|
};
|
|
|
|
|
2016-03-29 01:39:35 +02:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(_) => 24,
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
|
|
|
//~|NOTE `Some(_) | None`
|
2016-05-31 20:14:32 +02:00
|
|
|
None => 24, //~ERROR this `match` has identical arm bodies
|
2016-03-29 01:39:35 +02:00
|
|
|
};
|
|
|
|
|
2016-05-31 21:50:13 +02:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(foo) => 24,
|
|
|
|
None => 24,
|
|
|
|
};
|
|
|
|
|
2016-02-10 01:22:53 +01:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(42) => 24,
|
|
|
|
Some(a) => 24, // bindings are different
|
|
|
|
None => 0,
|
|
|
|
};
|
|
|
|
|
2016-03-29 01:39:35 +02:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(a) if a > 0 => 24,
|
|
|
|
Some(a) => 24, // one arm has a guard
|
|
|
|
None => 0,
|
|
|
|
};
|
|
|
|
|
2016-02-10 01:22:53 +01:00
|
|
|
match (Some(42), Some(42)) {
|
|
|
|
(Some(a), None) => bar(a),
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
|
|
|
//~|NOTE `(Some(a), None) | (None, Some(a))`
|
2016-02-10 01:22:53 +01:00
|
|
|
(None, Some(a)) => bar(a), //~ERROR this `match` has identical arm bodies
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:24:28 +02:00
|
|
|
match (Some(42), Some(42)) {
|
|
|
|
(Some(a), ..) => bar(a),
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
|
|
|
//~|NOTE `(Some(a), ..) | (.., Some(a))`
|
2016-05-27 14:24:28 +02:00
|
|
|
(.., Some(a)) => bar(a), //~ERROR this `match` has identical arm bodies
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
|
|
|
match (1, 2, 3) {
|
|
|
|
(1, .., 3) => 42,
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
|
|
|
//~|NOTE `(1, .., 3) | (.., 3)`
|
2016-05-27 14:24:28 +02:00
|
|
|
(.., 3) => 42, //~ERROR this `match` has identical arm bodies
|
|
|
|
_ => 0,
|
|
|
|
};
|
|
|
|
|
2016-07-13 09:43:33 +02:00
|
|
|
let _ = if true {
|
|
|
|
//~^NOTE same as this
|
|
|
|
0.0
|
|
|
|
} else { //~ERROR this `if` has identical blocks
|
|
|
|
0.0
|
|
|
|
};
|
|
|
|
|
|
|
|
let _ = if true {
|
|
|
|
//~^NOTE same as this
|
|
|
|
-0.0
|
|
|
|
} else { //~ERROR this `if` has identical blocks
|
|
|
|
-0.0
|
|
|
|
};
|
|
|
|
|
|
|
|
let _ = if true {
|
|
|
|
0.0
|
|
|
|
} else {
|
|
|
|
-0.0
|
|
|
|
};
|
|
|
|
|
2016-07-13 18:35:31 +02:00
|
|
|
// Different NaNs
|
|
|
|
let _ = if true {
|
2016-07-13 19:02:28 +02:00
|
|
|
0.0 / 0.0
|
2016-07-13 18:35:31 +02:00
|
|
|
} else {
|
2016-07-13 19:02:28 +02:00
|
|
|
std::f32::NAN
|
2016-07-13 18:35:31 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
// Same NaNs
|
|
|
|
let _ = if true {
|
|
|
|
//~^NOTE same as this
|
|
|
|
std::f32::NAN
|
|
|
|
} else { //~ERROR this `if` has identical blocks
|
|
|
|
std::f32::NAN
|
|
|
|
};
|
|
|
|
|
2016-07-13 09:43:33 +02:00
|
|
|
let _ = match Some(()) {
|
|
|
|
Some(()) => 0.0,
|
|
|
|
None => -0.0
|
|
|
|
};
|
|
|
|
|
2016-02-10 01:22:53 +01:00
|
|
|
match (Some(42), Some("")) {
|
|
|
|
(Some(a), None) => bar(a),
|
|
|
|
(None, Some(a)) => bar(a), // bindings have different types
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
2016-02-13 15:36:57 +01:00
|
|
|
if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-02-13 15:36:57 +01:00
|
|
|
try!(Ok("foo"));
|
|
|
|
}
|
|
|
|
else { //~ERROR this `if` has identical blocks
|
|
|
|
try!(Ok("foo"));
|
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
if true {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-01-30 20:10:14 +01:00
|
|
|
let foo = "";
|
2016-02-13 15:36:57 +01:00
|
|
|
return Ok(&foo[0..]);
|
2016-01-30 20:10:14 +01:00
|
|
|
}
|
2016-02-09 16:45:47 +01:00
|
|
|
else if false {
|
|
|
|
let foo = "bar";
|
2016-02-13 15:36:57 +01:00
|
|
|
return Ok(&foo[0..]);
|
2016-02-09 16:45:47 +01:00
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else { //~ERROR this `if` has identical blocks
|
2016-01-30 20:10:14 +01:00
|
|
|
let foo = "";
|
2016-02-13 15:36:57 +01:00
|
|
|
return Ok(&foo[0..]);
|
2016-01-30 20:10:14 +01:00
|
|
|
}
|
2016-01-30 19:16:49 +01:00
|
|
|
}
|
|
|
|
|
2016-02-09 16:45:47 +01:00
|
|
|
#[deny(ifs_same_cond)]
|
|
|
|
#[allow(if_same_then_else)] // all empty blocks
|
2016-01-30 19:16:49 +01:00
|
|
|
fn ifs_same_cond() {
|
2016-01-30 18:03:53 +01:00
|
|
|
let a = 0;
|
2016-02-09 15:18:27 +01:00
|
|
|
let b = false;
|
|
|
|
|
|
|
|
if b {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-02-09 15:18:27 +01:00
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else if b { //~ERROR this `if` has the same condition as a previous if
|
2016-02-09 15:18:27 +01:00
|
|
|
}
|
2016-01-30 18:03:53 +01:00
|
|
|
|
|
|
|
if a == 1 {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-01-30 18:03:53 +01:00
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else if a == 1 { //~ERROR this `if` has the same condition as a previous if
|
2016-01-30 18:03:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if 2*a == 1 {
|
2016-07-10 14:46:39 +02:00
|
|
|
//~^NOTE same as this
|
2016-01-30 18:03:53 +01:00
|
|
|
}
|
|
|
|
else if 2*a == 2 {
|
|
|
|
}
|
2016-02-10 01:22:53 +01:00
|
|
|
else if 2*a == 1 { //~ERROR this `if` has the same condition as a previous if
|
2016-01-30 18:03:53 +01:00
|
|
|
}
|
|
|
|
else if a == 1 {
|
|
|
|
}
|
|
|
|
|
2016-02-13 15:36:57 +01:00
|
|
|
// See #659
|
|
|
|
if cfg!(feature = "feature1-659") {
|
|
|
|
1
|
|
|
|
} else if cfg!(feature = "feature2-659") {
|
|
|
|
2
|
|
|
|
} else {
|
|
|
|
3
|
|
|
|
};
|
|
|
|
|
2016-01-30 20:10:14 +01:00
|
|
|
let mut v = vec![1];
|
|
|
|
if v.pop() == None { // ok, functions
|
|
|
|
}
|
|
|
|
else if v.pop() == None {
|
|
|
|
}
|
|
|
|
|
|
|
|
if v.len() == 42 { // ok, functions
|
2016-01-30 18:03:53 +01:00
|
|
|
}
|
2016-01-30 20:10:14 +01:00
|
|
|
else if v.len() == 42 {
|
2016-01-30 18:03:53 +01:00
|
|
|
}
|
|
|
|
}
|
2016-01-30 19:16:49 +01:00
|
|
|
|
|
|
|
fn main() {}
|