| #![warn(clippy::while_immutable_condition)] | |
| fn fn_val(i: i32) -> i32 { | |
| unimplemented!() | |
| } | |
| fn fn_constref(i: &i32) -> i32 { | |
| unimplemented!() | |
| } | |
| fn fn_mutref(i: &mut i32) { | |
| unimplemented!() | |
| } | |
| fn fooi() -> i32 { | |
| unimplemented!() | |
| } | |
| fn foob() -> bool { | |
| unimplemented!() | |
| } | |
| fn immutable_condition() { | |
| // Should warn when all vars mentioned are immutable | |
| let y = 0; | |
| while y < 10 { | |
| //~^ while_immutable_condition | |
| println!("KO - y is immutable"); | |
| } | |
| let x = 0; | |
| while y < 10 && x < 3 { | |
| //~^ while_immutable_condition | |
| let mut k = 1; | |
| k += 2; | |
| println!("KO - x and y immutable"); | |
| } | |
| let cond = false; | |
| while !cond { | |
| //~^ while_immutable_condition | |
| println!("KO - cond immutable"); | |
| } | |
| let mut i = 0; | |
| while y < 10 && i < 3 { | |
| i += 1; | |
| println!("OK - i is mutable"); | |
| } | |
| let mut mut_cond = false; | |
| while !mut_cond || cond { | |
| mut_cond = true; | |
| println!("OK - mut_cond is mutable"); | |
| } | |
| while fooi() < x { | |
| println!("OK - Fn call results may vary"); | |
| } | |
| while foob() { | |
| println!("OK - Fn call results may vary"); | |
| } | |
| let mut a = 0; | |
| let mut c = move || { | |
| while a < 5 { | |
| a += 1; | |
| println!("OK - a is mutable"); | |
| } | |
| }; | |
| c(); | |
| let mut tup = (0, 0); | |
| while tup.0 < 5 { | |
| tup.0 += 1; | |
| println!("OK - tup.0 gets mutated") | |
| } | |
| } | |
| fn unused_var() { | |
| // Should warn when a (mutable) var is not used in while body | |
| let (mut i, mut j) = (0, 0); | |
| while i < 3 { | |
| //~^ while_immutable_condition | |
| j = 3; | |
| println!("KO - i not mentioned"); | |
| } | |
| while i < 3 && j > 0 { | |
| //~^ while_immutable_condition | |
| println!("KO - i and j not mentioned"); | |
| } | |
| while i < 3 { | |
| //~^ while_immutable_condition | |
| let mut i = 5; | |
| fn_mutref(&mut i); | |
| println!("KO - shadowed"); | |
| } | |
| while i < 3 && j > 0 { | |
| i = 5; | |
| println!("OK - i in cond and mentioned"); | |
| } | |
| } | |
| fn used_immutable() { | |
| let mut i = 0; | |
| while i < 3 { | |
| //~^ while_immutable_condition | |
| fn_constref(&i); | |
| println!("KO - const reference"); | |
| } | |
| while i < 3 { | |
| //~^ while_immutable_condition | |
| fn_val(i); | |
| println!("KO - passed by value"); | |
| } | |
| while i < 3 { | |
| println!("OK - passed by mutable reference"); | |
| fn_mutref(&mut i) | |
| } | |
| while i < 3 { | |
| fn_mutref(&mut i); | |
| println!("OK - passed by mutable reference"); | |
| } | |
| } | |
| const N: i32 = 5; | |
| const B: bool = false; | |
| fn consts() { | |
| while false { | |
| println!("Constants are not linted"); | |
| } | |
| while B { | |
| println!("Constants are not linted"); | |
| } | |
| while N > 0 { | |
| println!("Constants are not linted"); | |
| } | |
| } | |
| use std::cell::Cell; | |
| fn maybe_i_mutate(i: &Cell<bool>) { | |
| unimplemented!() | |
| } | |
| fn internally_mutable() { | |
| let b = Cell::new(true); | |
| while b.get() { | |
| // b cannot be silently coerced to `bool` | |
| maybe_i_mutate(&b); | |
| println!("OK - Method call within condition"); | |
| } | |
| } | |
| struct Counter { | |
| count: usize, | |
| } | |
| impl Counter { | |
| fn inc(&mut self) { | |
| self.count += 1; | |
| } | |
| fn inc_n(&mut self, n: usize) { | |
| while self.count < n { | |
| self.inc(); | |
| } | |
| println!("OK - self borrowed mutably"); | |
| } | |
| fn print_n(&self, n: usize) { | |
| while self.count < n { | |
| //~^ while_immutable_condition | |
| println!("KO - {} is not mutated", self.count); | |
| } | |
| } | |
| } | |
| fn while_loop_with_break_and_return() { | |
| let y = 0; | |
| while y < 10 { | |
| //~^ while_immutable_condition | |
| if y == 0 { | |
| break; | |
| } | |
| println!("KO - loop contains break"); | |
| } | |
| while y < 10 { | |
| //~^ while_immutable_condition | |
| if y == 0 { | |
| return; | |
| } | |
| println!("KO - loop contains return"); | |
| } | |
| } | |
| fn immutable_condition_false_positive(mut n: u64) -> u32 { | |
| let mut count = 0; | |
| while { | |
| n >>= 1; | |
| n != 0 | |
| } { | |
| count += 1; | |
| } | |
| count | |
| } | |
| fn main() {} |