diff options
| author | Alejandra González <blyxyas@gmail.com> | 2025-01-13 15:12:01 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-13 15:12:01 +0000 |
| commit | dcbe3adc4bfeb0e41bbe24d75114f28d8efbb0d7 (patch) | |
| tree | c91ca641b5338f39c0e6cd816a65c6bea3129ff6 /tests | |
| parent | 0db64118ca92701e72c15c76d1157329cd2dd120 (diff) | |
| parent | 39269aaaae12e3f50265b0a4cd17ecd90831b910 (diff) | |
| download | rust-dcbe3adc4bfeb0e41bbe24d75114f28d8efbb0d7.tar.gz rust-dcbe3adc4bfeb0e41bbe24d75114f28d8efbb0d7.zip | |
auto-fix `slow_vector_initialization` in some cases (#13947)
changelog: [`slow_vector_initialization`]: auto-fix when appropriate I made a change for `slow_vector_initialization` lint suggestion to use `vec!` with size and remove the unneeded `resize` (or similar one) call in #13912, while only the former one was suggested in the previous implementation. Now, I think this lint can be automatically fixed with no unnecessary code in some cases. I wrote “in some cases” because if there are comments between vector declaration and `resize`, Clippy shouldn't apply auto-fix because the comment may informational.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ui/slow_vector_initialization.fixed | 85 | ||||
| -rw-r--r-- | tests/ui/slow_vector_initialization.rs | 2 |
2 files changed, 86 insertions, 1 deletions
diff --git a/tests/ui/slow_vector_initialization.fixed b/tests/ui/slow_vector_initialization.fixed new file mode 100644 index 00000000000..8c16bb307ca --- /dev/null +++ b/tests/ui/slow_vector_initialization.fixed @@ -0,0 +1,85 @@ +#![allow(clippy::useless_vec)] +use std::iter::repeat; +fn main() { + resize_vector(); + extend_vector(); + mixed_extend_resize_vector(); + from_empty_vec(); +} + +fn extend_vector() { + // Extend with constant expression + let len = 300; + let mut vec1 = vec![0; len]; + + // Extend with len expression + let mut vec2 = vec![0; len - 10]; + + // Extend with mismatching expression should not be warned + let mut vec3 = Vec::with_capacity(24322); + vec3.extend(repeat(0).take(2)); + + let mut vec4 = vec![0; len]; +} + +fn mixed_extend_resize_vector() { + // Mismatching len + let mut mismatching_len = Vec::with_capacity(30); + mismatching_len.extend(repeat(0).take(40)); + + // Slow initialization + let mut resized_vec = vec![0; 30]; + + let mut extend_vec = vec![0; 30]; +} + +fn resize_vector() { + // Resize with constant expression + let len = 300; + let mut vec1 = vec![0; len]; + + // Resize mismatch len + let mut vec2 = Vec::with_capacity(200); + vec2.resize(10, 0); + + // Resize with len expression + let mut vec3 = vec![0; len - 10]; + + let mut vec4 = vec![0; len]; + + // Reinitialization should be warned + vec1 = vec![0; 10]; +} + +fn from_empty_vec() { + // Resize with constant expression + let len = 300; + let mut vec1 = vec![0; len]; + + // Resize with len expression + let mut vec3 = vec![0; len - 10]; + + // Reinitialization should be warned + vec1 = vec![0; 10]; + + vec1 = vec![0; 10]; + + macro_rules! x { + () => { + vec![] + }; + } + + // `vec![]` comes from another macro, don't warn + vec1 = x!(); + vec1.resize(10, 0); +} + +fn do_stuff(vec: &mut [u8]) {} + +fn extend_vector_with_manipulations_between() { + let len = 300; + let mut vec1: Vec<u8> = Vec::with_capacity(len); + do_stuff(&mut vec1); + vec1.extend(repeat(0).take(len)); +} diff --git a/tests/ui/slow_vector_initialization.rs b/tests/ui/slow_vector_initialization.rs index 2ba87f41250..6831dad70b4 100644 --- a/tests/ui/slow_vector_initialization.rs +++ b/tests/ui/slow_vector_initialization.rs @@ -1,4 +1,4 @@ -//@no-rustfix +#![allow(clippy::useless_vec)] use std::iter::repeat; fn main() { resize_vector(); |
