| #![warn(clippy::explicit_counter_loop)] |
| #![allow(clippy::uninlined_format_args, clippy::useless_vec)] |
| //@no-rustfix |
| fn main() { |
| let mut vec = vec![1, 2, 3, 4]; |
| let mut _index = 0; |
| for _v in &vec { |
| //~^ ERROR: the variable `_index` is used as a loop counter |
| //~| NOTE: `-D clippy::explicit-counter-loop` implied by `-D warnings` |
| _index += 1 |
| } |
| |
| let mut _index = 1; |
| _index = 0; |
| for _v in &vec { |
| //~^ ERROR: the variable `_index` is used as a loop counter |
| _index += 1 |
| } |
| |
| let mut _index = 0; |
| for _v in &mut vec { |
| //~^ ERROR: the variable `_index` is used as a loop counter |
| _index += 1; |
| } |
| |
| let mut _index = 0; |
| for _v in vec { |
| //~^ ERROR: the variable `_index` is used as a loop counter |
| _index += 1; |
| } |
| |
| let vec = [1, 2, 3, 4]; |
| // Potential false positives |
| let mut _index = 0; |
| _index = 1; |
| for _v in &vec { |
| _index += 1 |
| } |
| |
| let mut _index = 0; |
| _index += 1; |
| for _v in &vec { |
| _index += 1 |
| } |
| |
| let mut _index = 0; |
| for _v in &vec { |
| _index = 1; |
| _index += 1 |
| } |
| |
| let mut _index = 0; |
| for _v in &vec { |
| let mut _index = 0; |
| _index += 1 |
| } |
| |
| let mut _index = 0; |
| for _v in &vec { |
| _index += 1; |
| _index = 0; |
| } |
| |
| let mut _index = 0; |
| if true { |
| _index = 1 |
| }; |
| for _v in &vec { |
| _index += 1 |
| } |
| |
| let mut _index = 1; |
| if false { |
| _index = 0 |
| }; |
| for _v in &vec { |
| _index += 1 |
| } |
| } |
| |
| mod issue_1219 { |
| pub fn test() { |
| // should not trigger the lint because variable is used after the loop #473 |
| let vec = vec![1, 2, 3]; |
| let mut index = 0; |
| for _v in &vec { |
| index += 1 |
| } |
| println!("index: {}", index); |
| |
| // should not trigger the lint because the count is conditional #1219 |
| let text = "banana"; |
| let mut count = 0; |
| for ch in text.chars() { |
| println!("{}", count); |
| if ch == 'a' { |
| continue; |
| } |
| count += 1; |
| } |
| |
| // should not trigger the lint because the count is conditional |
| let text = "banana"; |
| let mut count = 0; |
| for ch in text.chars() { |
| println!("{}", count); |
| if ch == 'a' { |
| count += 1; |
| } |
| } |
| |
| // should trigger the lint because the count is not conditional |
| let text = "banana"; |
| let mut count = 0; |
| for ch in text.chars() { |
| //~^ ERROR: the variable `count` is used as a loop counter |
| println!("{}", count); |
| count += 1; |
| if ch == 'a' { |
| continue; |
| } |
| } |
| |
| // should trigger the lint because the count is not conditional |
| let text = "banana"; |
| let mut count = 0; |
| for ch in text.chars() { |
| //~^ ERROR: the variable `count` is used as a loop counter |
| println!("{}", count); |
| count += 1; |
| for i in 0..2 { |
| let _ = 123; |
| } |
| } |
| |
| // should not trigger the lint because the count is incremented multiple times |
| let text = "banana"; |
| let mut count = 0; |
| for ch in text.chars() { |
| println!("{}", count); |
| count += 1; |
| for i in 0..2 { |
| count += 1; |
| } |
| } |
| } |
| } |
| |
| mod issue_3308 { |
| pub fn test() { |
| // should not trigger the lint because the count is incremented multiple times |
| let mut skips = 0; |
| let erasures = vec![]; |
| for i in 0..10 { |
| println!("{}", skips); |
| while erasures.contains(&(i + skips)) { |
| skips += 1; |
| } |
| } |
| |
| // should not trigger the lint because the count is incremented multiple times |
| let mut skips = 0; |
| for i in 0..10 { |
| println!("{}", skips); |
| let mut j = 0; |
| while j < 5 { |
| skips += 1; |
| j += 1; |
| } |
| } |
| |
| // should not trigger the lint because the count is incremented multiple times |
| let mut skips = 0; |
| for i in 0..10 { |
| println!("{}", skips); |
| for j in 0..5 { |
| skips += 1; |
| } |
| } |
| } |
| } |
| |
| mod issue_1670 { |
| pub fn test() { |
| let mut count = 0; |
| for _i in 3..10 { |
| //~^ ERROR: the variable `count` is used as a loop counter |
| count += 1; |
| } |
| } |
| } |
| |
| mod issue_4732 { |
| pub fn test() { |
| let slice = &[1, 2, 3]; |
| let mut index = 0; |
| |
| // should not trigger the lint because the count is used after the loop |
| for _v in slice { |
| index += 1 |
| } |
| let _closure = || println!("index: {}", index); |
| } |
| } |
| |
| mod issue_4677 { |
| pub fn test() { |
| let slice = &[1, 2, 3]; |
| |
| // should not trigger the lint because the count is used after incremented |
| let mut count = 0; |
| for _i in slice { |
| count += 1; |
| println!("{}", count); |
| } |
| } |
| } |
| |
| mod issue_7920 { |
| pub fn test() { |
| let slice = &[1, 2, 3]; |
| |
| let index_usize: usize = 0; |
| let mut idx_usize: usize = 0; |
| |
| // should suggest `enumerate` |
| for _item in slice { |
| //~^ ERROR: the variable `idx_usize` is used as a loop counter |
| if idx_usize == index_usize { |
| break; |
| } |
| |
| idx_usize += 1; |
| } |
| |
| let index_u32: u32 = 0; |
| let mut idx_u32: u32 = 0; |
| |
| // should suggest `zip` |
| for _item in slice { |
| //~^ ERROR: the variable `idx_u32` is used as a loop counter |
| //~| NOTE: `idx_u32` is of type `u32`, making it ineligible for `Iterator::enumera |
| if idx_u32 == index_u32 { |
| break; |
| } |
| |
| idx_u32 += 1; |
| } |
| } |
| } |
| |
| mod issue_10058 { |
| pub fn test() { |
| // should not lint since we are increasing counter potentially more than once in the loop |
| let values = [0, 1, 0, 1, 1, 1, 0, 1, 0, 1]; |
| let mut counter = 0; |
| for value in values { |
| counter += 1; |
| |
| if value == 0 { |
| continue; |
| } |
| |
| counter += 1; |
| } |
| } |
| |
| pub fn test2() { |
| // should not lint since we are increasing counter potentially more than once in the loop |
| let values = [0, 1, 0, 1, 1, 1, 0, 1, 0, 1]; |
| let mut counter = 0; |
| for value in values { |
| counter += 1; |
| |
| if value != 0 { |
| counter += 1; |
| } |
| } |
| } |
| } |
| |
| mod issue_13123 { |
| pub fn test() { |
| let mut vec = vec![1, 2, 3, 4]; |
| let mut _index = 0; |
| 'label: for v in vec { |
| _index += 1; |
| if v == 1 { |
| break 'label; |
| } |
| } |
| } |
| } |