2018-10-06 11:18:06 -05:00
|
|
|
// 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.
|
|
|
|
|
2018-12-09 16:26:16 -06:00
|
|
|
#![allow(
|
|
|
|
clippy::blacklisted_name,
|
|
|
|
clippy::collapsible_if,
|
|
|
|
clippy::cyclomatic_complexity,
|
|
|
|
clippy::eq_op,
|
|
|
|
clippy::needless_continue,
|
|
|
|
clippy::needless_return,
|
|
|
|
clippy::never_loop,
|
|
|
|
clippy::no_effect,
|
|
|
|
clippy::zero_divided_by_zero,
|
|
|
|
clippy::unused_unit
|
|
|
|
)]
|
2018-07-28 10:34:52 -05:00
|
|
|
|
2016-02-09 18:22:53 -06:00
|
|
|
fn bar<T>(_: T) {}
|
2018-12-09 16:26:16 -06:00
|
|
|
fn foo() -> bool {
|
|
|
|
unimplemented!()
|
|
|
|
}
|
2016-01-30 11:03:53 -06:00
|
|
|
|
2016-03-07 09:31:38 -06:00
|
|
|
struct Foo {
|
|
|
|
bar: u8,
|
|
|
|
}
|
|
|
|
|
2016-10-08 08:16:00 -05:00
|
|
|
pub enum Abc {
|
|
|
|
A,
|
|
|
|
B,
|
|
|
|
C,
|
|
|
|
}
|
|
|
|
|
2018-07-28 10:34:52 -05:00
|
|
|
#[warn(clippy::if_same_then_else)]
|
|
|
|
#[warn(clippy::match_same_arms)]
|
2018-09-27 12:10:20 -05:00
|
|
|
#[allow(clippy::unused_unit)]
|
2016-02-13 08:36:57 -06:00
|
|
|
fn if_same_then_else() -> Result<&'static str, ()> {
|
2016-02-09 09:45:47 -06:00
|
|
|
if true {
|
2016-03-07 09:31:38 -06:00
|
|
|
Foo { bar: 42 };
|
|
|
|
0..10;
|
|
|
|
..;
|
|
|
|
0..;
|
|
|
|
..10;
|
2017-09-28 12:40:19 -05:00
|
|
|
0..=10;
|
2016-01-30 12:16:49 -06:00
|
|
|
foo();
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-03-07 09:31:38 -06:00
|
|
|
Foo { bar: 42 };
|
|
|
|
0..10;
|
|
|
|
..;
|
|
|
|
0..;
|
|
|
|
..10;
|
2017-09-28 12:40:19 -05:00
|
|
|
0..=10;
|
2016-01-30 12:16:49 -06:00
|
|
|
foo();
|
|
|
|
}
|
|
|
|
|
2016-03-07 09:31:38 -06:00
|
|
|
if true {
|
|
|
|
Foo { bar: 42 };
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-03-07 09:31:38 -06:00
|
|
|
Foo { bar: 43 };
|
|
|
|
}
|
|
|
|
|
2016-10-01 15:27:10 -05:00
|
|
|
if true {
|
|
|
|
();
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-10-01 15:27:10 -05:00
|
|
|
()
|
|
|
|
}
|
|
|
|
|
2016-03-07 09:31:38 -06:00
|
|
|
if true {
|
|
|
|
0..10;
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2017-09-28 12:40:19 -05:00
|
|
|
0..=10;
|
2016-03-07 09:31:38 -06:00
|
|
|
}
|
|
|
|
|
2016-01-30 12:16:49 -06:00
|
|
|
if true {
|
|
|
|
foo();
|
|
|
|
foo();
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-01-30 12:16:49 -06:00
|
|
|
foo();
|
|
|
|
}
|
|
|
|
|
2016-10-01 19:17:04 -05:00
|
|
|
let _ = match 42 {
|
|
|
|
42 => {
|
|
|
|
foo();
|
|
|
|
let mut a = 42 + [23].len() as i32;
|
|
|
|
if true {
|
|
|
|
a += 7;
|
|
|
|
}
|
2018-12-09 16:26:16 -06:00
|
|
|
a = -31 - a;
|
2016-10-01 19:17:04 -05:00
|
|
|
a
|
2018-12-09 16:26:16 -06:00
|
|
|
},
|
|
|
|
_ => {
|
|
|
|
//~ ERROR match arms have same body
|
2016-10-01 19:17:04 -05:00
|
|
|
foo();
|
|
|
|
let mut a = 42 + [23].len() as i32;
|
|
|
|
if true {
|
|
|
|
a += 7;
|
|
|
|
}
|
2018-12-09 16:26:16 -06:00
|
|
|
a = -31 - a;
|
2016-10-01 19:17:04 -05:00
|
|
|
a
|
2018-12-09 16:26:16 -06:00
|
|
|
},
|
2016-01-30 12:16:49 -06:00
|
|
|
};
|
|
|
|
|
2016-10-08 08:16:00 -05:00
|
|
|
let _ = match Abc::A {
|
|
|
|
Abc::A => 0,
|
|
|
|
Abc::B => 1,
|
2018-02-08 13:26:50 -06:00
|
|
|
_ => 0, //~ ERROR match arms have same body
|
2016-10-08 08:16:00 -05:00
|
|
|
};
|
|
|
|
|
2016-01-30 12:16:49 -06:00
|
|
|
if true {
|
|
|
|
foo();
|
|
|
|
}
|
|
|
|
|
2016-02-09 09:45:47 -06:00
|
|
|
let _ = if true {
|
2016-01-30 12:16:49 -06:00
|
|
|
42
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-01-30 12:16:49 -06:00
|
|
|
42
|
|
|
|
};
|
2016-01-30 13:10:14 -06:00
|
|
|
|
2016-10-01 15:27:10 -05:00
|
|
|
if true {
|
|
|
|
for _ in &[42] {
|
2016-12-04 12:31:46 -06:00
|
|
|
let foo: &Option<_> = &Some::<u8>(42);
|
|
|
|
if true {
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
continue;
|
|
|
|
}
|
2016-10-01 15:27:10 -05:00
|
|
|
}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-10-01 15:27:10 -05:00
|
|
|
for _ in &[42] {
|
2016-12-04 12:31:46 -06:00
|
|
|
let foo: &Option<_> = &Some::<u8>(42);
|
|
|
|
if true {
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
continue;
|
|
|
|
}
|
2016-10-01 15:27:10 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-09 09:45:47 -06:00
|
|
|
if true {
|
2018-12-09 16:26:16 -06:00
|
|
|
let bar = if true { 42 } else { 43 };
|
2016-01-30 13:10:14 -06:00
|
|
|
|
2018-12-09 16:26:16 -06:00
|
|
|
while foo() {
|
|
|
|
break;
|
2016-01-30 13:10:14 -06:00
|
|
|
}
|
2018-12-09 16:26:16 -06:00
|
|
|
bar + 1;
|
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
|
|
|
let bar = if true { 42 } else { 43 };
|
2016-01-30 13:10:14 -06:00
|
|
|
|
2018-12-09 16:26:16 -06:00
|
|
|
while foo() {
|
|
|
|
break;
|
|
|
|
}
|
2016-01-30 13:10:14 -06:00
|
|
|
bar + 1;
|
|
|
|
}
|
|
|
|
|
2016-02-09 09:45:47 -06:00
|
|
|
if true {
|
2016-02-09 18:22:53 -06:00
|
|
|
let _ = match 42 {
|
|
|
|
42 => 1,
|
|
|
|
a if a > 0 => 2,
|
2017-09-28 12:40:19 -05:00
|
|
|
10..=15 => 3,
|
2016-02-09 18:22:53 -06:00
|
|
|
_ => 4,
|
|
|
|
};
|
2018-12-09 16:26:16 -06:00
|
|
|
} else if false {
|
2016-02-09 09:45:47 -06:00
|
|
|
foo();
|
2018-12-09 16:26:16 -06:00
|
|
|
} else if foo() {
|
2016-02-09 18:22:53 -06:00
|
|
|
let _ = match 42 {
|
|
|
|
42 => 1,
|
|
|
|
a if a > 0 => 2,
|
2017-09-28 12:40:19 -05:00
|
|
|
10..=15 => 3,
|
2016-02-09 18:22:53 -06:00
|
|
|
_ => 4,
|
|
|
|
};
|
2016-01-30 13:10:14 -06:00
|
|
|
}
|
|
|
|
|
2016-02-09 09:45:47 -06:00
|
|
|
if true {
|
|
|
|
if let Some(a) = Some(42) {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-02-09 09:45:47 -06:00
|
|
|
if let Some(a) = Some(42) {}
|
|
|
|
}
|
|
|
|
|
2016-05-27 07:24:28 -05:00
|
|
|
if true {
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-05-27 07:24:28 -05:00
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-05-27 07:24:28 -05:00
|
|
|
if let (.., 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-05-27 07:24:28 -05:00
|
|
|
if let (.., 4) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
if let (1, .., 3) = (1, 2, 3) {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-05-27 07:24:28 -05:00
|
|
|
if let (.., 1, 3) = (1, 2, 3) {}
|
|
|
|
}
|
|
|
|
|
2016-10-01 15:27:10 -05:00
|
|
|
if true {
|
|
|
|
if let Some(42) = None {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-10-01 15:27:10 -05:00
|
|
|
if let Option::Some(42) = None {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if true {
|
|
|
|
if let Some(42) = None::<u8> {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-10-01 15:27:10 -05:00
|
|
|
if let Some(42) = None {}
|
|
|
|
}
|
|
|
|
|
2016-12-02 15:23:24 -06:00
|
|
|
if true {
|
|
|
|
if let Some(42) = None::<u8> {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-12-02 15:23:24 -06:00
|
|
|
if let Some(42) = None::<u32> {}
|
|
|
|
}
|
|
|
|
|
2016-02-09 09:45:47 -06:00
|
|
|
if true {
|
2016-01-30 13:10:14 -06:00
|
|
|
if let Some(a) = Some(42) {}
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-02-09 09:45:47 -06:00
|
|
|
if let Some(a) = Some(43) {}
|
2016-01-30 13:10:14 -06:00
|
|
|
}
|
|
|
|
|
2016-02-09 18:22:53 -06:00
|
|
|
let _ = match 42 {
|
|
|
|
42 => foo(),
|
2018-02-08 13:26:50 -06:00
|
|
|
51 => foo(), //~ ERROR match arms have same body
|
2016-02-09 18:22:53 -06:00
|
|
|
_ => true,
|
|
|
|
};
|
|
|
|
|
2016-03-28 18:39:35 -05:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(_) => 24,
|
2018-02-08 13:26:50 -06:00
|
|
|
None => 24, //~ ERROR match arms have same body
|
2016-03-28 18:39:35 -05:00
|
|
|
};
|
|
|
|
|
2016-05-31 14:50:13 -05:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(foo) => 24,
|
|
|
|
None => 24,
|
|
|
|
};
|
|
|
|
|
2016-02-09 18:22:53 -06:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(42) => 24,
|
|
|
|
Some(a) => 24, // bindings are different
|
|
|
|
None => 0,
|
|
|
|
};
|
|
|
|
|
2016-03-28 18:39:35 -05:00
|
|
|
let _ = match Some(42) {
|
|
|
|
Some(a) if a > 0 => 24,
|
|
|
|
Some(a) => 24, // one arm has a guard
|
|
|
|
None => 0,
|
|
|
|
};
|
|
|
|
|
2016-02-09 18:22:53 -06:00
|
|
|
match (Some(42), Some(42)) {
|
|
|
|
(Some(a), None) => bar(a),
|
2018-02-08 13:26:50 -06:00
|
|
|
(None, Some(a)) => bar(a), //~ ERROR match arms have same body
|
2016-02-09 18:22:53 -06:00
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
2016-05-27 07:24:28 -05:00
|
|
|
match (Some(42), Some(42)) {
|
|
|
|
(Some(a), ..) => bar(a),
|
2018-02-08 13:26:50 -06:00
|
|
|
(.., Some(a)) => bar(a), //~ ERROR match arms have same body
|
2016-05-27 07:24:28 -05:00
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
|
|
|
match (1, 2, 3) {
|
|
|
|
(1, .., 3) => 42,
|
2018-02-08 13:26:50 -06:00
|
|
|
(.., 3) => 42, //~ ERROR match arms have same body
|
2016-05-27 07:24:28 -05:00
|
|
|
_ => 0,
|
|
|
|
};
|
|
|
|
|
2016-07-13 02:43:33 -05:00
|
|
|
let _ = if true {
|
|
|
|
0.0
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-07-13 02:43:33 -05:00
|
|
|
0.0
|
|
|
|
};
|
|
|
|
|
|
|
|
let _ = if true {
|
|
|
|
-0.0
|
|
|
|
} else {
|
2018-12-09 16:26:16 -06:00
|
|
|
//~ ERROR same body as `if` block
|
2016-07-13 02:43:33 -05:00
|
|
|
-0.0
|
|
|
|
};
|
|
|
|
|
2018-12-09 16:26:16 -06:00
|
|
|
let _ = if true { 0.0 } else { -0.0 };
|
|
|
|
|
2016-07-13 11:35:31 -05:00
|
|
|
// Different NaNs
|
2018-12-09 16:26:16 -06:00
|
|
|
let _ = if true { 0.0 / 0.0 } else { std::f32::NAN };
|
2016-07-13 11:35:31 -05:00
|
|
|
|
|
|
|
// Same NaNs
|
|
|
|
let _ = if true {
|
|
|
|
std::f32::NAN
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-07-13 11:35:31 -05:00
|
|
|
std::f32::NAN
|
|
|
|
};
|
|
|
|
|
2016-07-13 02:43:33 -05:00
|
|
|
let _ = match Some(()) {
|
|
|
|
Some(()) => 0.0,
|
2018-12-09 16:26:16 -06:00
|
|
|
None => -0.0,
|
2016-07-13 02:43:33 -05:00
|
|
|
};
|
|
|
|
|
2016-02-09 18:22:53 -06:00
|
|
|
match (Some(42), Some("")) {
|
|
|
|
(Some(a), None) => bar(a),
|
|
|
|
(None, Some(a)) => bar(a), // bindings have different types
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
2016-02-13 08:36:57 -06:00
|
|
|
if true {
|
|
|
|
try!(Ok("foo"));
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
|
|
|
//~ ERROR same body as `if` block
|
2016-02-13 08:36:57 -06:00
|
|
|
try!(Ok("foo"));
|
|
|
|
}
|
|
|
|
|
2016-02-09 09:45:47 -06:00
|
|
|
if true {
|
2016-01-30 13:10:14 -06:00
|
|
|
let foo = "";
|
2016-02-13 08:36:57 -06:00
|
|
|
return Ok(&foo[0..]);
|
2018-12-09 16:26:16 -06:00
|
|
|
} else if false {
|
2016-02-09 09:45:47 -06:00
|
|
|
let foo = "bar";
|
2016-02-13 08:36:57 -06:00
|
|
|
return Ok(&foo[0..]);
|
2018-12-09 16:26:16 -06:00
|
|
|
} else {
|
2016-01-30 13:10:14 -06:00
|
|
|
let foo = "";
|
2016-02-13 08:36:57 -06:00
|
|
|
return Ok(&foo[0..]);
|
2016-01-30 13:10:14 -06:00
|
|
|
}
|
2018-12-27 11:11:25 -06:00
|
|
|
|
|
|
|
// false positive if_same_then_else, let(x,y) vs let(y,x), see #3559
|
|
|
|
if true {
|
|
|
|
let foo = "";
|
|
|
|
let (x, y) = (1, 2);
|
|
|
|
return Ok(&foo[x..y]);
|
|
|
|
} else {
|
|
|
|
let foo = "";
|
|
|
|
let (y, x) = (1, 2);
|
|
|
|
return Ok(&foo[x..y]);
|
|
|
|
}
|
2016-01-30 12:16:49 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|
2018-02-05 17:31:06 -06:00
|
|
|
|
|
|
|
// Issue #2423. This was causing an ICE
|
|
|
|
fn func() {
|
|
|
|
if true {
|
|
|
|
f(&[0; 62]);
|
|
|
|
f(&[0; 4]);
|
|
|
|
f(&[0; 3]);
|
|
|
|
} else {
|
|
|
|
f(&[0; 62]);
|
|
|
|
f(&[0; 6]);
|
|
|
|
f(&[0; 6]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn f(val: &[u8]) {}
|