Auto merge of #7144 - rust-lang:while_immutable_mut_cond, r=flip1995
while_immutable_cond: check condition for mutation This fixes #6689 by also checking the bindings mutated in the condition, whereas it was previously only checked in the loop body. --- changelog: Fix FP in [`while_immutable_cond`] where mutation in the loop variable wasn't picked up.
This commit is contained in:
commit
a300b0e66c
@ -28,11 +28,14 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, cond: &'tcx Expr<'_>, expr: &'
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let used_in_condition = &var_visitor.ids;
|
let used_in_condition = &var_visitor.ids;
|
||||||
let no_cond_variable_mutated = if let Some(used_mutably) = mutated_variables(expr, cx) {
|
let mutated_in_body = mutated_variables(expr, cx);
|
||||||
used_in_condition.is_disjoint(&used_mutably)
|
let mutated_in_condition = mutated_variables(cond, cx);
|
||||||
} else {
|
let no_cond_variable_mutated =
|
||||||
return;
|
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 mutable_static_in_cond = var_visitor.def_ids.iter().any(|(_, v)| *v);
|
||||||
|
|
||||||
let mut has_break_or_return_visitor = HasBreakOrReturnVisitor {
|
let mut has_break_or_return_visitor = HasBreakOrReturnVisitor {
|
||||||
|
@ -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() {
|
fn main() {
|
||||||
immutable_condition();
|
immutable_condition();
|
||||||
unused_var();
|
unused_var();
|
||||||
used_immutable();
|
used_immutable();
|
||||||
internally_mutable();
|
internally_mutable();
|
||||||
|
immutable_condition_false_positive(5);
|
||||||
|
|
||||||
let mut c = Counter { count: 0 };
|
let mut c = Counter { count: 0 };
|
||||||
c.inc_n(5);
|
c.inc_n(5);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user