#![feature(async_await)]
use async_trait::async_trait;
#[async_trait]
trait Trait {
type Assoc;
async fn selfvalue(self)
where
Self: Sized,
{
}
async fn selfref(&self) {}
async fn selfmut(&mut self) {}
async fn required() -> Self::Assoc;
async fn elided_lifetime(_x: &str) {}
async fn explicit_lifetime<'a>(_x: &'a str) {}
async fn generic_type_param<T: Send>(x: Box<T>) -> T {
*x
}
async fn calls(&self) {
self.selfref().await;
Self::elided_lifetime("").await;
<Self>::elided_lifetime("").await;
}
async fn calls_mut(&mut self) {
self.selfmut().await;
}
}
struct Struct;
#[async_trait]
impl Trait for Struct {
type Assoc = ();
async fn selfvalue(self) {}
async fn selfref(&self) {}
async fn selfmut(&mut self) {}
async fn required() -> Self::Assoc {}
async fn elided_lifetime(_x: &str) {}
async fn explicit_lifetime<'a>(_x: &'a str) {}
async fn generic_type_param<T: Send>(x: Box<T>) -> T {
*x
}
async fn calls(&self) {
self.selfref().await;
Self::elided_lifetime("").await;
<Self>::elided_lifetime("").await;
}
async fn calls_mut(&mut self) {
self.selfmut().await;
}
}
pub async fn test() {
let mut s = Struct;
s.selfref().await;
s.selfmut().await;
s.selfvalue().await;
Struct::required().await;
Struct::elided_lifetime("").await;
Struct::explicit_lifetime("").await;
Struct::generic_type_param(Box::new("")).await;
let mut s = Struct;
s.calls().await;
s.calls_mut().await;
}
pub async fn test_object_safe_without_default() {
#[async_trait]
trait ObjectSafe {
async fn f(&self);
}
#[async_trait]
impl ObjectSafe for Struct {
async fn f(&self) {}
}
let object = &Struct as &dyn ObjectSafe;
object.f().await;
}
pub async fn test_object_safe_with_default() {
#[async_trait]
trait ObjectSafe: Sync {
async fn f(&self) {}
}
#[async_trait]
impl ObjectSafe for Struct {
async fn f(&self) {}
}
let object = &Struct as &dyn ObjectSafe;
object.f().await;
}
pub async fn test_object_no_send() {
#[async_trait(?Send)]
trait ObjectSafe: Sync {
async fn f(&self) {}
}
#[async_trait(?Send)]
impl ObjectSafe for Struct {
async fn f(&self) {}
}
let object = &Struct as &dyn ObjectSafe;
object.f().await;
}
mod issue1 {
use async_trait::async_trait;
#[async_trait]
trait Issue1 {
async fn f<U>(&self);
}
#[async_trait]
impl<T: Sync> Issue1 for Vec<T> {
async fn f<U>(&self) {}
}
}
mod issue2 {
use async_trait::async_trait;
use std::future::Future;
#[async_trait]
pub trait Issue2: Future {
async fn flatten(self) -> <Self::Output as Future>::Output
where
Self::Output: Future + Send,
Self: Sized,
{
let nested_future = self.await;
nested_future.await
}
}
}
mod issue9 {
use async_trait::async_trait;
#[async_trait]
pub trait Issue9: Sized + Send {
async fn f(_x: Self) {}
}
}
mod issue11 {
use async_trait::async_trait;
use std::sync::Arc;
#[async_trait]
trait Issue11 {
async fn example(self: Arc<Self>);
}
struct Struct;
#[async_trait]
impl Issue11 for Struct {
async fn example(self: Arc<Self>) {}
}
}
mod issue15 {
use async_trait::async_trait;
use std::marker::PhantomData;
trait Trait {}
#[async_trait]
trait Issue15 {
async fn myfn(&self, _: PhantomData<dyn Trait + Send>) {}
}
}
mod issue17 {
use async_trait::async_trait;
#[async_trait]
trait Issue17 {
async fn f(&self);
}
struct Struct {
string: String,
}
#[async_trait]
impl Issue17 for Struct {
async fn f(&self) {
println!("{}", self.string);
}
}
}