Skip to content

Improve slow_vector_initialization suggestion #13912

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions clippy_lints/src/slow_vector_initialization.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::macros::matching_root_macro_call;
use clippy_utils::sugg::Sugg;
use clippy_utils::{
Expand Down Expand Up @@ -203,14 +203,18 @@ impl SlowVectorInit {
"len",
);

span_lint_and_then(cx, SLOW_VECTOR_INITIALIZATION, slow_fill.span, msg, |diag| {
diag.span_suggestion(
vec_alloc.allocation_expr.span.source_callsite(),
"consider replacing this with",
format!("vec![0; {len_expr}]"),
Applicability::Unspecified,
);
});
let span_to_replace = slow_fill
.span
.with_lo(vec_alloc.allocation_expr.span.source_callsite().lo());
span_lint_and_sugg(
cx,
SLOW_VECTOR_INITIALIZATION,
span_to_replace,
msg,
"consider replacing this with",
format!("vec![0; {len_expr}]"),
Applicability::Unspecified,
);
}
}

Expand Down
26 changes: 13 additions & 13 deletions tests/ui/slow_vector_initialization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@ fn extend_vector() {
// Extend with constant expression
let len = 300;
let mut vec1 = Vec::with_capacity(len);
vec1.extend(repeat(0).take(len));
//~^ ERROR: slow zero-filling initialization
//~| NOTE: `-D clippy::slow-vector-initialization` implied by `-D warnings`
vec1.extend(repeat(0).take(len));

// Extend with len expression
let mut vec2 = Vec::with_capacity(len - 10);
vec2.extend(repeat(0).take(len - 10));
//~^ ERROR: slow zero-filling initialization
vec2.extend(repeat(0).take(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::with_capacity(len);
vec4.extend(repeat(0).take(vec4.capacity()));
//~^ ERROR: slow zero-filling initialization
vec4.extend(repeat(0).take(vec4.capacity()));
}

fn mixed_extend_resize_vector() {
Expand All @@ -36,60 +36,60 @@ fn mixed_extend_resize_vector() {

// Slow initialization
let mut resized_vec = Vec::with_capacity(30);
resized_vec.resize(30, 0);
//~^ ERROR: slow zero-filling initialization
resized_vec.resize(30, 0);

let mut extend_vec = Vec::with_capacity(30);
extend_vec.extend(repeat(0).take(30));
//~^ ERROR: slow zero-filling initialization
extend_vec.extend(repeat(0).take(30));
}

fn resize_vector() {
// Resize with constant expression
let len = 300;
let mut vec1 = Vec::with_capacity(len);
vec1.resize(len, 0);
//~^ ERROR: slow zero-filling initialization
vec1.resize(len, 0);

// Resize mismatch len
let mut vec2 = Vec::with_capacity(200);
vec2.resize(10, 0);

// Resize with len expression
let mut vec3 = Vec::with_capacity(len - 10);
vec3.resize(len - 10, 0);
//~^ ERROR: slow zero-filling initialization
vec3.resize(len - 10, 0);

let mut vec4 = Vec::with_capacity(len);
vec4.resize(vec4.capacity(), 0);
//~^ ERROR: slow zero-filling initialization
vec4.resize(vec4.capacity(), 0);

// Reinitialization should be warned
vec1 = Vec::with_capacity(10);
vec1.resize(10, 0);
//~^ ERROR: slow zero-filling initialization
vec1.resize(10, 0);
}

fn from_empty_vec() {
// Resize with constant expression
let len = 300;
let mut vec1 = Vec::new();
vec1.resize(len, 0);
//~^ ERROR: slow zero-filling initialization
vec1.resize(len, 0);

// Resize with len expression
let mut vec3 = Vec::new();
vec3.resize(len - 10, 0);
//~^ ERROR: slow zero-filling initialization
vec3.resize(len - 10, 0);

// Reinitialization should be warned
vec1 = Vec::new();
vec1.resize(10, 0);
//~^ ERROR: slow zero-filling initialization
vec1.resize(10, 0);

vec1 = vec![];
vec1.resize(10, 0);
//~^ ERROR: slow zero-filling initialization
vec1.resize(10, 0);

macro_rules! x {
() => {
Expand Down
143 changes: 78 additions & 65 deletions tests/ui/slow_vector_initialization.stderr
Original file line number Diff line number Diff line change
@@ -1,109 +1,122 @@
error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:14:5
--> tests/ui/slow_vector_initialization.rs:13:20
|
LL | let mut vec1 = Vec::with_capacity(len);
| ----------------------- help: consider replacing this with: `vec![0; len]`
LL | vec1.extend(repeat(0).take(len));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut vec1 = Vec::with_capacity(len);
| ____________________^
... |
LL | | vec1.extend(repeat(0).take(len));
| |____________________________________^ help: consider replacing this with: `vec![0; len]`
|
= note: `-D clippy::slow-vector-initialization` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::slow_vector_initialization)]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:20:5
--> tests/ui/slow_vector_initialization.rs:19:20
|
LL | let mut vec2 = Vec::with_capacity(len - 10);
| ---------------------------- help: consider replacing this with: `vec![0; len - 10]`
LL | vec2.extend(repeat(0).take(len - 10));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut vec2 = Vec::with_capacity(len - 10);
| ____________________^
LL | |
LL | | vec2.extend(repeat(0).take(len - 10));
| |_________________________________________^ help: consider replacing this with: `vec![0; len - 10]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:28:5
--> tests/ui/slow_vector_initialization.rs:27:20
|
LL | let mut vec4 = Vec::with_capacity(len);
| ----------------------- help: consider replacing this with: `vec![0; len]`
LL | vec4.extend(repeat(0).take(vec4.capacity()));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut vec4 = Vec::with_capacity(len);
| ____________________^
LL | |
LL | | vec4.extend(repeat(0).take(vec4.capacity()));
| |________________________________________________^ help: consider replacing this with: `vec![0; len]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:39:5
--> tests/ui/slow_vector_initialization.rs:38:27
|
LL | let mut resized_vec = Vec::with_capacity(30);
| ---------------------- help: consider replacing this with: `vec![0; 30]`
LL | resized_vec.resize(30, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut resized_vec = Vec::with_capacity(30);
| ___________________________^
LL | |
LL | | resized_vec.resize(30, 0);
| |_____________________________^ help: consider replacing this with: `vec![0; 30]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:43:5
--> tests/ui/slow_vector_initialization.rs:42:26
|
LL | let mut extend_vec = Vec::with_capacity(30);
| ---------------------- help: consider replacing this with: `vec![0; 30]`
LL | extend_vec.extend(repeat(0).take(30));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut extend_vec = Vec::with_capacity(30);
| __________________________^
LL | |
LL | | extend_vec.extend(repeat(0).take(30));
| |_________________________________________^ help: consider replacing this with: `vec![0; 30]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:51:5
--> tests/ui/slow_vector_initialization.rs:50:20
|
LL | let mut vec1 = Vec::with_capacity(len);
| ----------------------- help: consider replacing this with: `vec![0; len]`
LL | vec1.resize(len, 0);
| ^^^^^^^^^^^^^^^^^^^
LL | let mut vec1 = Vec::with_capacity(len);
| ____________________^
LL | |
LL | | vec1.resize(len, 0);
| |_______________________^ help: consider replacing this with: `vec![0; len]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:60:5
--> tests/ui/slow_vector_initialization.rs:59:20
|
LL | let mut vec3 = Vec::with_capacity(len - 10);
| ---------------------------- help: consider replacing this with: `vec![0; len - 10]`
LL | vec3.resize(len - 10, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut vec3 = Vec::with_capacity(len - 10);
| ____________________^
LL | |
LL | | vec3.resize(len - 10, 0);
| |____________________________^ help: consider replacing this with: `vec![0; len - 10]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:64:5
--> tests/ui/slow_vector_initialization.rs:63:20
|
LL | let mut vec4 = Vec::with_capacity(len);
| ----------------------- help: consider replacing this with: `vec![0; len]`
LL | vec4.resize(vec4.capacity(), 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut vec4 = Vec::with_capacity(len);
| ____________________^
LL | |
LL | | vec4.resize(vec4.capacity(), 0);
| |___________________________________^ help: consider replacing this with: `vec![0; len]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:69:5
--> tests/ui/slow_vector_initialization.rs:68:12
|
LL | vec1 = Vec::with_capacity(10);
| ---------------------- help: consider replacing this with: `vec![0; 10]`
LL | vec1.resize(10, 0);
| ^^^^^^^^^^^^^^^^^^
LL | vec1 = Vec::with_capacity(10);
| ____________^
LL | |
LL | | vec1.resize(10, 0);
| |______________________^ help: consider replacing this with: `vec![0; 10]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:77:5
--> tests/ui/slow_vector_initialization.rs:76:20
|
LL | let mut vec1 = Vec::new();
| ---------- help: consider replacing this with: `vec![0; len]`
LL | vec1.resize(len, 0);
| ^^^^^^^^^^^^^^^^^^^
LL | let mut vec1 = Vec::new();
| ____________________^
LL | |
LL | | vec1.resize(len, 0);
| |_______________________^ help: consider replacing this with: `vec![0; len]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:82:5
--> tests/ui/slow_vector_initialization.rs:81:20
|
LL | let mut vec3 = Vec::new();
| ---------- help: consider replacing this with: `vec![0; len - 10]`
LL | vec3.resize(len - 10, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^
LL | let mut vec3 = Vec::new();
| ____________________^
LL | |
LL | | vec3.resize(len - 10, 0);
| |____________________________^ help: consider replacing this with: `vec![0; len - 10]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:87:5
--> tests/ui/slow_vector_initialization.rs:86:12
|
LL | vec1 = Vec::new();
| ---------- help: consider replacing this with: `vec![0; 10]`
LL | vec1.resize(10, 0);
| ^^^^^^^^^^^^^^^^^^
LL | vec1 = Vec::new();
| ____________^
LL | |
LL | | vec1.resize(10, 0);
| |______________________^ help: consider replacing this with: `vec![0; 10]`

error: slow zero-filling initialization
--> tests/ui/slow_vector_initialization.rs:91:5
--> tests/ui/slow_vector_initialization.rs:90:12
|
LL | vec1 = vec![];
| ------ help: consider replacing this with: `vec![0; 10]`
LL | vec1.resize(10, 0);
| ^^^^^^^^^^^^^^^^^^
LL | vec1 = vec![];
| ____________^
LL | |
LL | | vec1.resize(10, 0);
| |______________________^ help: consider replacing this with: `vec![0; 10]`

error: aborting due to 13 previous errors

Loading