//@ build-pass (FIXME(62277): could be check-pass?) //@ edition:2018 //@ compile-flags: --crate-type lib use std::future::Future; pub async fn simple_generic() {} pub trait Foo { fn foo(&self) {} } struct FooType; impl Foo for FooType {} pub async fn call_generic_bound(f: F) { f.foo() } pub async fn call_where_clause(f: F) where F: Foo, { f.foo() } pub async fn call_impl_trait(f: impl Foo) { f.foo() } pub async fn call_with_ref(f: &impl Foo) { f.foo() } pub fn async_fn_with_same_generic_params_unifies() { let mut a = call_generic_bound(FooType); a = call_generic_bound(FooType); let mut b = call_where_clause(FooType); b = call_where_clause(FooType); let mut c = call_impl_trait(FooType); c = call_impl_trait(FooType); let f_one = FooType; let f_two = FooType; let mut d = call_with_ref(&f_one); d = call_with_ref(&f_two); } pub fn simple_generic_block() -> impl Future { async move {} } pub fn call_generic_bound_block(f: F) -> impl Future { async move { f.foo() } } pub fn call_where_clause_block(f: F) -> impl Future where F: Foo, { async move { f.foo() } } pub fn call_impl_trait_block(f: impl Foo) -> impl Future { async move { f.foo() } } pub fn call_with_ref_block<'a>(f: &'a (impl Foo + 'a)) -> impl Future + 'a { async move { f.foo() } } pub fn async_block_with_same_generic_params_unifies() { let mut a = call_generic_bound_block(FooType); a = call_generic_bound_block(FooType); let mut b = call_where_clause_block(FooType); b = call_where_clause_block(FooType); let mut c = call_impl_trait_block(FooType); c = call_impl_trait_block(FooType); let f_one = FooType; let f_two = FooType; let mut d = call_with_ref_block(&f_one); d = call_with_ref_block(&f_two); }