diff --git a/clippy_lints/src/copies.rs b/clippy_lints/src/copies.rs index aea1accccc65..eff9b9e11394 100644 --- a/clippy_lints/src/copies.rs +++ b/clippy_lints/src/copies.rs @@ -120,7 +120,10 @@ declare_clippy_lint! { /// /// **Why is this bad?** Duplicate code is less maintainable. /// - /// **Known problems:** Hopefully none. + /// **Known problems:** + /// * The lint doesn't check if the moved expressions modify values that are beeing used in + /// the if condition. The suggestion can in that case modify the behavior of the program. + /// See [rust-clippy#7452](https://github.com/rust-lang/rust-clippy/issues/7452) /// /// **Example:** /// ```ignore @@ -225,7 +228,7 @@ fn lint_same_then_else<'tcx>( blocks, expr, ); - } else if end_eq != 0 || (has_expr && expr_eq) { + } else if (end_eq != 0 && !has_expr) || (has_expr && expr_eq) { let block = blocks[blocks.len() - 1]; let (start_stmts, block_stmts) = block.stmts.split_at(start_eq); let (block_stmts, end_stmts) = block_stmts.split_at(block_stmts.len() - end_eq); @@ -358,8 +361,7 @@ fn scan_block_for_eq(cx: &LateContext<'tcx>, blocks: &[&Block<'tcx>]) -> Option< expr_eq &= block_expr_eq; } - let has_expr = blocks[0].expr.is_some(); - if has_expr && !expr_eq { + if !expr_eq { end_eq = 0; } diff --git a/tests/ui/branches_sharing_code/false_positives.rs b/tests/ui/branches_sharing_code/false_positives.rs new file mode 100644 index 000000000000..7f42df463411 --- /dev/null +++ b/tests/ui/branches_sharing_code/false_positives.rs @@ -0,0 +1,28 @@ +#![allow(dead_code)] +#![deny(clippy::if_same_then_else, clippy::branches_sharing_code)] + +// ################################## +// # Issue clippy#7369 +// ################################## +#[derive(Debug)] +pub struct FooBar { + foo: Vec, +} + +impl FooBar { + pub fn bar(&mut self) { + if true { + self.foo.pop(); + } else { + self.baz(); + + self.foo.pop(); + + self.baz() + } + } + + fn baz(&mut self) {} +} + +fn main() {}