Fix miscompilation when adding default method to Future

This commit is contained in:
Jonas Schievink 2023-05-08 16:04:20 +02:00
parent c86e7fb60f
commit 3bbb69eaa0

View File

@ -194,21 +194,18 @@ fn resolve_associated_item<'tcx>(
}) })
} }
traits::ImplSource::Future(future_data) => { traits::ImplSource::Future(future_data) => {
if cfg!(debug_assertions) && tcx.item_name(trait_item_id) != sym::poll { if Some(trait_item_id) == tcx.lang_items().future_poll_fn() {
// For compiler developers who'd like to add new items to `Future`, // `Future::poll` is generated by the compiler.
// you either need to generate a shim body, or perhaps return Some(Instance {
// `InstanceDef::Item` pointing to a trait default method body if def: ty::InstanceDef::Item(future_data.generator_def_id),
// it is given a default implementation by the trait. substs: future_data.substs,
span_bug!( })
tcx.def_span(future_data.generator_def_id), } else {
"no definition for `{trait_ref}::{}` for built-in async generator type", // All other methods are default methods of the `Future` trait.
tcx.item_name(trait_item_id) // (this assumes that `ImplSource::Future` is only used for methods on `Future`)
) debug_assert!(tcx.impl_defaultness(trait_item_id).has_value());
Some(Instance::new(trait_item_id, rcvr_substs))
} }
Some(Instance {
def: ty::InstanceDef::Item(future_data.generator_def_id),
substs: future_data.substs,
})
} }
traits::ImplSource::Closure(closure_data) => { traits::ImplSource::Closure(closure_data) => {
if cfg!(debug_assertions) if cfg!(debug_assertions)