diff options
| author | bors <bors@rust-lang.org> | 2021-04-27 13:44:51 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-04-27 13:44:51 +0000 |
| commit | 9af07e65aa3f9f7bf753341fc04f42bcbc43c67e (patch) | |
| tree | 39577f1b2dc0ea55d33f2cf085856f0bccdc7a94 | |
| parent | 0a330e682410a2b52f31e3f0ee5e6738b7a2227d (diff) | |
| parent | d7627dcfc8a60aaedccf002738dc44a2576fa8fd (diff) | |
| download | rust-9af07e65aa3f9f7bf753341fc04f42bcbc43c67e.tar.gz rust-9af07e65aa3f9f7bf753341fc04f42bcbc43c67e.zip | |
Auto merge of #7138 - mgacek8:issue6808_iter_cloned_collect_FN_with_large_array, r=Manishearth
Fix FN in `iter_cloned_collect` with a large array fixes #6808 changelog: Fix FN in `iter_cloned_collect` with a large array I spotted that [is_iterable_array](https://github.com/rust-lang/rust-clippy/blob/a362a4d1d0edb66aef186c1d27b28c60573078f4/clippy_lints/src/loops/explicit_iter_loop.rs#L67-L75) function that `explicit_iter_loop` lint is using only works for array sizes <= 32. There is this comment: > IntoIterator is currently only implemented for array sizes <= 32 in rustc I'm a bit confused, because I read that [IntoIterator for arrays](https://doc.rust-lang.org/src/core/array/mod.rs.html#194-201) with const generic `N` is stable since = "1.0.0". Although Const Generics MVP were stabilized in Rust 1.51. Should I set MSRV for the current change? I will try to test with older compilers soon.
| -rw-r--r-- | clippy_lints/src/methods/utils.rs | 4 | ||||
| -rw-r--r-- | tests/ui/iter_cloned_collect.fixed | 4 | ||||
| -rw-r--r-- | tests/ui/iter_cloned_collect.rs | 4 | ||||
| -rw-r--r-- | tests/ui/iter_cloned_collect.stderr | 8 |
4 files changed, 16 insertions, 4 deletions
diff --git a/clippy_lints/src/methods/utils.rs b/clippy_lints/src/methods/utils.rs index f6bf37e08b9..0daea47816a 100644 --- a/clippy_lints/src/methods/utils.rs +++ b/clippy_lints/src/methods/utils.rs @@ -18,9 +18,7 @@ pub(super) fn derefs_to_slice<'tcx>( ty::Slice(_) => true, ty::Adt(def, _) if def.is_box() => may_slice(cx, ty.boxed_ty()), ty::Adt(..) => is_type_diagnostic_item(cx, ty, sym::vec_type), - ty::Array(_, size) => size - .try_eval_usize(cx.tcx, cx.param_env) - .map_or(false, |size| size < 32), + ty::Array(_, size) => size.try_eval_usize(cx.tcx, cx.param_env).is_some(), ty::Ref(_, inner, _) => may_slice(cx, inner), _ => false, } diff --git a/tests/ui/iter_cloned_collect.fixed b/tests/ui/iter_cloned_collect.fixed index 2773227e26b..39cc58cd298 100644 --- a/tests/ui/iter_cloned_collect.fixed +++ b/tests/ui/iter_cloned_collect.fixed @@ -19,4 +19,8 @@ fn main() { let _: Vec<u8> = std::ffi::CStr::from_ptr(std::ptr::null()) .to_bytes().to_vec(); } + + // Issue #6808 + let arr: [u8; 64] = [0; 64]; + let _: Vec<_> = arr.to_vec(); } diff --git a/tests/ui/iter_cloned_collect.rs b/tests/ui/iter_cloned_collect.rs index 60a4eac23c7..c2a036ec09f 100644 --- a/tests/ui/iter_cloned_collect.rs +++ b/tests/ui/iter_cloned_collect.rs @@ -22,4 +22,8 @@ fn main() { .cloned() .collect(); } + + // Issue #6808 + let arr: [u8; 64] = [0; 64]; + let _: Vec<_> = arr.iter().cloned().collect(); } diff --git a/tests/ui/iter_cloned_collect.stderr b/tests/ui/iter_cloned_collect.stderr index b90a1e6c919..e1df61794ce 100644 --- a/tests/ui/iter_cloned_collect.stderr +++ b/tests/ui/iter_cloned_collect.stderr @@ -22,5 +22,11 @@ LL | | .cloned() LL | | .collect(); | |______________________^ help: try: `.to_vec()` -error: aborting due to 3 previous errors +error: called `iter().cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable + --> $DIR/iter_cloned_collect.rs:28:24 + | +LL | let _: Vec<_> = arr.iter().cloned().collect(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `.to_vec()` + +error: aborting due to 4 previous errors |
