Skip to content

ICE calling an unsafe function pointer retrieved from a trait associated constant #10367

@yvt

Description

@yvt

Summary

The following code (Playground) causes an ICE in Clippy:

pub trait Tr {
    const A: unsafe fn();
}

pub fn hoge<T: Tr>() {
    unsafe { (T::A)() };
}
A real-world example

Version

rustc 1.69.0-nightly (2d14db321 2023-02-15)
binary: rustc
commit-hash: 2d14db321b043ffc579a7461464c88d7e3f54f83
commit-date: 2023-02-15
host: aarch64-apple-darwin
release: 1.69.0-nightly
LLVM version: 15.0.7

Error output

Backtrace

error: internal compiler error: compiler/rustc_hir_analysis/src/collect.rs:1176:13: unexpected sort of node in fn_sig(): TraitItem(TraitItem { ident: A#0, owner_id: DefId(0:4 ~ bbb[785b]::Tr::A), generics: Generics { params: [], predicates: [], has_where_clause_predicates: false, where_clause_span: no-location (#0), span: no-location (#0) }, kind: Const(Ty { hir_id: HirId(DefId(0:4 ~ bbb[785b]::Tr::A).1), kind: BareFn(BareFnTy { unsafety: Unsafe, abi: Rust, generic_params: [], decl: FnDecl { inputs: [], output: DefaultReturn(src/lib.rs:2:25: 2:25 (#0)), c_variadic: false, implicit_self: None, lifetime_elision_allowed: false }, param_names: [] }), span: src/lib.rs:2:14: 2:25 (#0) }, None), span: src/lib.rs:2:5: 2:26 (#0), defaultness: Default { has_value: false } })

thread 'rustc' panicked at 'Box<dyn Any>', /rustc/2d14db321b043ffc579a7461464c88d7e3f54f83/compiler/rustc_errors/src/lib.rs:1645:9
stack backtrace:
 0: std::panicking::begin_panic::<rustc_errors::ExplicitBug>
 1: std::panic::panic_any::<rustc_errors::ExplicitBug>
 2: <rustc_errors::HandlerInner>::bug::<&alloc::string::String>
 3: <rustc_errors::Handler>::bug::<&alloc::string::String>
 4: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>::{closure#0}
 5: 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::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}, !>
 7: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>
 8: rustc_middle::util::bug::bug_fmt
 9: rustc_hir_analysis::collect::fn_sig
10: <rustc_query_system::dep_graph::graph::DepGraph<rustc_middle::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle::ty::context::TyCtxt, rustc_span::def_id::DefId, rustc_middle::ty::subst::EarlyBinder<rustc_middle::ty::sty::Binder<rustc_middle::ty::sty::FnSig>>>
11: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::queries::fn_sig, rustc_query_impl::plumbing::QueryCtxt>
12: rustc_query_system::query::plumbing::get_query::<rustc_query_impl::queries::fn_sig, rustc_query_impl::plumbing::QueryCtxt, rustc_middle::dep_graph::dep_node::DepKind>
13: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::fn_sig
14: <clippy_utils::visitors::for_each_expr_with_closures::V<(), clippy_lints::multiple_unsafe_ops_per_block::collect_unsafe_exprs<&rustc_hir::hir::Block>::{closure#0}> as rustc_hir::intravisit::Visitor>::visit_expr
15: <clippy_lints::multiple_unsafe_ops_per_block::MultipleUnsafeOpsPerBlock as rustc_lint::passes::LateLintPass>::check_block
16: <rustc_lint::late::RuntimeCombinedLateLintPass as rustc_lint::passes::LateLintPass>::check_block
17: rustc_hir::intravisit::walk_expr::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
18: rustc_hir::intravisit::walk_stmt::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
19: rustc_hir::intravisit::walk_block::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
20: rustc_hir::intravisit::walk_expr::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
21: rustc_hir::intravisit::walk_body::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
22: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_body
23: rustc_hir::intravisit::walk_item::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
24: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_item
25: rustc_lint::late::late_lint_crate::<rustc_lint::BuiltinCombinedLateLintPass>
26: <rustc_session::session::Session>::time::<(), rustc_lint::late::check_crate<rustc_lint::BuiltinCombinedLateLintPass, rustc_interface::passes::analysis::{closure#6}::{closure#1}::{closure#2}::{closure#0}::{closure#0}>::{closure#0}::{closure#0}>
27: <rustc_session::session::Session>::time::<(), rustc_interface::passes::analysis::{closure#6}::{closure#1}::{closure#2}::{closure#0}>
28: <core::panic::unwind_safe::AssertUnwindSafe<rustc_interface::passes::analysis::{closure#6}::{closure#1}> as core::ops::function::FnOnce<()>>::call_once
29: <rustc_session::session::Session>::time::<(), rustc_interface::passes::analysis::{closure#6}>
30: rustc_interface::passes::analysis
31: <rustc_query_system::dep_graph::graph::DepGraph<rustc_middle::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle::ty::context::TyCtxt, (), core::result::Result<(), rustc_errors::ErrorGuaranteed>>
32: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::queries::analysis, rustc_query_impl::plumbing::QueryCtxt>
33: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::analysis
34: <rustc_middle::ty::context::GlobalCtxt>::enter::<rustc_driver_impl::run_compiler::{closure#1}::{closure#2}::{closure#3}, core::result::Result<(), rustc_errors::ErrorGuaranteed>>
35: <rustc_interface::interface::Compiler>::enter::<rustc_driver_impl::run_compiler::{closure#1}::{closure#2}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_errors::ErrorGuaranteed>>
36: rustc_span::with_source_map::<core::result::Result<(), rustc_errors::ErrorGuaranteed>, rustc_interface::interface::run_compiler<core::result::Result<(), rustc_errors::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#1}>::{closure#0}::{closure#0}>
37: <scoped_tls::ScopedKey<rustc_span::SessionGlobals>>::set::<rustc_interface::interface::run_compiler<core::result::Result<(), rustc_errors::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#1}>::{closure#0}, core::result::Result<(), rustc_errors::ErrorGuaranteed>>
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

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