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

ICE using repr(align(…)) type as trait object receiver (arbitrary self-type) #138564

Open
steffahn opened this issue Mar 16, 2025 · 1 comment
Labels
A-layout Area: Memory layout of types A-trait-objects Area: trait objects, vtable layout C-bug Category: This is a bug. F-arbitrary_self_types `#![feature(arbitrary_self_types)]` F-dispatch_from_dyn `#![feature(dispatch_from_dyn)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. requires-nightly This issue requires a nightly compiler in some way. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@steffahn
Copy link
Member

Code

#![feature(unsize, dispatch_from_dyn, arbitrary_self_types)]

use std::marker::Unsize;
use std::ops::{Deref, DispatchFromDyn};

#[repr(align(16))]
pub struct MyPointer<T: ?Sized>(*const T);

impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<MyPointer<U>> for MyPointer<T> {}
impl<T: ?Sized> Deref for MyPointer<T> {
    type Target = T;
    fn deref(&self) -> &T {
        unimplemented!()
    }
}

pub trait Trait {
    fn foo(self: MyPointer<Self>) {}
}

// make sure some usage of `<dyn Trait>::foo` makes it to codegen
pub fn user() -> *const () {
    <dyn Trait>::foo as *const ()
}

(playground)

Error output

error: internal compiler error: compiler/rustc_ty_utils/src/abi.rs:740:18: receiver type has unsupported layout: TyAndLayout { ty: MyPointer<dyn Trait>, layout: Layout { size: Size(16 bytes), align: AbiAndPrefAlign { abi: Align(16 bytes), pref: Align(16 bytes) }, backend_repr: Memory { sized: true }, fields: Arbitrary { offsets: [Size(0 bytes)], memory_index: [0] }, largest_niche: Some(Niche { offset: Size(8 bytes), value: Pointer(AddressSpace(0)), valid_range: 1..=18446744073709551615 }), uninhabited: false, variants: Single { index: 0 }, max_repr_align: Some(Align(16 bytes)), unadjusted_abi_align: Align(8 bytes), randomization_seed: 7312131278044645289 } }


thread 'rustc' panicked at compiler/rustc_ty_utils/src/abi.rs:740:18:
Box<dyn Any>
stack backtrace:
   0:     0x770c57633893 - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h2fbd06f1ad558926
   1:     0x770c57e05a58 - core::fmt::write::he613d79b06f4b50b
   2:     0x770c5913a2d1 - std::io::Write::write_fmt::h2d558f8849cee296
   3:     0x770c576336f2 - std::sys::backtrace::BacktraceLock::print::h980245f16d2e53c5
   4:     0x770c57635faa - std::panicking::default_hook::{{closure}}::ha8e1870143bb4424
   5:     0x770c57635b2f - std::panicking::default_hook::h510c7e30611e55b6
   6:     0x770c566991ff - std[9e04a37a0a8a4f45]::panicking::update_hook::<alloc[324835f0a3c901e2]::boxed::Box<rustc_driver_impl[8fdf64b2f913ec67]::install_ice_hook::{closure#1}>>::{closure#0}
   7:     0x770c57636823 - std::panicking::rust_panic_with_hook::hf32ade211372445e
   8:     0x770c566d66c1 - std[9e04a37a0a8a4f45]::panicking::begin_panic::<rustc_errors[1bf8457a84dc8be7]::ExplicitBug>::{closure#0}
   9:     0x770c566ca8b6 - std[9e04a37a0a8a4f45]::sys::backtrace::__rust_end_short_backtrace::<std[9e04a37a0a8a4f45]::panicking::begin_panic<rustc_errors[1bf8457a84dc8be7]::ExplicitBug>::{closure#0}, !>
  10:     0x770c566ca89b - std[9e04a37a0a8a4f45]::panicking::begin_panic::<rustc_errors[1bf8457a84dc8be7]::ExplicitBug>
  11:     0x770c566e0071 - <rustc_errors[1bf8457a84dc8be7]::diagnostic::BugAbort as rustc_errors[1bf8457a84dc8be7]::diagnostic::EmissionGuarantee>::emit_producing_guarantee
  12:     0x770c56d1e56a - rustc_middle[77f5a5ad0a03fbe5]::util::bug::opt_span_bug_fmt::<rustc_span[616a7760585f005b]::span_encoding::Span>::{closure#0}
  13:     0x770c56cf97da - rustc_middle[77f5a5ad0a03fbe5]::ty::context::tls::with_opt::<rustc_middle[77f5a5ad0a03fbe5]::util::bug::opt_span_bug_fmt<rustc_span[616a7760585f005b]::span_encoding::Span>::{closure#0}, !>::{closure#0}
  14:     0x770c56cf966b - rustc_middle[77f5a5ad0a03fbe5]::ty::context::tls::with_context_opt::<rustc_middle[77f5a5ad0a03fbe5]::ty::context::tls::with_opt<rustc_middle[77f5a5ad0a03fbe5]::util::bug::opt_span_bug_fmt<rustc_span[616a7760585f005b]::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
  15:     0x770c5497a4c0 - rustc_middle[77f5a5ad0a03fbe5]::util::bug::bug_fmt
  16:     0x770c58697fd7 - <core[1a8e3f3c1152e72c]::iter::adapters::enumerate::Enumerate<_> as core[1a8e3f3c1152e72c]::iter::traits::iterator::Iterator>::try_fold::enumerate::<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty, (), core[1a8e3f3c1152e72c]::ops::control_flow::ControlFlow<core[1a8e3f3c1152e72c]::ops::control_flow::ControlFlow<rustc_target[f1139571c8f7483e]::callconv::ArgAbi<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>>, core[1a8e3f3c1152e72c]::iter::adapters::map::map_try_fold<(usize, rustc_middle[77f5a5ad0a03fbe5]::ty::Ty), core[1a8e3f3c1152e72c]::result::Result<rustc_target[f1139571c8f7483e]::callconv::ArgAbi<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>, &rustc_middle[77f5a5ad0a03fbe5]::ty::layout::FnAbiError>, (), core[1a8e3f3c1152e72c]::ops::control_flow::ControlFlow<core[1a8e3f3c1152e72c]::ops::control_flow::ControlFlow<rustc_target[f1139571c8f7483e]::callconv::ArgAbi<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>>, rustc_ty_utils[7aab6de42c66b8b6]::abi::fn_abi_new_uncached::{closure#3}, <core[1a8e3f3c1152e72c]::iter::adapters::GenericShunt<core[1a8e3f3c1152e72c]::iter::adapters::map::Map<core[1a8e3f3c1152e72c]::iter::adapters::enumerate::Enumerate<core[1a8e3f3c1152e72c]::iter::adapters::chain::Chain<core[1a8e3f3c1152e72c]::iter::adapters::chain::Chain<core[1a8e3f3c1152e72c]::iter::adapters::copied::Copied<core[1a8e3f3c1152e72c]::slice::iter::Iter<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>, core[1a8e3f3c1152e72c]::iter::adapters::copied::Copied<core[1a8e3f3c1152e72c]::slice::iter::Iter<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>>, core[1a8e3f3c1152e72c]::option::IntoIter<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>>, rustc_ty_utils[7aab6de42c66b8b6]::abi::fn_abi_new_uncached::{closure#3}>, core[1a8e3f3c1152e72c]::result::Result<core[1a8e3f3c1152e72c]::convert::Infallible, &rustc_middle[77f5a5ad0a03fbe5]::ty::layout::FnAbiError>> as core[1a8e3f3c1152e72c]::iter::traits::iterator::Iterator>::try_fold<(), core[1a8e3f3c1152e72c]::iter::traits::iterator::Iterator::try_for_each::call<rustc_target[f1139571c8f7483e]::callconv::ArgAbi<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>, core[1a8e3f3c1152e72c]::ops::control_flow::ControlFlow<rustc_target[f1139571c8f7483e]::callconv::ArgAbi<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>, core[1a8e3f3c1152e72c]::ops::control_flow::ControlFlow<rustc_target[f1139571c8f7483e]::callconv::ArgAbi<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>::Break>::{closure#0}, core[1a8e3f3c1152e72c]::ops::control_flow::ControlFlow<rustc_target[f1139571c8f7483e]::callconv::ArgAbi<rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>>>::{closure#0}>::{closure#0}>::{closure#0}
  17:     0x770c587c4ee8 - rustc_ty_utils[7aab6de42c66b8b6]::abi::fn_abi_new_uncached
  18:     0x770c587bf392 - rustc_ty_utils[7aab6de42c66b8b6]::abi::fn_abi_of_instance
  19:     0x770c587be818 - rustc_query_impl[fc8387517396db3d]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[fc8387517396db3d]::query_impl::fn_abi_of_instance::dynamic_query::{closure#2}::{closure#0}, rustc_middle[77f5a5ad0a03fbe5]::query::erase::Erased<[u8; 16usize]>>
  20:     0x770c587bb563 - rustc_query_system[3b7ccee9954445dd]::query::plumbing::try_execute_query::<rustc_query_impl[fc8387517396db3d]::DynamicConfig<rustc_query_system[3b7ccee9954445dd]::query::caches::DefaultCache<rustc_middle[77f5a5ad0a03fbe5]::ty::PseudoCanonicalInput<(rustc_middle[77f5a5ad0a03fbe5]::ty::instance::Instance, &rustc_middle[77f5a5ad0a03fbe5]::ty::list::RawList<(), rustc_middle[77f5a5ad0a03fbe5]::ty::Ty>)>, rustc_middle[77f5a5ad0a03fbe5]::query::erase::Erased<[u8; 16usize]>>, false, false, false>, rustc_query_impl[fc8387517396db3d]::plumbing::QueryCtxt, false>
  21:     0x770c587bb107 - rustc_query_impl[fc8387517396db3d]::query_impl::fn_abi_of_instance::get_query_non_incr::__rust_end_short_backtrace
  22:     0x770c54cfaf46 - <rustc_codegen_ssa[99f2d35fcd5a252c]::mir::FunctionCx<rustc_codegen_llvm[ddc53a90a6190b8a]::builder::GenericBuilder<rustc_codegen_llvm[ddc53a90a6190b8a]::context::FullCx>>>::codegen_terminator
  23:     0x770c58ea9195 - rustc_codegen_ssa[99f2d35fcd5a252c]::mir::codegen_mir::<rustc_codegen_llvm[ddc53a90a6190b8a]::builder::GenericBuilder<rustc_codegen_llvm[ddc53a90a6190b8a]::context::FullCx>>
  24:     0x770c58e8cc9b - rustc_codegen_llvm[ddc53a90a6190b8a]::base::compile_codegen_unit::module_codegen
  25:     0x770c58fbf715 - <rustc_codegen_llvm[ddc53a90a6190b8a]::LlvmCodegenBackend as rustc_codegen_ssa[99f2d35fcd5a252c]::traits::backend::ExtraBackendMethods>::compile_codegen_unit
  26:     0x770c58fc1017 - <rustc_codegen_llvm[ddc53a90a6190b8a]::LlvmCodegenBackend as rustc_codegen_ssa[99f2d35fcd5a252c]::traits::backend::CodegenBackend>::codegen_crate
  27:     0x770c59177345 - <rustc_interface[3173e466a85c5e7c]::queries::Linker>::codegen_and_build_linker
  28:     0x770c59174bf0 - rustc_interface[3173e466a85c5e7c]::passes::create_and_enter_global_ctxt::<core[1a8e3f3c1152e72c]::option::Option<rustc_interface[3173e466a85c5e7c]::queries::Linker>, rustc_driver_impl[8fdf64b2f913ec67]::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
  29:     0x770c58f80b20 - rustc_interface[3173e466a85c5e7c]::interface::run_compiler::<(), rustc_driver_impl[8fdf64b2f913ec67]::run_compiler::{closure#0}>::{closure#1}
  30:     0x770c58ca4412 - std[9e04a37a0a8a4f45]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[3173e466a85c5e7c]::util::run_in_thread_with_globals<rustc_interface[3173e466a85c5e7c]::util::run_in_thread_pool_with_globals<rustc_interface[3173e466a85c5e7c]::interface::run_compiler<(), rustc_driver_impl[8fdf64b2f913ec67]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  31:     0x770c58ca4cf4 - <<std[9e04a37a0a8a4f45]::thread::Builder>::spawn_unchecked_<rustc_interface[3173e466a85c5e7c]::util::run_in_thread_with_globals<rustc_interface[3173e466a85c5e7c]::util::run_in_thread_pool_with_globals<rustc_interface[3173e466a85c5e7c]::interface::run_compiler<(), rustc_driver_impl[8fdf64b2f913ec67]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[1a8e3f3c1152e72c]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  32:     0x770c58ca60eb - std::sys::pal::unix::thread::Thread::new::thread_start::h907dccd2cf29cc8f
  33:     0x770c5a4f4a94 - <unknown>
  34:     0x770c5a581a34 - clone
  35:                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: please make sure that you have updated to the latest nightly

note: please attach the file at `/playground/rustc-ice-2025-03-16T17_35_25-24.txt` to your bug report

note: compiler flags: --crate-type lib -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 [fn_abi_of_instance] computing call ABI of `<dyn Trait as Trait>::foo - virtual#3`
end of query stack
error: could not compile `playground` (lib)

@rustbot label F-arbitrary_self_types, F-dispatch_from_dyn, requires-nightly, A-trait-objects, A-layout

@steffahn steffahn 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 Mar 16, 2025
@rustbot rustbot added needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. A-layout Area: Memory layout of types A-trait-objects Area: trait objects, vtable layout F-arbitrary_self_types `#![feature(arbitrary_self_types)]` F-dispatch_from_dyn `#![feature(dispatch_from_dyn)]` requires-nightly This issue requires a nightly compiler in some way. labels Mar 16, 2025
@compiler-errors
Copy link
Member

Yeah, the implementation of DispatchFromDyn in codegen is really sensitive about the specifics of layout. This is internal layout jargon, but it expects the pointee to be Scalar-shaped but an alignment attr causes this to have a Memory backend. For now we probably just need to strengthen the checks for self type type validity for DispatchFromDyn.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-layout Area: Memory layout of types A-trait-objects Area: trait objects, vtable layout C-bug Category: This is a bug. F-arbitrary_self_types `#![feature(arbitrary_self_types)]` F-dispatch_from_dyn `#![feature(dispatch_from_dyn)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. requires-nightly This issue requires a nightly compiler in some way. 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

3 participants