Skip to content

Commit

Permalink
Fix large_stack_arrays triggering when nesting const items
Browse files Browse the repository at this point in the history
  • Loading branch information
GnomedDev committed Oct 10, 2024
1 parent 5840f78 commit 87b4c1f
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 17 deletions.
12 changes: 7 additions & 5 deletions clippy_lints/src/large_stack_arrays.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::num::Saturating;

use clippy_config::Conf;
use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::is_from_proc_macro;
Expand Down Expand Up @@ -30,15 +32,15 @@ declare_clippy_lint! {
pub struct LargeStackArrays {
maximum_allowed_size: u64,
prev_vec_macro_callsite: Option<Span>,
is_in_const_item: bool,
const_item_counter: Saturating<u16>,
}

impl LargeStackArrays {
pub fn new(conf: &'static Conf) -> Self {
Self {
maximum_allowed_size: conf.array_size_threshold,
prev_vec_macro_callsite: None,
is_in_const_item: false,
const_item_counter: Saturating(0),
}
}

Expand All @@ -64,18 +66,18 @@ impl_lint_pass!(LargeStackArrays => [LARGE_STACK_ARRAYS]);
impl<'tcx> LateLintPass<'tcx> for LargeStackArrays {
fn check_item(&mut self, _: &LateContext<'tcx>, item: &'tcx Item<'tcx>) {
if matches!(item.kind, ItemKind::Static(..) | ItemKind::Const(..)) {
self.is_in_const_item = true;
self.const_item_counter += 1;
}
}

fn check_item_post(&mut self, _: &LateContext<'tcx>, item: &'tcx Item<'tcx>) {
if matches!(item.kind, ItemKind::Static(..) | ItemKind::Const(..)) {
self.is_in_const_item = false;
self.const_item_counter -= 1;
}
}

fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &Expr<'tcx>) {
if !self.is_in_const_item
if self.const_item_counter.0 == 0
&& let ExprKind::Repeat(_, _) | ExprKind::Array(_) = expr.kind
&& !self.is_from_vec_macro(cx, expr.span)
&& let ty::Array(element_type, cst) = cx.typeck_results().expr_ty(expr).kind()
Expand Down
5 changes: 5 additions & 0 deletions tests/ui/large_stack_arrays.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ enum E {
}

const STATIC_PROMOTED_LARGE_ARRAY: &[u8; 512001] = &[0; 512001];
const STATIC_PROMOTED_LARGE_ARRAY_WITH_NESTED: &[u8; 512001] = {
const NESTED: () = ();
&[0; 512001]
};

pub static DOESNOTLINT: [u8; 512_001] = [0; 512_001];
pub static DOESNOTLINT2: [u8; 512_001] = {
let x = 0;
Expand Down
24 changes: 12 additions & 12 deletions tests/ui/large_stack_arrays.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:33:14
--> tests/ui/large_stack_arrays.rs:38:14
|
LL | let _x = [build(); 3];
| ^^^^^^^^^^^^
Expand All @@ -9,63 +9,63 @@ LL | let _x = [build(); 3];
= help: to override `-D warnings` add `#[allow(clippy::large_stack_arrays)]`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:36:14
--> tests/ui/large_stack_arrays.rs:41:14
|
LL | let _y = [build(), build(), build()];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![build(), build(), build()].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:42:9
--> tests/ui/large_stack_arrays.rs:47:9
|
LL | [0u32; 20_000_000],
| ^^^^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![0u32; 20_000_000].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:44:9
--> tests/ui/large_stack_arrays.rs:49:9
|
LL | [S { data: [0; 32] }; 5000],
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![S { data: [0; 32] }; 5000].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:46:9
--> tests/ui/large_stack_arrays.rs:51:9
|
LL | [Some(""); 20_000_000],
| ^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![Some(""); 20_000_000].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:48:9
--> tests/ui/large_stack_arrays.rs:53:9
|
LL | [E::T(0); 5000],
| ^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![E::T(0); 5000].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:50:9
--> tests/ui/large_stack_arrays.rs:55:9
|
LL | [0u8; usize::MAX],
| ^^^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![0u8; usize::MAX].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:94:13
--> tests/ui/large_stack_arrays.rs:99:13
|
LL | let y = [x, x, dummy!(x), x, x];
| ^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![x, x, dummy!(x), x, x].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:71:13
--> tests/ui/large_stack_arrays.rs:76:13
|
LL | [$a, $b, $a, $b]
| ^^^^^^^^^^^^^^^^
Expand All @@ -76,21 +76,21 @@ LL | let y = dummy![x => x];
= note: this error originates in the macro `dummy` (in Nightly builds, run with -Z macro-backtrace for more info)

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:99:20
--> tests/ui/large_stack_arrays.rs:104:20
|
LL | let y = dummy![[x, x, x, x, x]];
| ^^^^^^^^^^^^^^^
|
= help: consider allocating on the heap with `vec![x, x, x, x, x].into_boxed_slice()`

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:102:39
--> tests/ui/large_stack_arrays.rs:107:39
|
LL | let y = proc_macros::make_it_big!([x; 1]);
| ^^^^^^

error: allocating a local array larger than 16384 bytes
--> tests/ui/large_stack_arrays.rs:83:23
--> tests/ui/large_stack_arrays.rs:88:23
|
LL | let _x_ = [$id; $n];
| ^^^^^^^^^
Expand Down

0 comments on commit 87b4c1f

Please sign in to comment.