// build-pass (FIXME(62277): could be check-pass?)
// edition:2018
// compile-flags: --crate-type lib

use std::future::Future;

pub async fn simple_generic<T>() {}

pub trait Foo {
    fn foo(&self) {}
}

struct FooType;
impl Foo for FooType {}

pub async fn call_generic_bound<F: Foo>(f: F) {
    f.foo()
}

pub async fn call_where_clause<F>(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<T>() -> impl Future<Output = ()> {
    async move {}
}

pub fn call_generic_bound_block<F: Foo>(f: F) -> impl Future<Output = ()> {
    async move { f.foo() }
}

pub fn call_where_clause_block<F>(f: F) -> impl Future<Output = ()>
where
    F: Foo,
{
    async move { f.foo() }
}

pub fn call_impl_trait_block(f: impl Foo) -> impl Future<Output = ()> {
    async move { f.foo() }
}

pub fn call_with_ref_block<'a>(f: &'a (impl Foo + 'a)) -> impl Future<Output = ()> + '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);
}
