select AsyncFn traits during overloaded call op

This commit is contained in:
Michael Goulet 2023-12-20 18:03:21 +00:00
parent fde86e586d
commit 17b433351d
5 changed files with 25 additions and 1 deletions

View File

@ -208,6 +208,10 @@ language_item_table! {
FnMut, sym::fn_mut, fn_mut_trait, Target::Trait, GenericRequirement::Exact(1); FnMut, sym::fn_mut, fn_mut_trait, Target::Trait, GenericRequirement::Exact(1);
FnOnce, sym::fn_once, fn_once_trait, Target::Trait, GenericRequirement::Exact(1); FnOnce, sym::fn_once, fn_once_trait, Target::Trait, GenericRequirement::Exact(1);
AsyncFn, sym::async_fn, async_fn_trait, Target::Trait, GenericRequirement::Exact(1);
AsyncFnMut, sym::async_fn_mut, async_fn_mut_trait, Target::Trait, GenericRequirement::Exact(1);
AsyncFnOnce, sym::async_fn_once, async_fn_once_trait, Target::Trait, GenericRequirement::Exact(1);
FnOnceOutput, sym::fn_once_output, fn_once_output, Target::AssocTy, GenericRequirement::None; FnOnceOutput, sym::fn_once_output, fn_once_output, Target::AssocTy, GenericRequirement::None;
Iterator, sym::iterator, iterator_trait, Target::Trait, GenericRequirement::Exact(0); Iterator, sym::iterator, iterator_trait, Target::Trait, GenericRequirement::Exact(0);

View File

@ -220,6 +220,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
(self.tcx.lang_items().fn_trait(), Ident::with_dummy_span(sym::call), true), (self.tcx.lang_items().fn_trait(), Ident::with_dummy_span(sym::call), true),
(self.tcx.lang_items().fn_mut_trait(), Ident::with_dummy_span(sym::call_mut), true), (self.tcx.lang_items().fn_mut_trait(), Ident::with_dummy_span(sym::call_mut), true),
(self.tcx.lang_items().fn_once_trait(), Ident::with_dummy_span(sym::call_once), false), (self.tcx.lang_items().fn_once_trait(), Ident::with_dummy_span(sym::call_once), false),
(self.tcx.lang_items().async_fn_trait(), Ident::with_dummy_span(sym::async_call), true),
(
self.tcx.lang_items().async_fn_mut_trait(),
Ident::with_dummy_span(sym::async_call_mut),
true,
),
(
self.tcx.lang_items().async_fn_once_trait(),
Ident::with_dummy_span(sym::async_call_once),
false,
),
] { ] {
let Some(trait_def_id) = opt_trait_def_id else { continue }; let Some(trait_def_id) = opt_trait_def_id else { continue };

View File

@ -423,8 +423,14 @@ symbols! {
assume, assume,
assume_init, assume_init,
async_await, async_await,
async_call,
async_call_mut,
async_call_once,
async_closure, async_closure,
async_fn,
async_fn_in_trait, async_fn_in_trait,
async_fn_mut,
async_fn_once,
async_fn_track_caller, async_fn_track_caller,
async_for_loop, async_for_loop,
async_iterator, async_iterator,

View File

@ -8,6 +8,7 @@ use crate::marker::Tuple;
#[rustc_paren_sugar] #[rustc_paren_sugar]
#[fundamental] #[fundamental]
#[must_use = "async closures are lazy and do nothing unless called"] #[must_use = "async closures are lazy and do nothing unless called"]
#[cfg_attr(not(bootstrap), lang = "async_fn")]
pub trait AsyncFn<Args: Tuple>: AsyncFnMut<Args> { pub trait AsyncFn<Args: Tuple>: AsyncFnMut<Args> {
/// Future returned by [`AsyncFn::async_call`]. /// Future returned by [`AsyncFn::async_call`].
#[unstable(feature = "async_fn_traits", issue = "none")] #[unstable(feature = "async_fn_traits", issue = "none")]
@ -27,6 +28,7 @@ pub trait AsyncFn<Args: Tuple>: AsyncFnMut<Args> {
#[rustc_paren_sugar] #[rustc_paren_sugar]
#[fundamental] #[fundamental]
#[must_use = "async closures are lazy and do nothing unless called"] #[must_use = "async closures are lazy and do nothing unless called"]
#[cfg_attr(not(bootstrap), lang = "async_fn_mut")]
pub trait AsyncFnMut<Args: Tuple>: AsyncFnOnce<Args> { pub trait AsyncFnMut<Args: Tuple>: AsyncFnOnce<Args> {
/// Future returned by [`AsyncFnMut::async_call_mut`]. /// Future returned by [`AsyncFnMut::async_call_mut`].
#[unstable(feature = "async_fn_traits", issue = "none")] #[unstable(feature = "async_fn_traits", issue = "none")]
@ -46,6 +48,7 @@ pub trait AsyncFnMut<Args: Tuple>: AsyncFnOnce<Args> {
#[rustc_paren_sugar] #[rustc_paren_sugar]
#[fundamental] #[fundamental]
#[must_use = "async closures are lazy and do nothing unless called"] #[must_use = "async closures are lazy and do nothing unless called"]
#[cfg_attr(not(bootstrap), lang = "async_fn_once")]
pub trait AsyncFnOnce<Args: Tuple> { pub trait AsyncFnOnce<Args: Tuple> {
/// Future returned by [`AsyncFnOnce::async_call_once`]. /// Future returned by [`AsyncFnOnce::async_call_once`].
#[unstable(feature = "async_fn_traits", issue = "none")] #[unstable(feature = "async_fn_traits", issue = "none")]

View File

@ -8,7 +8,7 @@ use std::ops::AsyncFn;
async fn foo() {} async fn foo() {}
async fn call_asyncly(f: impl AsyncFn(i32) -> i32) -> i32 { async fn call_asyncly(f: impl AsyncFn(i32) -> i32) -> i32 {
f.async_call((1i32,)).await f(1).await
} }
fn main() { fn main() {