Skip to content

Commit

Permalink
while_immutable_cond: check condition for mutation
Browse files Browse the repository at this point in the history
  • Loading branch information
llogiq committed Apr 29, 2021
1 parent ce37099 commit 63425de
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
13 changes: 8 additions & 5 deletions clippy_lints/src/loops/while_immutable_condition.rs
Expand Up @@ -28,11 +28,14 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, cond: &'tcx Expr<'_>, expr: &'
return;
}
let used_in_condition = &var_visitor.ids;
let no_cond_variable_mutated = if let Some(used_mutably) = mutated_variables(expr, cx) {
used_in_condition.is_disjoint(&used_mutably)
} else {
return;
};
let mutated_in_body = mutated_variables(expr, cx);
let mutated_in_condition = mutated_variables(cond, cx);
let no_cond_variable_mutated =
if let (Some(used_mutably_body), Some(used_mutably_cond)) = (mutated_in_body, mutated_in_condition) {
used_in_condition.is_disjoint(&used_mutably_body) && used_in_condition.is_disjoint(&used_mutably_cond)
} else {
return;
};
let mutable_static_in_cond = var_visitor.def_ids.iter().any(|(_, v)| *v);

let mut has_break_or_return_visitor = HasBreakOrReturnVisitor {
Expand Down
12 changes: 12 additions & 0 deletions tests/ui/infinite_loop.rs
Expand Up @@ -192,11 +192,23 @@ fn while_loop_with_break_and_return() {
}
}

fn immutable_condition_false_positive(mut n: u64) -> u32 {
let mut count = 0;
while {
n >>= 1;
n != 0
} {
count += 1;
}
count
}

fn main() {
immutable_condition();
unused_var();
used_immutable();
internally_mutable();
immutable_condition_false_positive(5);

let mut c = Counter { count: 0 };
c.inc_n(5);
Expand Down

0 comments on commit 63425de

Please sign in to comment.