| #![deny(clippy::if_same_then_else, clippy::branches_sharing_code)] |
| #![allow( |
| clippy::equatable_if_let, |
| clippy::uninlined_format_args, |
| clippy::redundant_pattern_matching, |
| dead_code |
| )] |
| //@no-rustfix |
| // This tests the branches_sharing_code lint at the end of blocks |
| |
| fn simple_examples() { |
| let x = 1; |
| |
| let _ = if x == 7 { |
| println!("Branch I"); |
| let start_value = 0; |
| println!("=^.^="); |
| |
| // Same but not moveable due to `start_value` |
| let _ = start_value; |
| |
| // The rest is self contained and moveable => Only lint the rest |
| let result = false; |
| println!("Block end!"); |
| result |
| } else { |
| println!("Branch II"); |
| let start_value = 8; |
| println!("xD"); |
| |
| // Same but not moveable due to `start_value` |
| let _ = start_value; |
| |
| // The rest is self contained and moveable => Only lint the rest |
| let result = false; |
| //~^ ERROR: all if blocks contain the same code at the end |
| //~| NOTE: the end suggestion probably needs some adjustments to use the expressio |
| println!("Block end!"); |
| result |
| }; |
| |
| // Else if block |
| if x == 9 { |
| println!("The index is: 6"); |
| |
| println!("Same end of block"); |
| } else if x == 8 { |
| println!("The index is: 4"); |
| |
| // We should only get a lint trigger for the last statement |
| println!("This is also eq with the else block"); |
| println!("Same end of block"); |
| } else { |
| println!("This is also eq with the else block"); |
| println!("Same end of block"); |
| //~^ ERROR: all if blocks contain the same code at the end |
| } |
| |
| // Use of outer scope value |
| let outer_scope_value = "I'm outside the if block"; |
| if x < 99 { |
| let z = "How are you"; |
| println!("I'm a local because I use the value `z`: `{}`", z); |
| |
| println!( |
| "I'm moveable because I know: `outer_scope_value`: '{}'", |
| outer_scope_value |
| ); |
| } else { |
| let z = 45678000; |
| println!("I'm a local because I use the value `z`: `{}`", z); |
| |
| println!( |
| //~^ ERROR: all if blocks contain the same code at the end |
| "I'm moveable because I know: `outer_scope_value`: '{}'", |
| outer_scope_value |
| ); |
| } |
| |
| if x == 9 { |
| if x == 8 { |
| // No parent!! |
| println!("---"); |
| println!("Hello World"); |
| } else { |
| println!("Hello World"); |
| //~^ ERROR: all if blocks contain the same code at the end |
| } |
| } |
| } |
| |
| /// Simple examples where the move can cause some problems due to moved values |
| fn simple_but_suggestion_is_invalid() { |
| let x = 16; |
| |
| // Local value |
| let later_used_value = 17; |
| if x == 9 { |
| let _ = 9; |
| let later_used_value = "A string value"; |
| println!("{}", later_used_value); |
| } else { |
| let later_used_value = "A string value"; |
| //~^ ERROR: all if blocks contain the same code at the end |
| println!("{}", later_used_value); |
| // I'm expecting a note about this |
| } |
| println!("{}", later_used_value); |
| |
| // outer function |
| if x == 78 { |
| let simple_examples = "I now identify as a &str :)"; |
| println!("This is the new simple_example: {}", simple_examples); |
| } else { |
| println!("Separator print statement"); |
| |
| let simple_examples = "I now identify as a &str :)"; |
| //~^ ERROR: all if blocks contain the same code at the end |
| println!("This is the new simple_example: {}", simple_examples); |
| } |
| simple_examples(); |
| } |
| |
| /// Tests where the blocks are not linted due to the used value scope |
| fn not_moveable_due_to_value_scope() { |
| let x = 18; |
| |
| // Using a local value in the moved code |
| if x == 9 { |
| let y = 18; |
| println!("y is: `{}`", y); |
| } else { |
| let y = "A string"; |
| println!("y is: `{}`", y); |
| } |
| |
| // Using a local value in the expression |
| let _ = if x == 0 { |
| let mut result = x + 1; |
| |
| println!("1. Doing some calculations"); |
| println!("2. Some more calculations"); |
| println!("3. Setting result"); |
| |
| result |
| } else { |
| let mut result = x - 1; |
| |
| println!("1. Doing some calculations"); |
| println!("2. Some more calculations"); |
| println!("3. Setting result"); |
| |
| result |
| }; |
| |
| let _ = if x == 7 { |
| let z1 = 100; |
| println!("z1: {}", z1); |
| |
| let z2 = z1; |
| println!("z2: {}", z2); |
| |
| z2 |
| } else { |
| let z1 = 300; |
| println!("z1: {}", z1); |
| |
| let z2 = z1; |
| println!("z2: {}", z2); |
| |
| z2 |
| }; |
| } |
| |
| /// This should add a note to the lint msg since the moved expression is not `()` |
| fn added_note_for_expression_use() -> u32 { |
| let x = 9; |
| |
| let _ = if x == 7 { |
| x << 2 |
| } else { |
| let _ = 6; |
| x << 2 |
| //~^ ERROR: all if blocks contain the same code at the end |
| //~| NOTE: the end suggestion probably needs some adjustments to use the expressio |
| }; |
| |
| if x == 9 { |
| x * 4 |
| } else { |
| let _ = 17; |
| x * 4 |
| //~^ ERROR: all if blocks contain the same code at the end |
| //~| NOTE: the end suggestion probably needs some adjustments to use the expressio |
| } |
| } |
| |
| #[rustfmt::skip] |
| fn test_suggestion_with_weird_formatting() { |
| let x = 9; |
| let mut a = 0; |
| let mut b = 0; |
| |
| // The error message still looks weird tbh but this is the best I can do |
| // for weird formatting |
| if x == 17 { b = 1; a = 0x99; } else { a = 0x99; } |
| //~^ ERROR: all if blocks contain the same code at the end |
| } |
| |
| fn fp_test() { |
| let x = 17; |
| |
| if x == 18 { |
| let y = 19; |
| if y < x { |
| println!("Trigger") |
| } |
| } else { |
| let z = 166; |
| if z < x { |
| println!("Trigger") |
| } |
| } |
| } |
| |
| fn fp_if_let_issue7054() { |
| // This shouldn't trigger the lint |
| let string; |
| let _x = if let true = true { |
| "" |
| } else if true { |
| string = "x".to_owned(); |
| &string |
| } else { |
| string = "y".to_owned(); |
| &string |
| }; |
| } |
| |
| fn main() {} |