Skip to content
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

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

Closed
mikonieminen opened this issue Dec 9, 2023 · 0 comments · Fixed by #11977
Labels
C-bug Category: Clippy is not doing the correct thing I-ICE Issue: Clippy panicked, giving an Internal Compilation Error (ICE) ❄️

Comments

@mikonieminen
Copy link

mikonieminen commented Dec 9, 2023

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

@mikonieminen mikonieminen added C-bug Category: Clippy is not doing the correct thing I-ICE Issue: Clippy panicked, giving an Internal Compilation Error (ICE) ❄️ labels Dec 9, 2023
@bors bors closed this as completed in fff484d Dec 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: Clippy is not doing the correct thing I-ICE Issue: Clippy panicked, giving an Internal Compilation Error (ICE) ❄️
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant