Skip to content

Crash when calling bytes::Bytes::from_static with compile time evaluated size inside futures::stream::unfold #11939

Closed
@mikonieminen

Description

@mikonieminen

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}>

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingI-ICEIssue: Clippy panicked, giving an Internal Compilation Error (ICE) ❄️

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions