// FIXME: the following cases need to suggest more things to make users reach a working end state.

mod bav {
    trait OtherTrait<'a> {}
    impl<'a> OtherTrait<'a> for &'a () {}

    trait ObjectTrait {
        type Assoc: Bar;
    }
    trait MyTrait {
        fn use_self(&self) -> &() { panic!() }
    }
    trait Bar {}

    impl MyTrait for Box<dyn ObjectTrait<Assoc = i32>> {
        fn use_self(&self) -> &() { panic!() }
    }
    impl Bar for i32 {}

    fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> {
        val.use_self() //~ ERROR cannot return value referencing function parameter
    }
}

mod bap {
    trait OtherTrait<'a> {}
    impl<'a> OtherTrait<'a> for &'a () {}

    trait ObjectTrait {
        type Assoc: Bar;
    }
    trait MyTrait {
        fn use_self(&self) -> &() { panic!() }
    }
    trait Bar {}

    impl MyTrait for Box<dyn ObjectTrait<Assoc = i32>> {
        fn use_self(&self) -> &() { panic!() }
    }
    impl Bar for i32 {}

    fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> + 'a {
        val.use_self() //~ ERROR E0515
    }
}

// This case in particular requires the user to write all of the bounds we have in `mod bax`.
mod bay {
    trait OtherTrait<'a> {}
    impl<'a> OtherTrait<'a> for &'a () {}

    trait ObjectTrait {
        type Assoc: Bar;
    }
    trait MyTrait {
        fn use_self(&self) -> &() { panic!() }
    }
    trait Bar {}

    impl MyTrait for Box<dyn ObjectTrait<Assoc = i32>> {
        fn use_self(&self) -> &() { panic!() }
    }
    impl Bar for i32 {}

    fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + 'a>) -> &'a () {
        val.use_self()
        //~^ ERROR: cannot return value referencing function parameter `val`
        //~| ERROR: borrowed data escapes outside of function
    }
}

mod bax {
    trait OtherTrait<'a> {}
    impl<'a> OtherTrait<'a> for &'a () {}

    trait ObjectTrait {
        type Assoc: Bar;
    }
    trait MyTrait<'a> {
        fn use_self(&'a self) -> &'a () { panic!() }
    }
    trait Bar {}

    impl<'a> MyTrait<'a> for Box<dyn ObjectTrait<Assoc = i32> + 'a> {
        fn use_self(&'a self) -> &'a () { panic!() }
    }
    impl Bar for i32 {}

    fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + 'a>) -> &'a () {
        val.use_self()
        //~^ ERROR: cannot return value referencing function parameter `val`
    }
}

mod baw {
    trait OtherTrait<'a> {}
    impl<'a> OtherTrait<'a> for &'a () {}

    trait ObjectTrait {
        type Assoc: Bar;
    }
    trait MyTrait {
        fn use_self(&self) -> &() { panic!() }
    }
    trait Bar {}

    impl<'a> MyTrait for Box<dyn ObjectTrait<Assoc = Box<dyn Bar>>> {
        fn use_self(&self) -> &() { panic!() }
    }

    fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = Box<dyn Bar>>>) -> impl OtherTrait<'a> + 'a{
        val.use_self() //~ ERROR E0515
    }
}

fn main() {}
