#![warn(clippy::if_same_then_else)] #![allow( clippy::blacklisted_name, clippy::collapsible_if, clippy::cognitive_complexity, clippy::eq_op, clippy::needless_return, clippy::never_loop, clippy::no_effect, clippy::zero_divided_by_zero, clippy::unused_unit )] struct Foo { bar: u8, } fn foo() -> bool { unimplemented!() } fn if_same_then_else() -> Result<&'static str, ()> { if true { Foo { bar: 42 }; 0..10; ..; 0..; ..10; 0..=10; foo(); } else { //~ ERROR same body as `if` block Foo { bar: 42 }; 0..10; ..; 0..; ..10; 0..=10; foo(); } if true { Foo { bar: 42 }; } else { Foo { bar: 43 }; } if true { (); } else { () } if true { 0..10; } else { 0..=10; } if true { foo(); foo(); } else { foo(); } let _ = if true { 0.0 } else { //~ ERROR same body as `if` block 0.0 }; let _ = if true { -0.0 } else { //~ ERROR same body as `if` block -0.0 }; let _ = if true { 0.0 } else { -0.0 }; // Different NaNs let _ = if true { 0.0 / 0.0 } else { std::f32::NAN }; if true { foo(); } let _ = if true { 42 } else { //~ ERROR same body as `if` block 42 }; if true { for _ in &[42] { let foo: &Option<_> = &Some::(42); if true { break; } else { continue; } } } else { //~ ERROR same body as `if` block for _ in &[42] { let foo: &Option<_> = &Some::(42); if true { break; } else { continue; } } } if true { let bar = if true { 42 } else { 43 }; while foo() { break; } bar + 1; } else { //~ ERROR same body as `if` block let bar = if true { 42 } else { 43 }; while foo() { break; } bar + 1; } if true { let _ = match 42 { 42 => 1, a if a > 0 => 2, 10..=15 => 3, _ => 4, }; } else if false { foo(); } else if foo() { let _ = match 42 { 42 => 1, a if a > 0 => 2, 10..=15 => 3, _ => 4, }; } if true { if let Some(a) = Some(42) {} } else { //~ ERROR same body as `if` block if let Some(a) = Some(42) {} } if true { if let (1, .., 3) = (1, 2, 3) {} } else { //~ ERROR same body as `if` block 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) {} } if true { if let Some(42) = None {} } else { if let Option::Some(42) = None {} } if true { if let Some(42) = None:: {} } else { if let Some(42) = None {} } if true { if let Some(42) = None:: {} } else { if let Some(42) = None:: {} } if true { if let Some(a) = Some(42) {} } else { if let Some(a) = Some(43) {} } // Same NaNs let _ = if true { std::f32::NAN } else { //~ ERROR same body as `if` block std::f32::NAN }; if true { try!(Ok("foo")); } else { //~ ERROR same body as `if` block try!(Ok("foo")); } if true { let foo = ""; return Ok(&foo[0..]); } else if false { let foo = "bar"; return Ok(&foo[0..]); } else { let foo = ""; return Ok(&foo[0..]); } // False positive `if_same_then_else`: `let (x, y)` vs. `let (y, x)`; see issue #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]); } } // 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]) {} fn main() {}