about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorAlejandra González <blyxyas@gmail.com>2025-01-13 15:12:01 +0000
committerGitHub <noreply@github.com>2025-01-13 15:12:01 +0000
commitdcbe3adc4bfeb0e41bbe24d75114f28d8efbb0d7 (patch)
treec91ca641b5338f39c0e6cd816a65c6bea3129ff6 /tests
parent0db64118ca92701e72c15c76d1157329cd2dd120 (diff)
parent39269aaaae12e3f50265b0a4cd17ecd90831b910 (diff)
downloadrust-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.fixed85
-rw-r--r--tests/ui/slow_vector_initialization.rs2
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();