Skip to content

Bare Trait Object Return in Trait Method Causes Panic #138277

Closed
@leonardogiovannoni

Description

@leonardogiovannoni

This code panics in nightly 1.87, but not in stable 1.85 and beta 1.86.

Code

use std::ops::{Deref, DerefMut};

pub trait Token: Sized {
    type Context: Context<Token = Self>;

    fn load<'ctx>(self, ctx: &'ctx Self::Context) -> <Self::Context as Context>::Payload<'ctx> {
        ctx.packet(self)
    }

}

pub trait Context: Sized + Clone + Send {
    type Token: Token<Context = Self>;
    type Payload<'ctx>: Payload<'ctx, Context = Self, Token = Self::Token>
    where
        Self: 'ctx;

    fn packet<'ctx>(&'ctx self, token: Self::Token) -> Self::Payload<'ctx>;
   
}

pub trait Payload<'a>: AsRef<[u8]> + AsMut<[u8]> + Deref<Target = [u8]> + DerefMut<Target = [u8]> {
    type Context: Context;
    type Token: Token<Context = Self::Context>;
}

pub trait Foo: Send + Sized {
    type Ctx: Context;
    type Tk: Token<Context = Self::Ctx>;


    fn recv_local(&mut self) -> anyhow::Result<Payload<'_>> {
        let token = self.recv()?;
        Ok(token.load(self.context()))
    }
    /// Receives a packet and returns a token.
    fn recv(&mut self) -> anyhow::Result<Self::Tk>;

    fn context(&self) -> &Self::Ctx;
}


fn main() {
    println!("Hello, world!");
}

In 1.85 and 1.86 I receive instead the following error:

error[E0782]: expected a type, found a trait
  --> src/main.rs:33:48
   |
33 |     fn recv_local(&mut self) -> anyhow::Result<Payload<'_>> {
   |                                                ^^^^^^^^^^^
   |
help: you can add the `dyn` keyword if you want a trait object
   |
33 |     fn recv_local(&mut self) -> anyhow::Result<dyn Payload<'_>> {
   |                                                +++

For more information about this error, try `rustc --explain E0782`.
error: could not compile `ice` (bin "ice") due to 1 previous error

Meta

rustc --version --verbose:

rustc 1.87.0-nightly (efea9896f 2025-03-08)
binary: rustc
commit-hash: efea9896f506baa08f40444e07774e827646d57a
commit-date: 2025-03-08
host: x86_64-unknown-linux-gnu
release: 1.87.0-nightly
LLVM version: 20.1.0

Error output

