Skip to content

Commit 3bbb69e

Browse files
Jonas SchievinkJonas Schievink
Jonas Schievink
authored and
Jonas Schievink
committed
Fix miscompilation when adding default method to Future
1 parent c86e7fb commit 3bbb69e

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

compiler/rustc_ty_utils/src/instance.rs

+11-14
Original file line numberDiff line numberDiff line change
@@ -194,21 +194,18 @@ fn resolve_associated_item<'tcx>(
194194
})
195195
}
196196
traits::ImplSource::Future(future_data) => {
197-
if cfg!(debug_assertions) && tcx.item_name(trait_item_id) != sym::poll {
198-
// For compiler developers who'd like to add new items to `Future`,
199-
// you either need to generate a shim body, or perhaps return
200-
// `InstanceDef::Item` pointing to a trait default method body if
201-
// it is given a default implementation by the trait.
202-
span_bug!(
203-
tcx.def_span(future_data.generator_def_id),
204-
"no definition for `{trait_ref}::{}` for built-in async generator type",
205-
tcx.item_name(trait_item_id)
206-
)
197+
if Some(trait_item_id) == tcx.lang_items().future_poll_fn() {
198+
// `Future::poll` is generated by the compiler.
199+
Some(Instance {
200+
def: ty::InstanceDef::Item(future_data.generator_def_id),
201+
substs: future_data.substs,
202+
})
203+
} else {
204+
// All other methods are default methods of the `Future` trait.
205+
// (this assumes that `ImplSource::Future` is only used for methods on `Future`)
206+
debug_assert!(tcx.impl_defaultness(trait_item_id).has_value());
207+
Some(Instance::new(trait_item_id, rcvr_substs))
207208
}
208-
Some(Instance {
209-
def: ty::InstanceDef::Item(future_data.generator_def_id),
210-
substs: future_data.substs,
211-
})
212209
}
213210
traits::ImplSource::Closure(closure_data) => {
214211
if cfg!(debug_assertions)

0 commit comments

Comments
 (0)