Closed
Description
If I write a trait like this
#![allow(unused)]
type A = fn(&'static ());
type B = fn(&());
trait Bound<P> {}
impl Bound<B> for String {}
trait Trt<T> {
fn __(&self)
where
T: Bound<A>,
{
}
}
impl<T, S> Trt<T> for S {}
const C: &'static dyn Trt<String> = &();
where the method comes with a bound T: Bound<A>
, and I instantiate a trait object with a type T
(here, String
) which only meets T: Bound<B>
, the method seems to be monomorphized nonetheless, despite the mismatching type; as long as the type B
only differs from A
in higher-ranked-lifetime stuff, and the Bound<B> for String
impl is the only one among types sufficiently “similar” to A
.
#[no_mangle]
fn c() -> &'static dyn Trt<String> {
C
}
example::Trt::__::h36d3dc0848d6ceff:
ret
c:
lea rdx, [rip + .L__unnamed_1]
mov eax, 1
ret
.L__unnamed_1:
.asciz "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000"
.quad example::Trt::__::h36d3dc0848d6ceff
The behavior I would have expected: The method's entry becomes 0
instead, and it's never monomorphized.
This monomorphization then can become … “unhappy” … about the bad types:
#![allow(unused)]
type A = fn(&'static ());
type B = fn(&());
trait Bound<P: WithAssoc>: From<GetAssoc<P>> {
}
impl Bound<B> for String {}
trait Trt<T> {
fn __(&self, x: T) where T: Bound<A> {
T::from(());
}
}
impl<T, S> Trt<T> for S {}
const C: &'static dyn Trt<String> = &();
type GetAssoc<T> = <T as WithAssoc>::Ty;
trait WithAssoc {
type Ty;
}
impl WithAssoc for B {
type Ty = String;
}
impl WithAssoc for A {
type Ty = ();
}
error: internal compiler error: compiler/rustc_middle/src/ty/instance.rs:585:21: failed to resolve instance for <String as From<()>>::from
--> src/lib.rs:12:9
|
12 | T::from(());
| ^^^^^^^^^^^
thread 'rustc' panicked at compiler/rustc_middle/src/ty/instance.rs:585:21:
Box<dyn Any>
stack backtrace:
0: 0x7097b3ef872a - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::heeeab96efd312504
1: 0x7097b4612d26 - core::fmt::write::hc5affe1a961fb87a
2: 0x7097b5598d91 - std::io::Write::write_fmt::h8190bce8dcf4a154
3: 0x7097b3ef8582 - std::sys::backtrace::BacktraceLock::print::h8064f6c690594717
4: 0x7097b3efab27 - std::panicking::default_hook::{{closure}}::h733c6fe54345b370
5: 0x7097b3efa910 - std::panicking::default_hook::h4e4a01d045e6d2c7
6: 0x7097b305fc68 - std[d57b542980c61ed0]::panicking::update_hook::<alloc[99f5d28b839bf241]::boxed::Box<rustc_driver_impl[4a0a86913583d400]::install_ice_hook::{closure#1}>>::{closure#0}
7: 0x7097b3efb3b3 - std::panicking::rust_panic_with_hook::he9f7cf885214d25c
8: 0x7097b3098251 - std[d57b542980c61ed0]::panicking::begin_panic::<rustc_errors[7e07cb41e763bd24]::ExplicitBug>::{closure#0}
9: 0x7097b308d156 - std[d57b542980c61ed0]::sys::backtrace::__rust_end_short_backtrace::<std[d57b542980c61ed0]::panicking::begin_panic<rustc_errors[7e07cb41e763bd24]::ExplicitBug>::{closure#0}, !>
10: 0x7097b308d13d - std[d57b542980c61ed0]::panicking::begin_panic::<rustc_errors[7e07cb41e763bd24]::ExplicitBug>
11: 0x7097b30a2181 - <rustc_errors[7e07cb41e763bd24]::diagnostic::BugAbort as rustc_errors[7e07cb41e763bd24]::diagnostic::EmissionGuarantee>::emit_producing_guarantee
12: 0x7097b35f9bcc - <rustc_errors[7e07cb41e763bd24]::DiagCtxtHandle>::span_bug::<rustc_span[cd440fa8db25c8dc]::span_encoding::Span, alloc[99f5d28b839bf241]::string::String>
13: 0x7097b367f227 - rustc_middle[72ef72ec76711232]::util::bug::opt_span_bug_fmt::<rustc_span[cd440fa8db25c8dc]::span_encoding::Span>::{closure#0}
14: 0x7097b366422a - rustc_middle[72ef72ec76711232]::ty::context::tls::with_opt::<rustc_middle[72ef72ec76711232]::util::bug::opt_span_bug_fmt<rustc_span[cd440fa8db25c8dc]::span_encoding::Span>::{closure#0}, !>::{closure#0}
15: 0x7097b36640bb - rustc_middle[72ef72ec76711232]::ty::context::tls::with_context_opt::<rustc_middle[72ef72ec76711232]::ty::context::tls::with_opt<rustc_middle[72ef72ec76711232]::util::bug::opt_span_bug_fmt<rustc_span[cd440fa8db25c8dc]::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
16: 0x7097b206c227 - rustc_middle[72ef72ec76711232]::util::bug::span_bug_fmt::<rustc_span[cd440fa8db25c8dc]::span_encoding::Span>
17: 0x7097b4d8ace0 - <rustc_middle[72ef72ec76711232]::ty::instance::Instance>::expect_resolve
18: 0x7097b1ee79f2 - rustc_monomorphize[4a4f940bf384f062]::collector::items_of_instance
19: 0x7097b51498d0 - rustc_query_impl[d82db6e05a7d2fd4]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[d82db6e05a7d2fd4]::query_impl::items_of_instance::dynamic_query::{closure#2}::{closure#0}, rustc_middle[72ef72ec76711232]::query::erase::Erased<[u8; 32usize]>>
20: 0x7097b5149134 - rustc_query_system[86c8aee4be1e78a3]::query::plumbing::try_execute_query::<rustc_query_impl[d82db6e05a7d2fd4]::DynamicConfig<rustc_query_system[86c8aee4be1e78a3]::query::caches::DefaultCache<(rustc_middle[72ef72ec76711232]::ty::instance::Instance, rustc_middle[72ef72ec76711232]::mir::mono::CollectionMode), rustc_middle[72ef72ec76711232]::query::erase::Erased<[u8; 32usize]>>, false, false, false>, rustc_query_impl[d82db6e05a7d2fd4]::plumbing::QueryCtxt, false>
21: 0x7097b5148d6c - rustc_query_impl[d82db6e05a7d2fd4]::query_impl::items_of_instance::get_query_non_incr::__rust_end_short_backtrace
22: 0x7097b51457cc - rustc_monomorphize[4a4f940bf384f062]::collector::collect_items_rec::{closure#0}
23: 0x7097b57458c8 - rustc_monomorphize[4a4f940bf384f062]::collector::collect_items_rec
24: 0x7097b4a12f2f - rustc_monomorphize[4a4f940bf384f062]::partitioning::collect_and_partition_mono_items
25: 0x7097b55e0c56 - rustc_query_impl[d82db6e05a7d2fd4]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[d82db6e05a7d2fd4]::query_impl::collect_and_partition_mono_items::dynamic_query::{closure#2}::{closure#0}, rustc_middle[72ef72ec76711232]::query::erase::Erased<[u8; 24usize]>>
26: 0x7097b55e0c37 - <rustc_query_impl[d82db6e05a7d2fd4]::query_impl::collect_and_partition_mono_items::dynamic_query::{closure#2} as core[7cf2ec004b4a7e06]::ops::function::FnOnce<(rustc_middle[72ef72ec76711232]::ty::context::TyCtxt, ())>>::call_once
27: 0x7097b55e07bc - rustc_query_system[86c8aee4be1e78a3]::query::plumbing::try_execute_query::<rustc_query_impl[d82db6e05a7d2fd4]::DynamicConfig<rustc_query_system[86c8aee4be1e78a3]::query::caches::SingleCache<rustc_middle[72ef72ec76711232]::query::erase::Erased<[u8; 24usize]>>, false, false, false>, rustc_query_impl[d82db6e05a7d2fd4]::plumbing::QueryCtxt, false>
28: 0x7097b55e04b0 - rustc_query_impl[d82db6e05a7d2fd4]::query_impl::collect_and_partition_mono_items::get_query_non_incr::__rust_end_short_backtrace
29: 0x7097b4d873d3 - rustc_codegen_ssa[1e5bf92c47e8401f]::back::symbol_export::exported_symbols_provider_local
30: 0x7097b482e3a5 - rustc_query_impl[d82db6e05a7d2fd4]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[d82db6e05a7d2fd4]::query_impl::exported_symbols::dynamic_query::{closure#2}::{closure#0}, rustc_middle[72ef72ec76711232]::query::erase::Erased<[u8; 16usize]>>
31: 0x7097b482e363 - <rustc_query_impl[d82db6e05a7d2fd4]::query_impl::exported_symbols::dynamic_query::{closure#2} as core[7cf2ec004b4a7e06]::ops::function::FnOnce<(rustc_middle[72ef72ec76711232]::ty::context::TyCtxt, rustc_span[cd440fa8db25c8dc]::def_id::CrateNum)>>::call_once
32: 0x7097b5411458 - rustc_query_system[86c8aee4be1e78a3]::query::plumbing::try_execute_query::<rustc_query_impl[d82db6e05a7d2fd4]::DynamicConfig<rustc_data_structures[f04a785ad63d9793]::vec_cache::VecCache<rustc_span[cd440fa8db25c8dc]::def_id::CrateNum, rustc_middle[72ef72ec76711232]::query::erase::Erased<[u8; 16usize]>, rustc_query_system[86c8aee4be1e78a3]::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl[d82db6e05a7d2fd4]::plumbing::QueryCtxt, false>
33: 0x7097b5410fea - rustc_query_impl[d82db6e05a7d2fd4]::query_impl::exported_symbols::get_query_non_incr::__rust_end_short_backtrace
34: 0x7097b526784b - <rustc_metadata[d3196428b34b576e]::rmeta::encoder::EncodeContext>::encode_crate_root
35: 0x7097b561dece - rustc_metadata[d3196428b34b576e]::rmeta::encoder::encode_metadata
36: 0x7097b562d576 - rustc_metadata[d3196428b34b576e]::fs::encode_and_write_metadata
37: 0x7097b562c3be - <rustc_interface[18d7993094f7ee66]::queries::Linker>::codegen_and_build_linker
38: 0x7097b5621e12 - rustc_interface[18d7993094f7ee66]::passes::create_and_enter_global_ctxt::<core[7cf2ec004b4a7e06]::option::Option<rustc_interface[18d7993094f7ee66]::queries::Linker>, rustc_driver_impl[4a0a86913583d400]::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
39: 0x7097b5604256 - rustc_interface[18d7993094f7ee66]::interface::run_compiler::<(), rustc_driver_impl[4a0a86913583d400]::run_compiler::{closure#0}>::{closure#1}
40: 0x7097b548b755 - std[d57b542980c61ed0]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[18d7993094f7ee66]::util::run_in_thread_with_globals<rustc_interface[18d7993094f7ee66]::util::run_in_thread_pool_with_globals<rustc_interface[18d7993094f7ee66]::interface::run_compiler<(), rustc_driver_impl[4a0a86913583d400]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
41: 0x7097b548bc04 - <<std[d57b542980c61ed0]::thread::Builder>::spawn_unchecked_<rustc_interface[18d7993094f7ee66]::util::run_in_thread_with_globals<rustc_interface[18d7993094f7ee66]::util::run_in_thread_pool_with_globals<rustc_interface[18d7993094f7ee66]::interface::run_compiler<(), rustc_driver_impl[4a0a86913583d400]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[7cf2ec004b4a7e06]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
42: 0x7097b548d1c1 - std::sys::pal::unix::thread::Thread::new::thread_start::hf232c9576e29b140
43: 0x7097b6cbda94 - <unknown>
44: 0x7097b6d4aa34 - clone
45: 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-01-13T23_16_23-22.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 [items_of_instance] collecting items used by `<() as Trt<alloc::string::String>>::__`
#1 [collect_and_partition_mono_items] collect_and_partition_mono_items
end of query stack
@rustbot label T-compiler, A-trait-objects, A-monomorphization, I-ICE
Metadata
Metadata
Assignees
Labels
Area: trait objects, vtable layoutArea: MonomorphizationCategory: This is a bug.Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️Status: A Minimal Complete and Verifiable Example has been found for this issueRelevant to the compiler team, which will review and decide on the PR/issue.