thread 'rustc' panicked at compiler/rustc_hir_analysis/src/hir_ty_lowering/lint.rs:210:61:
$ident: found TraitItem(TraitItem { ident: recv_local#0, owner_id: DefId(0:23 ~ ice[c768]::Foo::recv_local), generics: Generics { params: [GenericP
stack backtrace:
   0:     0x7f379c3b9884 - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h92d4bfce6f763b00
   1:     0x7f379cc05bae - core::fmt::write::hb4817f6dd96fad0f
   2:     0x7f379dd8c051 - std::io::Write::write_fmt::h314f413d021b4307
   3:     0x7f379c3b96e2 - std::sys::backtrace::BacktraceLock::print::h68d0c48567bf96cd
   4:     0x7f379c3bc008 - std::panicking::default_hook::{{closure}}::h15992f1912031b9e
   5:     0x7f379c3bbb27 - std::panicking::default_hook::hf25af0ac62c164b1
   6:     0x7f379b50bbbf - std[aea8b8668118ef2c]::panicking::update_hook::<alloc[a7bb905a442d6351]::boxed::Box<rustc_driver_impl[329d2250e30901ce]:
   7:     0x7f379c3bc873 - std::panicking::rust_panic_with_hook::he1f54632065b4203
   8:     0x7f379c3bc56a - std::panicking::begin_panic_handler::{{closure}}::h2b38fb544238cd15
   9:     0x7f379c3b9d59 - std::sys::backtrace::__rust_end_short_backtrace::he36cb2712646bcd0
  10:     0x7f379c3bc22d - rust_begin_unwind
  11:     0x7f379905bcc0 - core::panicking::panic_fmt::h546b0be70e72d2d1
  12:     0x7f379b5d9111 - rustc_hir[6b05b39687205c32]::hir::expect_failed::<&rustc_hir[6b05b39687205c32]::hir::Node>
  13:     0x7f379de8782e - <dyn rustc_hir_analysis[7d047a4039fbdcf6]::hir_ty_lowering::HirTyLowerer>::prohibit_or_lint_bare_trait_object_ty
  14:     0x7f379d498bb6 - <dyn rustc_hir_analysis[7d047a4039fbdcf6]::hir_ty_lowering::HirTyLowerer>::lower_ty
  15:     0x7f379d49bc84 - <dyn rustc_hir_analysis[7d047a4039fbdcf6]::hir_ty_lowering::HirTyLowerer>::lower_path
  16:     0x7f379d49825a - <dyn rustc_hir_analysis[7d047a4039fbdcf6]::hir_ty_lowering::HirTyLowerer>::lower_ty
  17:     0x7f379d48e63b - <dyn rustc_hir_analysis[7d047a4039fbdcf6]::hir_ty_lowering::HirTyLowerer>::lower_fn_ty
  18:     0x7f379d48ded1 - rustc_hir_analysis[7d047a4039fbdcf6]::collect::lower_fn_sig_recovering_infer_ret_ty
  19:     0x7f379d48be63 - rustc_hir_analysis[7d047a4039fbdcf6]::collect::fn_sig
  20:     0x7f379ce7cced - rustc_query_impl[35192ced76ef19cc]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[35192ced76ef19cc]::query_i
  21:     0x7f379ce7ccad - <rustc_query_impl[35192ced76ef19cc]::query_impl::fn_sig::dynamic_query::{closure#2} as core[e60e1eed10c732b4]::ops::func
  22:     0x7f379ceec5be - rustc_query_system[8750ea9310c2c1bc]::query::plumbing::try_execute_query::<rustc_query_impl[35192ced76ef19cc]::DynamicCo
  23:     0x7f379ceeaa4d - rustc_query_impl[35192ced76ef19cc]::query_impl::fn_sig::get_query_incr::__rust_end_short_backtrace
  24:     0x7f379d425ba5 - rustc_middle[abc93db11e30059e]::query::plumbing::query_get_at::<rustc_query_system[8750ea9310c2c1bc]::query::caches::Def
  25:     0x7f379d4452b0 - rustc_hir_analysis[7d047a4039fbdcf6]::check::check::check_item_type
  26:     0x7f379d43c172 - rustc_hir_analysis[7d047a4039fbdcf6]::check::wfcheck::check_well_formed
  27:     0x7f379d43aaf7 - rustc_query_impl[35192ced76ef19cc]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[35192ced76ef19cc]::query_i
  28:     0x7f379cfecf60 - rustc_query_system[8750ea9310c2c1bc]::query::plumbing::try_execute_query::<rustc_query_impl[35192ced76ef19cc]::DynamicCo
  29:     0x7f379cff65bd - rustc_query_impl[35192ced76ef19cc]::query_impl::check_well_formed::get_query_incr::__rust_end_short_backtrace
  30:     0x7f379d43789d - rustc_hir_analysis[7d047a4039fbdcf6]::check::wfcheck::check_mod_type_wf
  31:     0x7f379d43769d - rustc_query_impl[35192ced76ef19cc]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[35192ced76ef19cc]::query_i
  32:     0x7f379dc9b7fd - rustc_query_system[8750ea9310c2c1bc]::query::plumbing::try_execute_query::<rustc_query_impl[35192ced76ef19cc]::DynamicCo
  33:     0x7f379dc9c24a - rustc_query_impl[35192ced76ef19cc]::query_impl::check_mod_type_wf::get_query_incr::__rust_end_short_backtrace
  34:     0x7f379cf2fad3 - rustc_hir_analysis[7d047a4039fbdcf6]::check_crate
  35:     0x7f379cfef2b4 - rustc_interface[4c1044b8b3f8fa90]::passes::run_required_analyses
  36:     0x7f379db6c538 - rustc_interface[4c1044b8b3f8fa90]::passes::analysis
  37:     0x7f379db6c517 - rustc_query_impl[35192ced76ef19cc]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[35192ced76ef19cc]::query_i
  38:     0x7f379dee7c69 - rustc_query_system[8750ea9310c2c1bc]::query::plumbing::try_execute_query::<rustc_query_impl[35192ced76ef19cc]::DynamicCo
  39:     0x7f379dee7775 - rustc_query_impl[35192ced76ef19cc]::query_impl::analysis::get_query_incr::__rust_end_short_backtrace
  40:     0x7f379dd3247c - rustc_interface[4c1044b8b3f8fa90]::passes::create_and_enter_global_ctxt::<core[e60e1eed10c732b4]::option::Option<rustc_i
  41:     0x7f379dd2246e - rustc_interface[4c1044b8b3f8fa90]::interface::run_compiler::<(), rustc_driver_impl[329d2250e30901ce]::run_compiler::{clo
  42:     0x7f379dbae7c8 - std[aea8b8668118ef2c]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[4c1044b8b3f8fa90]::util::run_in_th
  43:     0x7f379dbaf0b4 - <<std[aea8b8668118ef2c]::thread::Builder>::spawn_unchecked_<rustc_interface[4c1044b8b3f8fa90]::util::run_in_thread_with_globals<rustc_interface[4c1044b8b3f8fa90]::util::run_in_thread_pool_with_globals<rustc_interface[4c1044b8b3f8fa90]::interface::run_compiler<(), rustc_driver_impl[329d2250e30901ce]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[e60e1eed10c732b4]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  44:     0x7f379dbb04ab - std::sys::pal::unix::thread::Thread::new::thread_start::hbcfe3ea4381c14e0
  45:     0x7f3797c7e168 - start_thread
                               at /usr/src/debug/glibc-2.40-21.fc41.x86_64/nptl/pthread_create.c:448:8
  46:     0x7f3797d0214c - __GI___clone3
                               at /usr/src/debug/glibc-2.40-21.fc41.x86_64/misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:78:0
  47:                0x0 - <unknown>

error: the compiler unexpectedly panicked. this is a bug.

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: please make sure that you have updated to the latest nightly

note: please attach the file at `/home/leonardogiovannoni/Src/Net/ice/rustc-ice-2025-03-09T15_06_36-37051.txt` to your bug report

note: compiler flags: --crate-type bin -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED]

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

query stack during panic:
#0 [fn_sig] computing function signature of `Foo::recv_local`
#1 [check_well_formed] checking that `Foo` is well-formed
... and 2 other queries... use `env RUST_BACKTRACE=1` to see the full query stack
error: could not compile `ice` (bin "ice")

Caused by:
  process didn't exit successfully: `/home/leonardogiovannoni/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/rustc --crate-name ice --edition=2024 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=83 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=3de3f006944ba14f -C extra-filename=-ec99d68baccf9512 --out-dir /home/leonardogiovannoni/Src/Net/ice/target/debug/deps -C incremental=/home/leonardogiovannoni/Src/Net/ice/target/debug/incremental -L dependency=/home/leonardogiovannoni/Src/Net/ice/target/debug/deps --extern anyhow=/home/leonardogiovannoni/Src/Net/ice/target/debug/deps/libanyhow-eee0032c520aff90.rlib` (exit status: 101)
Backtrace


error: the compiler unexpectedly panicked. this is a bug.

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: please make sure that you have updated to the latest nightly

note: please attach the file at `/home/leonardogiovannoni/Src/Net/ice/rustc-ice-2025-03-09T15_06_36-37051.txt` to your bug report

note: compiler flags: --crate-type bin -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED]

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

query stack during panic:
#0 [fn_sig] computing function signature of `Foo::recv_local`
#1 [check_well_formed] checking that `Foo` is well-formed
... and 2 other queries... use `env RUST_BACKTRACE=1` to see the full query stack
error: could not compile `ice` (bin "ice")

Caused by:
  process didn't exit successfully: `/home/leonardogiovannoni/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/rustc --crate-name ice --edit
leonardogiovannoni@fedora:~/Src/Net/ice$ RUST_BACKTRACE=1 cargo build
   Compiling ice v0.1.0 (/home/leonardogiovannoni/Src/Net/ice)

thread 'rustc' panicked at compiler/rustc_hir_analysis/src/hir_ty_lowering/lint.rs:210:61:
$ident: found TraitItem(TraitItem { ident: recv_local#0, owner_id: DefId(0:23 ~ ice[c768]::Foo::recv_local), generics: Generics { params: [GenericP
stack backtrace:
   0: rust_begin_unwind
   1: core::panicking::panic_fmt
   2: rustc_hir::hir::expect_failed::<&rustc_hir::hir::Node>
   3: <dyn rustc_hir_analysis::hir_ty_lowering::HirTyLowerer>::prohibit_or_lint_bare_trait_object_ty
   4: <dyn rustc_hir_analysis::hir_ty_lowering::HirTyLowerer>::lower_ty
   5: <dyn rustc_hir_analysis::hir_ty_lowering::HirTyLowerer>::lower_path
   6: <dyn rustc_hir_analysis::hir_ty_lowering::HirTyLowerer>::lower_ty
   7: <dyn rustc_hir_analysis::hir_ty_lowering::HirTyLowerer>::lower_fn_ty
   8: rustc_hir_analysis::collect::lower_fn_sig_recovering_infer_ret_ty
   9: rustc_hir_analysis::collect::fn_sig
      [... omitted 2 frames ...]
  10: rustc_middle::query::plumbing::query_get_at::<rustc_query_system::query::caches::DefIdCache<rustc_middle::query::erase::Erased<[u8; 24]>>>
  11: rustc_hir_analysis::check::check::check_item_type
  12: rustc_hir_analysis::check::wfcheck::check_well_formed
      [... omitted 1 frame ...]
  13: rustc_hir_analysis::check::wfcheck::check_mod_type_wf
      [... omitted 1 frame ...]
  14: rustc_hir_analysis::check_crate
  15: rustc_interface::passes::run_required_analyses
  16: rustc_interface::passes::analysis
      [... omitted 1 frame ...]
  17: rustc_interface::passes::create_and_enter_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
  18: rustc_interface::interface::run_compiler::<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: the compiler unexpectedly panicked. this is a bug.

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: please make sure that you have updated to the latest nightly

note: please attach the file at `/home/leonardogiovannoni/Src/Net/ice/rustc-ice-2025-03-09T15_07_03-37119.txt` to your bug report

note: compiler flags: --crate-type bin -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED]

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

query stack during panic:
#0 [fn_sig] computing function signature of `Foo::recv_local`
#1 [check_well_formed] checking that `Foo` is well-formed
#2 [check_mod_type_wf] checking that types are well-formed in top-level module
#3 [analysis] running analysis passes on this crate
end of query stack
error: could not compile `ice` (bin "ice")

Caused by:
  process didn't exit successfully: `/home/leonardogiovannoni/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/rustc --crate-name ice --edition=2024 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=147 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=3de3f006944ba14f -C extra-filename=-ec99d68baccf9512 --out-dir /home/leonardogiovannoni/Src/Net/ice/target/debug/deps -C incremental=/home/leonardogiovannoni/Src/Net/ice/target/debug/incremental -L dependency=/home/leonardogiovannoni/Src/Net/ice/target/debug/deps --extern anyhow=/home/leonardogiovannoni/Src/Net/ice/target/debug/deps/libanyhow-eee0032c520aff90.rlib` (exit status: 101)

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions