Fix stray trait mismatch in resolve_associated_item for AsyncFn
This commit is contained in:
parent
29f87ade9d
commit
762febdaf3
3 changed files with 29 additions and 16 deletions
|
@ -246,7 +246,7 @@ fn resolve_associated_item<'tcx>(
|
|||
span: tcx.def_span(trait_item_id),
|
||||
})
|
||||
}
|
||||
} else if tcx.fn_trait_kind_from_def_id(trait_ref.def_id).is_some() {
|
||||
} else if let Some(target_kind) = tcx.fn_trait_kind_from_def_id(trait_ref.def_id) {
|
||||
// FIXME: This doesn't check for malformed libcore that defines, e.g.,
|
||||
// `trait Fn { fn call_once(&self) { .. } }`. This is mostly for extension
|
||||
// methods.
|
||||
|
@ -265,13 +265,7 @@ fn resolve_associated_item<'tcx>(
|
|||
}
|
||||
match *rcvr_args.type_at(0).kind() {
|
||||
ty::Closure(closure_def_id, args) => {
|
||||
let trait_closure_kind = tcx.fn_trait_kind_from_def_id(trait_id).unwrap();
|
||||
Some(Instance::resolve_closure(
|
||||
tcx,
|
||||
closure_def_id,
|
||||
args,
|
||||
trait_closure_kind,
|
||||
))
|
||||
Some(Instance::resolve_closure(tcx, closure_def_id, args, target_kind))
|
||||
}
|
||||
ty::FnDef(..) | ty::FnPtr(..) => Some(Instance {
|
||||
def: ty::InstanceDef::FnPtrShim(trait_item_id, rcvr_args.type_at(0)),
|
||||
|
@ -324,13 +318,7 @@ fn resolve_associated_item<'tcx>(
|
|||
}
|
||||
}
|
||||
ty::Closure(closure_def_id, args) => {
|
||||
let trait_closure_kind = tcx.fn_trait_kind_from_def_id(trait_id).unwrap();
|
||||
Some(Instance::resolve_closure(
|
||||
tcx,
|
||||
closure_def_id,
|
||||
args,
|
||||
trait_closure_kind,
|
||||
))
|
||||
Some(Instance::resolve_closure(tcx, closure_def_id, args, target_kind))
|
||||
}
|
||||
ty::FnDef(..) | ty::FnPtr(..) => Some(Instance {
|
||||
def: ty::InstanceDef::FnPtrShim(trait_item_id, rcvr_args.type_at(0)),
|
||||
|
|
20
tests/ui/async-await/async-fn/auxiliary/block-on.rs
Normal file
20
tests/ui/async-await/async-fn/auxiliary/block-on.rs
Normal file
|
@ -0,0 +1,20 @@
|
|||
//@ edition: 2021
|
||||
|
||||
#![feature(async_closure, noop_waker)]
|
||||
|
||||
use std::future::Future;
|
||||
use std::pin::pin;
|
||||
use std::task::*;
|
||||
|
||||
pub fn block_on<T>(fut: impl Future<Output = T>) -> T {
|
||||
let mut fut = pin!(fut);
|
||||
// Poll loop, just to test the future...
|
||||
let ctx = &mut Context::from_waker(Waker::noop());
|
||||
|
||||
loop {
|
||||
match unsafe { fut.as_mut().poll(ctx) } {
|
||||
Poll::Pending => {}
|
||||
Poll::Ready(t) => break t,
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,8 +1,11 @@
|
|||
//@ aux-build:block-on.rs
|
||||
//@ edition: 2021
|
||||
//@ build-pass
|
||||
|
||||
#![feature(async_fn_traits)]
|
||||
|
||||
extern crate block_on;
|
||||
|
||||
use std::ops::AsyncFn;
|
||||
|
||||
async fn foo() {}
|
||||
|
@ -12,5 +15,7 @@ async fn call_asyncly(f: impl AsyncFn(i32) -> i32) -> i32 {
|
|||
}
|
||||
|
||||
fn main() {
|
||||
let fut = call_asyncly(|x| async move { x + 1 });
|
||||
block_on::block_on(async {
|
||||
call_asyncly(|x| async move { x + 1 }).await;
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue