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

rustc ICEs, "expected a Fn(u64) closure, found F" #125099

Open
nerodono opened this issue May 14, 2024 · 4 comments
Open

rustc ICEs, "expected a Fn(u64) closure, found F" #125099

nerodono opened this issue May 14, 2024 · 4 comments
Labels
A-diagnostics Area: Messages for errors, warnings, and lints C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@nerodono
Copy link

nerodono commented May 14, 2024

I am not sure whether it is related to

  1. Async
  2. Associated-types usage in that context

My own experiments shown that by removing Future usage it's possible to get rid of ICE, however, that's not necessarily identifies the problem

It is related to diagnostic as shown by @lqd - #125099 (comment)
Also code was a lot shortened - #125099 (comment)
Original code is still available at playground for history

Code

pub trait ContFn<T>: Fn(T) -> Self::Future {
    type Future;
}
impl<T, F> ContFn<T> for F
where
    F: Fn(T),
{
    type Future = ();
}

pub trait SeqHandler {
    type Requires;
    fn process<F: ContFn<Self::Requires>>() -> impl Sized;
}

pub struct ConvertToU64;
impl SeqHandler for ConvertToU64 {
    type Requires = u64;
    fn process<F: ContFn<Self::Requires>>() -> impl Sized {}
}

fn main() {}

https://play.rust-lang.org/?version=beta&mode=debug&edition=2021&gist=062bfd1c3c14b4af559fa82963211f22

Meta

rustc --version --verbose:

rustc 1.80.0-nightly (ef0027897 2024-05-12)
binary: rustc
commit-hash: ef0027897d2e9014766fb47dce9ddbb925d2f540
commit-date: 2024-05-12
host: x86_64-unknown-linux-gnu
release: 1.80.0-nightly
LLVM version: 18.1.4

Error output

error[E0277]: expected a `Fn(u64)` closure, found `F`
  --> src/main.rs:19:48
   |
19 |     fn process<F: ContFn<Self::Requires>>() -> impl Sized {}
   |                                                ^^^^^^^^^^ expected an `Fn(u64)` closure, found `F`
   |
   = note: expected a closure with arguments `(<ConvertToU64 as SeqHandler>::Requires,)`
              found a closure with arguments `(u64,)`
note: required for `F` to implement `ContFn<u64>`
  --> src/main.rs:4:12
   |
4  | impl<T, F> ContFn<T> for F
   |            ^^^^^^^^^     ^
5  | where
6  |     F: Fn(T),
   |        ----- unsatisfied trait bound introduced here
Backtrace

