Closed
Description
Summary
Clippy crashes when calling bytes::Bytes::from_static
with computed slice size and when the code is inside futures::stream::unfold
.
Test case code that reproduces the issue with alternatives that work:
// src/lib.rs
//
// Cargo.toml
// ```
// [package]
// name = "clippy-crash"
// version = "0.1.0"
// edition = "2021"
//
// [dev-dependencies]
// bytes = "1.5.0"
// futures = "0.3.29"
// ```
//
// To see the crash, run
// ```
// cargo clippy --tests
// ```
#[cfg(test)]
mod tests {
use bytes::Bytes;
#[test]
fn clippy_ok_when_initializing_outside_async_block() {
let _chunk = Bytes::from_static(&[0; 256 * 1024]);
}
#[test]
fn clippy_ok_when_initializing_inside_async_block() {
#[allow(clippy::let_underscore_future)]
let _ = async move {
Bytes::from_static(&[0; 256 * 1024])
};
}
#[test]
fn clippy_ok_when_initializing_bytes_from_static_with_const_size_inside_futures_stream_unfold() {
const CHUNK_SIZE: usize = 256 * 1024;
let _ = futures::stream::unfold(0, |counter| async move {
if counter < 1 {
let chunk = Bytes::from_static(&[0; CHUNK_SIZE]);
Some((chunk, counter + 1))
} else {
None
}
});
}
#[test]
fn clippy_ok_when_initializing_bytes_from_vec_inside_futures_stream_unfold() {
let _ = futures::stream::unfold(0, |counter| async move {
if counter < 1 {
let chunk = Bytes::from(vec![0u8; 256]);
Some((chunk, counter + 1))
} else {
None
}
});
}
#[test]
fn clippy_crash_when_initializing_bytes_from_static_with_evaluated_size_inside_futures_stream_unfold() {
let _ = futures::stream::unfold(0, |counter| async move {
if counter < 1 {
// The following will crash clippy at least with
// `stable-x86_64-unknown-linux-gnu - rustc 1.74.0`
// and
// `stable-x86_64-unknown-linux-gnu - rustc 1.74.1`
let chunk = Bytes::from_static(&[0; 256 * 1024]);
Some((chunk, counter + 1))
} else {
None
}
});
}
}
Version
rustc 1.74.1 (a28077b28 2023-12-04)
binary: rustc
commit-hash: a28077b28a02b92985b3a3faecf92813155f1ea1
commit-date: 2023-12-04
host: x86_64-unknown-linux-gnu
release: 1.74.1
LLVM version: 17.0.4
Error output
Backtrace
error: internal compiler error: compiler/rustc_middle/src/ty/typeck_results.rs:308:13: node_type: no type for node HirId(DefId(0:33 ~ clippy_crash[aede]::tests::clippy_crash_when_initializing_bytes_from_static_with_evaluated_size_inside_futures_stream_unfold#1).32) (expr `256`)
thread 'rustc' panicked at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/compiler/rustc_errors/src/lib.rs:1651:9:
Box<dyn Any>
stack backtrace:
0: std::panicking::begin_panic::<rustc_errors::ExplicitBug>
1: <rustc_errors::HandlerInner>::bug::<alloc::string::String>
2: <rustc_errors::Handler>::bug::<alloc::string::String>
3: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>::{closure#0}
4: rustc_middle::ty::context::tls::with_opt::<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>::{closure#0}, !>::{closure#0}
5: rustc_middle::ty::context::tls::with_context_opt::<rustc_middle::ty::context::tls::with_opt<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
6: rustc_middle::util::bug::bug_fmt
7: <rustc_middle::ty::typeck_results::TypeckResults>::expr_ty
8: <clippy_utils::visitors::is_const_evaluatable::V as rustc_hir::intravisit::Visitor>::visit_expr
9: rustc_hir::intravisit::walk_expr::<clippy_utils::visitors::is_const_evaluatable::V>
10: rustc_hir::intravisit::walk_expr::<clippy_utils::visitors::is_const_evaluatable::V>
11: <clippy_utils::eager_or_lazy::expr_eagerness::V as rustc_hir::intravisit::Visitor>::visit_expr
12: rustc_hir::intravisit::walk_local::<clippy_utils::eager_or_lazy::expr_eagerness::V>
13: rustc_hir::intravisit::walk_expr::<clippy_utils::eager_or_lazy::expr_eagerness::V>
14: <clippy_utils::eager_or_lazy::expr_eagerness::V as rustc_hir::intravisit::Visitor>::visit_expr
15: rustc_hir::intravisit::walk_expr::<clippy_utils::eager_or_lazy::expr_eagerness::V>
16: <clippy_utils::eager_or_lazy::expr_eagerness::V as rustc_hir::intravisit::Visitor>::visit_expr
17: clippy_utils::eager_or_lazy::switch_to_eager_eval
18: <clippy_lints::if_then_some_else_none::IfThenSomeElseNone as rustc_lint::passes::LateLintPass>::check_expr
19: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}
20: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_block
21: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}
22: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_body
23: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_fn
24: rustc_hir::intravisit::walk_expr::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
25: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}
26: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_body
27: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_fn
28: rustc_hir::intravisit::walk_expr::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
29: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}
30: rustc_hir::intravisit::walk_expr::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
31: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}
32: rustc_hir::intravisit::walk_local::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
33: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_local
34: rustc_hir::intravisit::walk_block::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
35: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_block
36: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}
37: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_body
38: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_fn
39: rustc_hir::intravisit::walk_item::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
40: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_item
41: rustc_hir::intravisit::walk_mod::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
42: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_item
43: rustc_hir::intravisit::walk_mod::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
44: rustc_lint::late::late_lint_crate
45: <rustc_session::session::Session>::time::<(), rustc_lint::late::check_crate::{closure#0}::{closure#0}>
46: <rustc_data_structures::sync::parallel::ParallelGuard>::run::<(), rustc_lint::late::check_crate::{closure#0}>
47: rustc_data_structures::sync::parallel::disabled::join::<rustc_lint::late::check_crate::{closure#0}, rustc_lint::late::check_crate::{closure#1}, (), ()>
48: <rustc_session::session::Session>::time::<(), rustc_interface::passes::analysis::{closure#6}::{closure#1}::{closure#0}::{closure#0}::{closure#2}::{closure#0}>
49: <rustc_data_structures::sync::parallel::ParallelGuard>::run::<(), rustc_interface::passes::analysis::{closure#6}::{closure#1}::{closure#0}::{closure#0}::{closure#2}>
50: <core::panic::unwind_safe::AssertUnwindSafe<rustc_interface::passes::analysis::{closure#6}::{closure#1}::{closure#0}> as core::ops::function::FnOnce<()>>::call_once
51: <rustc_session::session::Session>::time::<(), rustc_interface::passes::analysis::{closure#6}>
52: rustc_interface::passes::analysis
[... omitted 2 frames ...]
53: <rustc_middle::ty::context::GlobalCtxt>::enter::<rustc_driver_impl::run_compiler::{closure#1}::{closure#2}::{closure#6}, core::result::Result<(), rustc_span::ErrorGuaranteed>>
54: rustc_span::set_source_map::<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_interface::interface::run_compiler<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#1}>::{closure#0}::{closure#0}>