From b421f5ad4833e93025b9180bf8e296d1eb0a81d2 Mon Sep 17 00:00:00 2001 From: Philipp Hansch Date: Tue, 30 Oct 2018 21:25:34 +0100 Subject: [PATCH] UI test cleanup: Extract for_loop_over_x tests --- tests/ui/for_loop.rs | 60 --- tests/ui/for_loop.stderr | 424 ++++++++------------ tests/ui/for_loop_over_option_result.rs | 68 ++++ tests/ui/for_loop_over_option_result.stderr | 72 ++++ 4 files changed, 318 insertions(+), 306 deletions(-) create mode 100644 tests/ui/for_loop_over_option_result.rs create mode 100644 tests/ui/for_loop_over_option_result.stderr diff --git a/tests/ui/for_loop.rs b/tests/ui/for_loop.rs index eefb431727629..2a70149f24604 100644 --- a/tests/ui/for_loop.rs +++ b/tests/ui/for_loop.rs @@ -7,10 +7,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. - - - - use std::collections::*; use std::rc::Rc; @@ -18,60 +14,6 @@ static STATIC: [usize; 4] = [0, 1, 8, 16]; const CONST: [usize; 4] = [0, 1, 8, 16]; #[warn(clippy::all)] -fn for_loop_over_option_and_result() { - let option = Some(1); - let result = option.ok_or("x not found"); - let v = vec![0, 1, 2]; - - // check FOR_LOOP_OVER_OPTION lint - for x in option { - println!("{}", x); - } - - // check FOR_LOOP_OVER_RESULT lint - for x in result { - println!("{}", x); - } - - for x in option.ok_or("x not found") { - println!("{}", x); - } - - // make sure LOOP_OVER_NEXT lint takes clippy::precedence when next() is the last call - // in the chain - for x in v.iter().next() { - println!("{}", x); - } - - // make sure we lint when next() is not the last call in the chain - for x in v.iter().next().and(Some(0)) { - println!("{}", x); - } - - for x in v.iter().next().ok_or("x not found") { - println!("{}", x); - } - - // check for false positives - - // for loop false positive - for x in v { - println!("{}", x); - } - - // while let false positive for Option - while let Some(x) = option { - println!("{}", x); - break; - } - - // while let false positive for Result - while let Ok(x) = result { - println!("{}", x); - break; - } -} - struct Unrelated(Vec); impl Unrelated { fn next(&self) -> std::slice::Iter { @@ -379,8 +321,6 @@ fn main() { } println!("index: {}", index); - for_loop_over_option_and_result(); - let m: HashMap = HashMap::new(); for (_, v) in &m { let _v = v; diff --git a/tests/ui/for_loop.stderr b/tests/ui/for_loop.stderr index 0318b6694e414..f70a6d3b32f2b 100644 --- a/tests/ui/for_loop.stderr +++ b/tests/ui/for_loop.stderr @@ -1,489 +1,421 @@ -error: for loop over `option`, which is an `Option`. This is more readably written as an `if let` statement. - --> $DIR/for_loop.rs:27:14 - | -27 | for x in option { - | ^^^^^^ - | - = note: `-D clippy::for-loop-over-option` implied by `-D warnings` - = help: consider replacing `for x in option` with `if let Some(x) = option` - -error: for loop over `result`, which is a `Result`. This is more readably written as an `if let` statement. - --> $DIR/for_loop.rs:32:14 - | -32 | for x in result { - | ^^^^^^ - | - = note: `-D clippy::for-loop-over-result` implied by `-D warnings` - = help: consider replacing `for x in result` with `if let Ok(x) = result` - -error: for loop over `option.ok_or("x not found")`, which is a `Result`. This is more readably written as an `if let` statement. - --> $DIR/for_loop.rs:36:14 - | -36 | for x in option.ok_or("x not found") { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: consider replacing `for x in option.ok_or("x not found")` with `if let Ok(x) = option.ok_or("x not found")` - -error: you are iterating over `Iterator::next()` which is an Option; this will compile but is probably not what you want - --> $DIR/for_loop.rs:42:14 - | -42 | for x in v.iter().next() { - | ^^^^^^^^^^^^^^^ - | - = note: `-D clippy::iter-next-loop` implied by `-D warnings` - -error: for loop over `v.iter().next().and(Some(0))`, which is an `Option`. This is more readably written as an `if let` statement. - --> $DIR/for_loop.rs:47:14 - | -47 | for x in v.iter().next().and(Some(0)) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: consider replacing `for x in v.iter().next().and(Some(0))` with `if let Some(x) = v.iter().next().and(Some(0))` - -error: for loop over `v.iter().next().ok_or("x not found")`, which is a `Result`. This is more readably written as an `if let` statement. - --> $DIR/for_loop.rs:51:14 - | -51 | for x in v.iter().next().ok_or("x not found") { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: consider replacing `for x in v.iter().next().ok_or("x not found")` with `if let Ok(x) = v.iter().next().ok_or("x not found")` - -error: this loop never actually loops - --> $DIR/for_loop.rs:63:5 - | -63 | / while let Some(x) = option { -64 | | println!("{}", x); -65 | | break; -66 | | } - | |_____^ - | - = note: `-D clippy::never-loop` implied by `-D warnings` - -error: this loop never actually loops - --> $DIR/for_loop.rs:69:5 - | -69 | / while let Ok(x) = result { -70 | | println!("{}", x); -71 | | break; -72 | | } - | |_____^ - error: the loop variable `i` is only used to index `vec`. - --> $DIR/for_loop.rs:96:14 + --> $DIR/for_loop.rs:38:14 | -96 | for i in 0..vec.len() { +38 | for i in 0..vec.len() { | ^^^^^^^^^^^^ | = note: `-D clippy::needless-range-loop` implied by `-D warnings` help: consider using an iterator | -96 | for in &vec { +38 | for in &vec { | ^^^^^^ ^^^^ error: the loop variable `i` is only used to index `vec`. - --> $DIR/for_loop.rs:105:14 - | -105 | for i in 0..vec.len() { - | ^^^^^^^^^^^^ + --> $DIR/for_loop.rs:47:14 + | +47 | for i in 0..vec.len() { + | ^^^^^^^^^^^^ help: consider using an iterator - | -105 | for in &vec { - | ^^^^^^ ^^^^ + | +47 | for in &vec { + | ^^^^^^ ^^^^ error: the loop variable `j` is only used to index `STATIC`. - --> $DIR/for_loop.rs:110:14 - | -110 | for j in 0..4 { - | ^^^^ + --> $DIR/for_loop.rs:52:14 + | +52 | for j in 0..4 { + | ^^^^ help: consider using an iterator - | -110 | for in &STATIC { - | ^^^^^^ ^^^^^^^ + | +52 | for in &STATIC { + | ^^^^^^ ^^^^^^^ error: the loop variable `j` is only used to index `CONST`. - --> $DIR/for_loop.rs:114:14 - | -114 | for j in 0..4 { - | ^^^^ + --> $DIR/for_loop.rs:56:14 + | +56 | for j in 0..4 { + | ^^^^ help: consider using an iterator - | -114 | for in &CONST { - | ^^^^^^ ^^^^^^ + | +56 | for in &CONST { + | ^^^^^^ ^^^^^^ error: the loop variable `i` is used to index `vec` - --> $DIR/for_loop.rs:118:14 - | -118 | for i in 0..vec.len() { - | ^^^^^^^^^^^^ + --> $DIR/for_loop.rs:60:14 + | +60 | for i in 0..vec.len() { + | ^^^^^^^^^^^^ help: consider using an iterator - | -118 | for (i, ) in vec.iter().enumerate() { - | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ + | +60 | for (i, ) in vec.iter().enumerate() { + | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is only used to index `vec2`. - --> $DIR/for_loop.rs:126:14 - | -126 | for i in 0..vec.len() { - | ^^^^^^^^^^^^ + --> $DIR/for_loop.rs:68:14 + | +68 | for i in 0..vec.len() { + | ^^^^^^^^^^^^ help: consider using an iterator - | -126 | for in vec2.iter().take(vec.len()) { - | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +68 | for in vec2.iter().take(vec.len()) { + | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is only used to index `vec`. - --> $DIR/for_loop.rs:130:14 - | -130 | for i in 5..vec.len() { - | ^^^^^^^^^^^^ + --> $DIR/for_loop.rs:72:14 + | +72 | for i in 5..vec.len() { + | ^^^^^^^^^^^^ help: consider using an iterator - | -130 | for in vec.iter().skip(5) { - | ^^^^^^ ^^^^^^^^^^^^^^^^^^ + | +72 | for in vec.iter().skip(5) { + | ^^^^^^ ^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is only used to index `vec`. - --> $DIR/for_loop.rs:134:14 - | -134 | for i in 0..MAX_LEN { - | ^^^^^^^^^^ + --> $DIR/for_loop.rs:76:14 + | +76 | for i in 0..MAX_LEN { + | ^^^^^^^^^^ help: consider using an iterator - | -134 | for in vec.iter().take(MAX_LEN) { - | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ + | +76 | for in vec.iter().take(MAX_LEN) { + | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is only used to index `vec`. - --> $DIR/for_loop.rs:138:14 - | -138 | for i in 0..=MAX_LEN { - | ^^^^^^^^^^^ + --> $DIR/for_loop.rs:80:14 + | +80 | for i in 0..=MAX_LEN { + | ^^^^^^^^^^^ help: consider using an iterator - | -138 | for in vec.iter().take(MAX_LEN + 1) { - | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +80 | for in vec.iter().take(MAX_LEN + 1) { + | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is only used to index `vec`. - --> $DIR/for_loop.rs:142:14 - | -142 | for i in 5..10 { - | ^^^^^ + --> $DIR/for_loop.rs:84:14 + | +84 | for i in 5..10 { + | ^^^^^ help: consider using an iterator - | -142 | for in vec.iter().take(10).skip(5) { - | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +84 | for in vec.iter().take(10).skip(5) { + | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is only used to index `vec`. - --> $DIR/for_loop.rs:146:14 - | -146 | for i in 5..=10 { - | ^^^^^^ + --> $DIR/for_loop.rs:88:14 + | +88 | for i in 5..=10 { + | ^^^^^^ help: consider using an iterator - | -146 | for in vec.iter().take(10 + 1).skip(5) { - | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +88 | for in vec.iter().take(10 + 1).skip(5) { + | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is used to index `vec` - --> $DIR/for_loop.rs:150:14 - | -150 | for i in 5..vec.len() { - | ^^^^^^^^^^^^ + --> $DIR/for_loop.rs:92:14 + | +92 | for i in 5..vec.len() { + | ^^^^^^^^^^^^ help: consider using an iterator - | -150 | for (i, ) in vec.iter().enumerate().skip(5) { - | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +92 | for (i, ) in vec.iter().enumerate().skip(5) { + | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: the loop variable `i` is used to index `vec` - --> $DIR/for_loop.rs:154:14 - | -154 | for i in 5..10 { - | ^^^^^ + --> $DIR/for_loop.rs:96:14 + | +96 | for i in 5..10 { + | ^^^^^ help: consider using an iterator - | -154 | for (i, ) in vec.iter().enumerate().take(10).skip(5) { - | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +96 | for (i, ) in vec.iter().enumerate().take(10).skip(5) { + | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: this range is empty so this for loop will never run - --> $DIR/for_loop.rs:158:14 + --> $DIR/for_loop.rs:100:14 | -158 | for i in 10..0 { +100 | for i in 10..0 { | ^^^^^ | = note: `-D clippy::reverse-range-loop` implied by `-D warnings` help: consider using the following if you are attempting to iterate over this range in reverse | -158 | for i in (0..10).rev() { +100 | for i in (0..10).rev() { | ^^^^^^^^^^^^^ error: this range is empty so this for loop will never run - --> $DIR/for_loop.rs:162:14 + --> $DIR/for_loop.rs:104:14 | -162 | for i in 10..=0 { +104 | for i in 10..=0 { | ^^^^^^ help: consider using the following if you are attempting to iterate over this range in reverse | -162 | for i in (0...10).rev() { +104 | for i in (0...10).rev() { | ^^^^^^^^^^^^^^ error: this range is empty so this for loop will never run - --> $DIR/for_loop.rs:166:14 + --> $DIR/for_loop.rs:108:14 | -166 | for i in MAX_LEN..0 { +108 | for i in MAX_LEN..0 { | ^^^^^^^^^^ help: consider using the following if you are attempting to iterate over this range in reverse | -166 | for i in (0..MAX_LEN).rev() { +108 | for i in (0..MAX_LEN).rev() { | ^^^^^^^^^^^^^^^^^^ error: this range is empty so this for loop will never run - --> $DIR/for_loop.rs:170:14 + --> $DIR/for_loop.rs:112:14 | -170 | for i in 5..5 { +112 | for i in 5..5 { | ^^^^ error: this range is empty so this for loop will never run - --> $DIR/for_loop.rs:195:14 + --> $DIR/for_loop.rs:137:14 | -195 | for i in 10..5 + 4 { +137 | for i in 10..5 + 4 { | ^^^^^^^^^ help: consider using the following if you are attempting to iterate over this range in reverse | -195 | for i in (5 + 4..10).rev() { +137 | for i in (5 + 4..10).rev() { | ^^^^^^^^^^^^^^^^^ error: this range is empty so this for loop will never run - --> $DIR/for_loop.rs:199:14 + --> $DIR/for_loop.rs:141:14 | -199 | for i in (5 + 2)..(3 - 1) { +141 | for i in (5 + 2)..(3 - 1) { | ^^^^^^^^^^^^^^^^ help: consider using the following if you are attempting to iterate over this range in reverse | -199 | for i in ((3 - 1)..(5 + 2)).rev() { +141 | for i in ((3 - 1)..(5 + 2)).rev() { | ^^^^^^^^^^^^^^^^^^^^^^^^ error: this range is empty so this for loop will never run - --> $DIR/for_loop.rs:203:14 + --> $DIR/for_loop.rs:145:14 | -203 | for i in (5 + 2)..(8 - 1) { +145 | for i in (5 + 2)..(8 - 1) { | ^^^^^^^^^^^^^^^^ error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:225:15 + --> $DIR/for_loop.rs:167:15 | -225 | for _v in vec.iter() {} +167 | for _v in vec.iter() {} | ^^^^^^^^^^ help: to write this more concisely, try: `&vec` | = note: `-D clippy::explicit-iter-loop` implied by `-D warnings` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:227:15 + --> $DIR/for_loop.rs:169:15 | -227 | for _v in vec.iter_mut() {} +169 | for _v in vec.iter_mut() {} | ^^^^^^^^^^^^^^ help: to write this more concisely, try: `&mut vec` error: it is more concise to loop over containers instead of using explicit iteration methods` - --> $DIR/for_loop.rs:230:15 + --> $DIR/for_loop.rs:172:15 | -230 | for _v in out_vec.into_iter() {} +172 | for _v in out_vec.into_iter() {} | ^^^^^^^^^^^^^^^^^^^ help: to write this more concisely, try: `out_vec` | = note: `-D clippy::explicit-into-iter-loop` implied by `-D warnings` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:233:15 + --> $DIR/for_loop.rs:175:15 | -233 | for _v in array.into_iter() {} +175 | for _v in array.into_iter() {} | ^^^^^^^^^^^^^^^^^ help: to write this more concisely, try: `&array` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:238:15 + --> $DIR/for_loop.rs:180:15 | -238 | for _v in [1, 2, 3].iter() {} +180 | for _v in [1, 2, 3].iter() {} | ^^^^^^^^^^^^^^^^ help: to write this more concisely, try: `&[1, 2, 3]` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:242:15 + --> $DIR/for_loop.rs:184:15 | -242 | for _v in [0; 32].iter() {} +184 | for _v in [0; 32].iter() {} | ^^^^^^^^^^^^^^ help: to write this more concisely, try: `&[0; 32]` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:247:15 + --> $DIR/for_loop.rs:189:15 | -247 | for _v in ll.iter() {} +189 | for _v in ll.iter() {} | ^^^^^^^^^ help: to write this more concisely, try: `&ll` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:250:15 + --> $DIR/for_loop.rs:192:15 | -250 | for _v in vd.iter() {} +192 | for _v in vd.iter() {} | ^^^^^^^^^ help: to write this more concisely, try: `&vd` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:253:15 + --> $DIR/for_loop.rs:195:15 | -253 | for _v in bh.iter() {} +195 | for _v in bh.iter() {} | ^^^^^^^^^ help: to write this more concisely, try: `&bh` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:256:15 + --> $DIR/for_loop.rs:198:15 | -256 | for _v in hm.iter() {} +198 | for _v in hm.iter() {} | ^^^^^^^^^ help: to write this more concisely, try: `&hm` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:259:15 + --> $DIR/for_loop.rs:201:15 | -259 | for _v in bt.iter() {} +201 | for _v in bt.iter() {} | ^^^^^^^^^ help: to write this more concisely, try: `&bt` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:262:15 + --> $DIR/for_loop.rs:204:15 | -262 | for _v in hs.iter() {} +204 | for _v in hs.iter() {} | ^^^^^^^^^ help: to write this more concisely, try: `&hs` error: it is more concise to loop over references to containers instead of using explicit iteration methods - --> $DIR/for_loop.rs:265:15 + --> $DIR/for_loop.rs:207:15 | -265 | for _v in bs.iter() {} +207 | for _v in bs.iter() {} | ^^^^^^^^^ help: to write this more concisely, try: `&bs` error: you are iterating over `Iterator::next()` which is an Option; this will compile but is probably not what you want - --> $DIR/for_loop.rs:267:15 + --> $DIR/for_loop.rs:209:15 | -267 | for _v in vec.iter().next() {} +209 | for _v in vec.iter().next() {} | ^^^^^^^^^^^^^^^^^ + | + = note: `-D clippy::iter-next-loop` implied by `-D warnings` error: you are collect()ing an iterator and throwing away the result. Consider using an explicit for loop to exhaust the iterator - --> $DIR/for_loop.rs:274:5 + --> $DIR/for_loop.rs:216:5 | -274 | vec.iter().cloned().map(|x| out.push(x)).collect::>(); +216 | vec.iter().cloned().map(|x| out.push(x)).collect::>(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: `-D clippy::unused-collect` implied by `-D warnings` error: you seem to want to iterate on a map's values - --> $DIR/for_loop.rs:385:19 + --> $DIR/for_loop.rs:325:19 | -385 | for (_, v) in &m { +325 | for (_, v) in &m { | ^^ | = note: `-D clippy::for-kv-map` implied by `-D warnings` help: use the corresponding method | -385 | for v in m.values() { +325 | for v in m.values() { | ^ ^^^^^^^^^^ error: you seem to want to iterate on a map's values - --> $DIR/for_loop.rs:390:19 + --> $DIR/for_loop.rs:330:19 | -390 | for (_, v) in &*m { +330 | for (_, v) in &*m { | ^^^ help: use the corresponding method | -390 | for v in (*m).values() { +330 | for v in (*m).values() { | ^ ^^^^^^^^^^^^^ error: you seem to want to iterate on a map's values - --> $DIR/for_loop.rs:398:19 + --> $DIR/for_loop.rs:338:19 | -398 | for (_, v) in &mut m { +338 | for (_, v) in &mut m { | ^^^^^^ help: use the corresponding method | -398 | for v in m.values_mut() { +338 | for v in m.values_mut() { | ^ ^^^^^^^^^^^^^^ error: you seem to want to iterate on a map's values - --> $DIR/for_loop.rs:403:19 + --> $DIR/for_loop.rs:343:19 | -403 | for (_, v) in &mut *m { +343 | for (_, v) in &mut *m { | ^^^^^^^ help: use the corresponding method | -403 | for v in (*m).values_mut() { +343 | for v in (*m).values_mut() { | ^ ^^^^^^^^^^^^^^^^^ error: you seem to want to iterate on a map's keys - --> $DIR/for_loop.rs:409:24 + --> $DIR/for_loop.rs:349:24 | -409 | for (k, _value) in rm { +349 | for (k, _value) in rm { | ^^ help: use the corresponding method | -409 | for k in rm.keys() { +349 | for k in rm.keys() { | ^ ^^^^^^^^^ error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:462:14 + --> $DIR/for_loop.rs:402:14 | -462 | for i in 0..src.len() { +402 | for i in 0..src.len() { | ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])` | = note: `-D clippy::manual-memcpy` implied by `-D warnings` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:467:14 + --> $DIR/for_loop.rs:407:14 | -467 | for i in 0..src.len() { +407 | for i in 0..src.len() { | ^^^^^^^^^^^^ help: try replacing the loop by: `dst[10..(src.len() + 10)].clone_from_slice(&src[..])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:472:14 + --> $DIR/for_loop.rs:412:14 | -472 | for i in 0..src.len() { +412 | for i in 0..src.len() { | ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[10..])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:477:14 + --> $DIR/for_loop.rs:417:14 | -477 | for i in 11..src.len() { +417 | for i in 11..src.len() { | ^^^^^^^^^^^^^ help: try replacing the loop by: `dst[11..src.len()].clone_from_slice(&src[(11 - 10)..(src.len() - 10)])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:482:14 + --> $DIR/for_loop.rs:422:14 | -482 | for i in 0..dst.len() { +422 | for i in 0..dst.len() { | ^^^^^^^^^^^^ help: try replacing the loop by: `dst.clone_from_slice(&src[..dst.len()])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:495:14 + --> $DIR/for_loop.rs:435:14 | -495 | for i in 10..256 { +435 | for i in 10..256 { | ^^^^^^^ help: try replacing the loop by | -495 | for i in dst[10..256].clone_from_slice(&src[(10 - 5)..(256 - 5)]) -496 | dst2[(10 + 500)..(256 + 500)].clone_from_slice(&src[10..256]) { +435 | for i in dst[10..256].clone_from_slice(&src[(10 - 5)..(256 - 5)]) +436 | dst2[(10 + 500)..(256 + 500)].clone_from_slice(&src[10..256]) { | error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:507:14 + --> $DIR/for_loop.rs:447:14 | -507 | for i in 10..LOOP_OFFSET { +447 | for i in 10..LOOP_OFFSET { | ^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[(10 + LOOP_OFFSET)..(LOOP_OFFSET + LOOP_OFFSET)].clone_from_slice(&src[(10 - some_var)..(LOOP_OFFSET - some_var)])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:520:14 + --> $DIR/for_loop.rs:460:14 | -520 | for i in 0..src_vec.len() { +460 | for i in 0..src_vec.len() { | ^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst_vec[..src_vec.len()].clone_from_slice(&src_vec[..])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:549:14 + --> $DIR/for_loop.rs:489:14 | -549 | for i in from..from + src.len() { +489 | for i in from..from + src.len() { | ^^^^^^^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + src.len()].clone_from_slice(&src[0..(from + src.len() - from)])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:553:14 + --> $DIR/for_loop.rs:493:14 | -553 | for i in from..from + 3 { +493 | for i in from..from + 3 { | ^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + 3].clone_from_slice(&src[0..(from + 3 - from)])` error: it looks like you're manually copying between slices - --> $DIR/for_loop.rs:560:14 + --> $DIR/for_loop.rs:500:14 | -560 | for i in 0..src.len() { +500 | for i in 0..src.len() { | ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])` -error: aborting due to 59 previous errors +error: aborting due to 51 previous errors diff --git a/tests/ui/for_loop_over_option_result.rs b/tests/ui/for_loop_over_option_result.rs new file mode 100644 index 0000000000000..37fd4e6d03851 --- /dev/null +++ b/tests/ui/for_loop_over_option_result.rs @@ -0,0 +1,68 @@ +// Copyright 2014-2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![warn(clippy::for_loop_over_option, clippy::for_loop_over_result)] + +/// Tests for_loop_over_result and for_loop_over_option + +fn for_loop_over_option_and_result() { + let option = Some(1); + let result = option.ok_or("x not found"); + let v = vec![0, 1, 2]; + + // check FOR_LOOP_OVER_OPTION lint + for x in option { + println!("{}", x); + } + + // check FOR_LOOP_OVER_RESULT lint + for x in result { + println!("{}", x); + } + + for x in option.ok_or("x not found") { + println!("{}", x); + } + + // make sure LOOP_OVER_NEXT lint takes clippy::precedence when next() is the last call + // in the chain + for x in v.iter().next() { + println!("{}", x); + } + + // make sure we lint when next() is not the last call in the chain + for x in v.iter().next().and(Some(0)) { + println!("{}", x); + } + + for x in v.iter().next().ok_or("x not found") { + println!("{}", x); + } + + // check for false positives + + // for loop false positive + for x in v { + println!("{}", x); + } + + // while let false positive for Option + while let Some(x) = option { + println!("{}", x); + break; + } + + // while let false positive for Result + while let Ok(x) = result { + println!("{}", x); + break; + } +} + +fn main() {} diff --git a/tests/ui/for_loop_over_option_result.stderr b/tests/ui/for_loop_over_option_result.stderr new file mode 100644 index 0000000000000..13ad5fff846da --- /dev/null +++ b/tests/ui/for_loop_over_option_result.stderr @@ -0,0 +1,72 @@ +error: for loop over `option`, which is an `Option`. This is more readably written as an `if let` statement. + --> $DIR/for_loop_over_option_result.rs:20:14 + | +20 | for x in option { + | ^^^^^^ + | + = note: `-D clippy::for-loop-over-option` implied by `-D warnings` + = help: consider replacing `for x in option` with `if let Some(x) = option` + +error: for loop over `result`, which is a `Result`. This is more readably written as an `if let` statement. + --> $DIR/for_loop_over_option_result.rs:25:14 + | +25 | for x in result { + | ^^^^^^ + | + = note: `-D clippy::for-loop-over-result` implied by `-D warnings` + = help: consider replacing `for x in result` with `if let Ok(x) = result` + +error: for loop over `option.ok_or("x not found")`, which is a `Result`. This is more readably written as an `if let` statement. + --> $DIR/for_loop_over_option_result.rs:29:14 + | +29 | for x in option.ok_or("x not found") { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: consider replacing `for x in option.ok_or("x not found")` with `if let Ok(x) = option.ok_or("x not found")` + +error: you are iterating over `Iterator::next()` which is an Option; this will compile but is probably not what you want + --> $DIR/for_loop_over_option_result.rs:35:14 + | +35 | for x in v.iter().next() { + | ^^^^^^^^^^^^^^^ + | + = note: #[deny(clippy::iter_next_loop)] on by default + +error: for loop over `v.iter().next().and(Some(0))`, which is an `Option`. This is more readably written as an `if let` statement. + --> $DIR/for_loop_over_option_result.rs:40:14 + | +40 | for x in v.iter().next().and(Some(0)) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: consider replacing `for x in v.iter().next().and(Some(0))` with `if let Some(x) = v.iter().next().and(Some(0))` + +error: for loop over `v.iter().next().ok_or("x not found")`, which is a `Result`. This is more readably written as an `if let` statement. + --> $DIR/for_loop_over_option_result.rs:44:14 + | +44 | for x in v.iter().next().ok_or("x not found") { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: consider replacing `for x in v.iter().next().ok_or("x not found")` with `if let Ok(x) = v.iter().next().ok_or("x not found")` + +error: this loop never actually loops + --> $DIR/for_loop_over_option_result.rs:56:5 + | +56 | / while let Some(x) = option { +57 | | println!("{}", x); +58 | | break; +59 | | } + | |_____^ + | + = note: #[deny(clippy::never_loop)] on by default + +error: this loop never actually loops + --> $DIR/for_loop_over_option_result.rs:62:5 + | +62 | / while let Ok(x) = result { +63 | | println!("{}", x); +64 | | break; +65 | | } + | |_____^ + +error: aborting due to 8 previous errors +