Skip to content

Commit

Permalink
[slow_vector_initialization]: only warn on vec![] expn
Browse files Browse the repository at this point in the history
  • Loading branch information
y21 committed Sep 2, 2023
1 parent 78983d9 commit 5120632
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 3 deletions.
10 changes: 10 additions & 0 deletions clippy_lints/src/slow_vector_initialization.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::macros::root_macro_call;
use clippy_utils::sugg::Sugg;
use clippy_utils::{
get_enclosing_block, is_expr_path_def_path, is_integer_literal, is_path_diagnostic_item, path_to_local,
Expand Down Expand Up @@ -148,6 +149,15 @@ impl SlowVectorInit {
/// - `Some(InitializedSize::Uninitialized)` for `Vec::new()`
/// - `None` for other, unrelated kinds of expressions
fn as_vec_initializer<'tcx>(cx: &LateContext<'_>, expr: &'tcx Expr<'tcx>) -> Option<InitializedSize<'tcx>> {
// Generally don't warn if the vec initializer comes from an expansion, except for the vec! macro.
// This lets us still warn on `vec![]`, while ignoring other kinds of macros that may output an
// empty vec
if expr.span.from_expansion()
&& root_macro_call(expr.span).map(|m| m.def_id) != cx.tcx.get_diagnostic_item(sym::vec_macro)
{
return None;
}

if let ExprKind::Call(func, [len_expr]) = expr.kind
&& is_expr_path_def_path(cx, func, &paths::VEC_WITH_CAPACITY)
{
Expand Down
16 changes: 15 additions & 1 deletion tests/ui/slow_vector_initialization.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use std::iter::repeat;
//@no-rustfix
use std::iter::repeat;
fn main() {
resize_vector();
extend_vector();
Expand Down Expand Up @@ -86,6 +86,20 @@ fn from_empty_vec() {
vec1 = Vec::new();
vec1.resize(10, 0);
//~^ ERROR: slow zero-filling initialization

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

macro_rules! x {
() => {
vec![]
};
}

// `vec![]` comes from another macro, don't warn
vec1 = x!();
vec1.resize(10, 0);
}

fn do_stuff(vec: &mut [u8]) {}
Expand Down
12 changes: 10 additions & 2 deletions tests/ui/slow_vector_initialization.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,21 @@ LL | vec1 = Vec::new();
LL | vec1.resize(10, 0);
| ^^^^^^^^^^^^^^^^^^

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

error: this argument is a mutable reference, but not used mutably
--> $DIR/slow_vector_initialization.rs:91:18
--> $DIR/slow_vector_initialization.rs:105:18
|
LL | fn do_stuff(vec: &mut [u8]) {}
| ^^^^^^^^^ help: consider changing to: `&[u8]`
|
= note: `-D clippy::needless-pass-by-ref-mut` implied by `-D warnings`

error: aborting due to 13 previous errors
error: aborting due to 14 previous errors

0 comments on commit 5120632

Please sign in to comment.