thread 'rustc' panicked at compiler/rustc_middle/src/ty/mod.rs:1657:13:
Box<dyn Any>
stack backtrace:
   0:     0x7f552970f035 - std::backtrace_rs::backtrace::libunwind::trace::h83c0eb53992f6f11
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/../../backtrace/src/backtrace/libunwind.rs:105:5
   1:     0x7f552970f035 - std::backtrace_rs::backtrace::trace_unsynchronized::hd28c2b35fda3e21e
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x7f552970f035 - std::sys_common::backtrace::_print_fmt::hf2041091d6875033
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/sys_common/backtrace.rs:68:5
   3:     0x7f552970f035 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h071af91c4208ccf0
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/sys_common/backtrace.rs:44:22
   4:     0x7f552975e29b - core::fmt::rt::Argument::fmt::hbbac3246d92cc2c5
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/core/src/fmt/rt.rs:165:63
   5:     0x7f552975e29b - core::fmt::write::hfbbdbbaa8a5636f0
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/core/src/fmt/mod.rs:1157:21
   6:     0x7f5529703bdf - std::io::Write::write_fmt::h4ed2a84aeff13252
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/io/mod.rs:1832:15
   7:     0x7f552970ee0e - std::sys_common::backtrace::_print::h6e9434dab4d40a6f
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/sys_common/backtrace.rs:47:5
   8:     0x7f552970ee0e - std::sys_common::backtrace::print::h05c5bdf93ac2b0b3
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/sys_common/backtrace.rs:34:9
   9:     0x7f5529711779 - std::panicking::default_hook::{{closure}}::h14d287fc1f176f42
  10:     0x7f55297114bd - std::panicking::default_hook::hb73c741e3f264f50
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/panicking.rs:298:9
  11:     0x7f552c671236 - std[d671f4cd4b6e9ae0]::panicking::update_hook::<alloc[89249b282a72629c]::boxed::Box<rustc_driver_impl[e938c283237ebd1d]::install_ice_hook::{closure#0}>>::{closure#0}
  12:     0x7f5529711e76 - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h68f37c64f31b57a5
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/alloc/src/boxed.rs:2036:9
  13:     0x7f5529711e76 - std::panicking::rust_panic_with_hook::h78c61ae4c0782913
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/panicking.rs:799:13
  14:     0x7f552c69e524 - std[d671f4cd4b6e9ae0]::panicking::begin_panic::<rustc_errors[c9503766cee81917]::ExplicitBug>::{closure#0}
  15:     0x7f552c69aed6 - std[d671f4cd4b6e9ae0]::sys_common::backtrace::__rust_end_short_backtrace::<std[d671f4cd4b6e9ae0]::panicking::begin_panic<rustc_errors[c9503766cee81917]::ExplicitBug>::{closure#0}, !>
  16:     0x7f552c6965e6 - std[d671f4cd4b6e9ae0]::panicking::begin_panic::<rustc_errors[c9503766cee81917]::ExplicitBug>
  17:     0x7f552c6a79b1 - <rustc_errors[c9503766cee81917]::diagnostic::BugAbort as rustc_errors[c9503766cee81917]::diagnostic::EmissionGuarantee>::emit_producing_guarantee
  18:     0x7f552cb2a32c - rustc_middle[4faf5b3238586354]::util::bug::opt_span_bug_fmt::<rustc_span[843dd1dc3d395857]::span_encoding::Span>::{closure#0}
  19:     0x7f552cb10c5a - rustc_middle[4faf5b3238586354]::ty::context::tls::with_opt::<rustc_middle[4faf5b3238586354]::util::bug::opt_span_bug_fmt<rustc_span[843dd1dc3d395857]::span_encoding::Span>::{closure#0}, !>::{closure#0}
  20:     0x7f552cb10afb - rustc_middle[4faf5b3238586354]::ty::context::tls::with_context_opt::<rustc_middle[4faf5b3238586354]::ty::context::tls::with_opt<rustc_middle[4faf5b3238586354]::util::bug::opt_span_bug_fmt<rustc_span[843dd1dc3d395857]::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
  21:     0x7f552aabbd00 - rustc_middle[4faf5b3238586354]::util::bug::bug_fmt
  22:     0x7f552ea19260 - <rustc_middle[4faf5b3238586354]::ty::context::TyCtxt>::item_name
  23:     0x7f552d171cd6 - <rustc_infer[f3ee925b5e7b0699]::infer::error_reporting::TypeErrCtxt as rustc_trait_selection[33b4cd29aa451938]::traits::error_reporting::suggestions::TypeErrCtxtExt>::note_obligation_cause_code::<rustc_span[843dd1dc3d395857]::ErrorGuaranteed, rustc_middle[4faf5b3238586354]::ty::sty::Binder<rustc_middle[4faf5b3238586354]::ty::predicate::TraitPredicate>>
  24:     0x7f552d175fd3 - <rustc_infer[f3ee925b5e7b0699]::infer::error_reporting::TypeErrCtxt as rustc_trait_selection[33b4cd29aa451938]::traits::error_reporting::suggestions::TypeErrCtxtExt>::note_obligation_cause_code::<rustc_span[843dd1dc3d395857]::ErrorGuaranteed, rustc_middle[4faf5b3238586354]::ty::predicate::Predicate>
  25:     0x7f552d19558c - <rustc_infer[f3ee925b5e7b0699]::infer::error_reporting::TypeErrCtxt as rustc_trait_selection[33b4cd29aa451938]::traits::error_reporting::type_err_ctxt_ext::InferCtxtPrivExt>::note_obligation_cause
  26:     0x7f552d186a59 - <rustc_infer[f3ee925b5e7b0699]::infer::error_reporting::TypeErrCtxt as rustc_trait_selection[33b4cd29aa451938]::traits::error_reporting::type_err_ctxt_ext::TypeErrCtxtExt>::report_selection_error
  27:     0x7f552d19a932 - <rustc_infer[f3ee925b5e7b0699]::infer::error_reporting::TypeErrCtxt as rustc_trait_selection[33b4cd29aa451938]::traits::error_reporting::type_err_ctxt_ext::InferCtxtPrivExt>::report_fulfillment_error
  28:     0x7f552d1848e0 - <rustc_infer[f3ee925b5e7b0699]::infer::error_reporting::TypeErrCtxt as rustc_trait_selection[33b4cd29aa451938]::traits::error_reporting::type_err_ctxt_ext::TypeErrCtxtExt>::report_fulfillment_errors
  29:     0x7f552e91c691 - rustc_hir_analysis[407458696a46a4ec]::check::check::check_impl_items_against_trait
  30:     0x7f552df21798 - rustc_hir_analysis[407458696a46a4ec]::check::wfcheck::check_well_formed
  31:     0x7f552df1fe53 - rustc_query_impl[e53a9462fee58497]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[e53a9462fee58497]::query_impl::check_well_formed::dynamic_query::{closure#2}::{closure#0}, rustc_middle[4faf5b3238586354]::query::erase::Erased<[u8; 1usize]>>
  32:     0x7f552df1f9f9 - rustc_query_system[81a33fca0f7b0460]::query::plumbing::try_execute_query::<rustc_query_impl[e53a9462fee58497]::DynamicConfig<rustc_query_system[81a33fca0f7b0460]::query::caches::VecCache<rustc_hir[c2c0e904be5802a4]::hir_id::OwnerId, rustc_middle[4faf5b3238586354]::query::erase::Erased<[u8; 1usize]>>, false, false, false>, rustc_query_impl[e53a9462fee58497]::plumbing::QueryCtxt, false>
  33:     0x7f552df1f7bf - rustc_query_impl[e53a9462fee58497]::query_impl::check_well_formed::get_query_non_incr::__rust_end_short_backtrace
  34:     0x7f552df1da89 - rustc_hir_analysis[407458696a46a4ec]::check::wfcheck::check_mod_type_wf
  35:     0x7f552df1d927 - rustc_query_impl[e53a9462fee58497]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[e53a9462fee58497]::query_impl::check_mod_type_wf::dynamic_query::{closure#2}::{closure#0}, rustc_middle[4faf5b3238586354]::query::erase::Erased<[u8; 1usize]>>
  36:     0x7f552e5e453a - rustc_query_system[81a33fca0f7b0460]::query::plumbing::try_execute_query::<rustc_query_impl[e53a9462fee58497]::DynamicConfig<rustc_query_system[81a33fca0f7b0460]::query::caches::DefaultCache<rustc_span[843dd1dc3d395857]::def_id::LocalModDefId, rustc_middle[4faf5b3238586354]::query::erase::Erased<[u8; 1usize]>>, false, false, false>, rustc_query_impl[e53a9462fee58497]::plumbing::QueryCtxt, false>
  37:     0x7f552e5e430b - rustc_query_impl[e53a9462fee58497]::query_impl::check_mod_type_wf::get_query_non_incr::__rust_end_short_backtrace
  38:     0x7f552dcf489c - rustc_hir_analysis[407458696a46a4ec]::check_crate
  39:     0x7f552e2ba1e0 - rustc_interface[889ca9ecceb763c3]::passes::analysis
  40:     0x7f552e2b9be5 - rustc_query_impl[e53a9462fee58497]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[e53a9462fee58497]::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle[4faf5b3238586354]::query::erase::Erased<[u8; 1usize]>>
  41:     0x7f552e6c1922 - rustc_query_system[81a33fca0f7b0460]::query::plumbing::try_execute_query::<rustc_query_impl[e53a9462fee58497]::DynamicConfig<rustc_query_system[81a33fca0f7b0460]::query::caches::SingleCache<rustc_middle[4faf5b3238586354]::query::erase::Erased<[u8; 1usize]>>, false, false, false>, rustc_query_impl[e53a9462fee58497]::plumbing::QueryCtxt, false>
  42:     0x7f552e6c1753 - rustc_query_impl[e53a9462fee58497]::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
  43:     0x7f552e549e09 - rustc_interface[889ca9ecceb763c3]::interface::run_compiler::<core[df047223aae5189a]::result::Result<(), rustc_span[843dd1dc3d395857]::ErrorGuaranteed>, rustc_driver_impl[e938c283237ebd1d]::run_compiler::{closure#0}>::{closure#1}
  44:     0x7f552e53994b - std[d671f4cd4b6e9ae0]::sys_common::backtrace::__rust_begin_short_backtrace::<rustc_interface[889ca9ecceb763c3]::util::run_in_thread_with_globals<rustc_interface[889ca9ecceb763c3]::interface::run_compiler<core[df047223aae5189a]::result::Result<(), rustc_span[843dd1dc3d395857]::ErrorGuaranteed>, rustc_driver_impl[e938c283237ebd1d]::run_compiler::{closure#0}>::{closure#1}, core[df047223aae5189a]::result::Result<(), rustc_span[843dd1dc3d395857]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[df047223aae5189a]::result::Result<(), rustc_span[843dd1dc3d395857]::ErrorGuaranteed>>
  45:     0x7f552e539734 - <<std[d671f4cd4b6e9ae0]::thread::Builder>::spawn_unchecked_<rustc_interface[889ca9ecceb763c3]::util::run_in_thread_with_globals<rustc_interface[889ca9ecceb763c3]::interface::run_compiler<core[df047223aae5189a]::result::Result<(), rustc_span[843dd1dc3d395857]::ErrorGuaranteed>, rustc_driver_impl[e938c283237ebd1d]::run_compiler::{closure#0}>::{closure#1}, core[df047223aae5189a]::result::Result<(), rustc_span[843dd1dc3d395857]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[df047223aae5189a]::result::Result<(), rustc_span[843dd1dc3d395857]::ErrorGuaranteed>>::{closure#2} as core[df047223aae5189a]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  46:     0x7f552971bcab - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h2c411cd68361b013
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/alloc/src/boxed.rs:2022:9
  47:     0x7f552971bcab - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h139d8161222f5c3a
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/alloc/src/boxed.rs:2022:9
  48:     0x7f552971bcab - std::sys::pal::unix::thread::Thread::new::thread_start::h14ec8ded327b57eb
                               at /rustc/a26981974230110fa8fb15e1cf04d05b9a2103f9/library/std/src/sys/pal/unix/thread.rs:108:17
  49:     0x7f5529629609 - start_thread
  50:     0x7f552954c353 - clone
  51:                0x0 - <unknown>

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.79.0-beta.4 (a26981974 2024-05-10) running on x86_64-unknown-linux-gnu

note: compiler flags: --crate-type bin -C embed-bitcode=no -C codegen-units=1 -C debuginfo=2

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [check_well_formed] checking that `<impl at src/main.rs:17:1: 17:33>` is well-formed
#1 [check_mod_type_wf] checking that types are well-formed in top-level module
#2 [analysis] running analysis passes on this crate
end of query stack
For more information about this error, try `rustc --explain E0277`.

@nerodono nerodono added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels May 14, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label May 14, 2024
@lqd
Copy link
Member

lqd commented May 14, 2024

The ICE happens in diagnostics because of a lack of usable name for a suggestion, error: internal compiler error: compiler/rustc_middle/src/ty/mod.rs:2212:13: item_name: no name for DefPath.

It is on stable and started appearing in 1.77, technically becoming visible in #119869 cc @oli-obk as my due diligence, but that likely just bubbled up the issue. The closure error is now emitted multiple times, but that could be the ICE messing with deduplication (the spans are different tho...).

@lqd lqd added A-diagnostics Area: Messages for errors, warnings, and lints and removed needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. labels May 14, 2024
@nerodono nerodono changed the title rustc ICes, "expected a Fn(u64) closure, found F" rustc ICEs, "expected a Fn(u64) closure, found F" May 14, 2024
@lqd
Copy link
Member

lqd commented May 14, 2024

Reduced a bit so we can see it's not related to async.

pub trait ContFn<T>: Fn(T) -> Self::Future {
    type Future;
}
impl<T, F> ContFn<T> for F
where
    F: Fn(T),
{
    type Future = ();
}

pub trait SeqHandler {
    type Requires;
    fn process<F: ContFn<Self::Requires>>() -> impl Sized;
}

pub struct ConvertToU64;
impl SeqHandler for ConvertToU64 {
    type Requires = u64;
    fn process<F: ContFn<Self::Requires>>() -> impl Sized {}
}

fn main() {}

@nerodono
Copy link
Author

Reduced a bit so we can see it's not related to async.

pub trait ContFn<T>: Fn(T) -> Self::Future {
    type Future;
}
impl<T, F> ContFn<T> for F
where
    F: Fn(T),
{
    type Future = ();
}

pub trait SeqHandler {
    type Requires;
    fn process<F: ContFn<Self::Requires>>() -> impl Sized;
}

pub struct ConvertToU64;
impl SeqHandler for ConvertToU64 {
    type Requires = u64;
    fn process<F: ContFn<Self::Requires>>() -> impl Sized {}
}

fn main() {}

Should I update issue's example to this one?

@lqd
Copy link
Member

lqd commented May 14, 2024

Whatever is easier for you. People looking at this issue will find it either way, don't worry :)

@matthiaskrgr matthiaskrgr added the S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. label May 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

4 participants