#![deny(late_bound_lifetime_arguments)]
use enum_dispatch::enum_dispatch;
pub struct S<'a, T>(std::marker::PhantomData<&'a T>);
pub trait Trait<'a> {}
#[enum_dispatch]
pub trait FooAPI {
fn foo_warn<'a>(&mut self) -> &'a u32 {
unimplemented!()
}
fn foo_err<'a, 'b>(&'a self, x: &'b u32) -> &'b u32 {
x
}
fn e1<'a>(&self) {}
fn e2(&self, _e: &()) {}
fn e3(&self, _e: &()) -> &() {
unimplemented!()
}
fn e4<'a>(&self, _e: &'a ()) -> &'a () {
unimplemented!()
}
fn e5(&self) {}
fn e6(&mut self) {}
fn e7<'a, 'b>(&self) {}
fn e8<'a>(&self, _t: &'a ()) {}
fn e9<'a>(&self, _t: &()) -> &'a () {
unimplemented!()
}
fn e10<'a>(&self, _t: &mut ()) -> &'a () {
unimplemented!()
}
fn e11<'a>(&self, _t: &mut ()) -> &'a mut () {
unimplemented!()
}
fn e12<'a>(&self, _t: ()) -> &'static mut () {
unimplemented!()
}
fn e13<'a>(&self, _t: &'a S<'static, ()>) -> &'static () {
unimplemented!()
}
fn e14<'a>(&self, _t: &'static S<'a, ()>) -> &'static () {
unimplemented!()
}
fn e15<'a>(&self, _t: &'a S<'static, ()>) -> &'a () {
unimplemented!()
}
fn e16<'a>(&self, _t: &'a S<'a, ()>) -> &'static () {
unimplemented!()
}
fn e17<'a, 'b, 'c, T: Trait<'b>>(&self) {}
fn e18<'a, 'b, T: Trait<'b>>(&self) {}
fn e19<'a, 'b, T: Trait<'b>, F>(&self, _e: F)
where
F: for<'d, 'c> FnOnce(),
{
}
fn e20(&self) {}
fn e21<'a>(&self) -> &'a () {
unimplemented!()
}
fn e22<'a>(&self, _t: ()) -> &'a () {
unimplemented!()
}
fn e23<'a>(&self, _e: &'static ()) -> &'a () {
unimplemented!()
}
fn e24(&self, _t: ()) -> &'static () {
unimplemented!()
}
fn e25(&self, _t: &'static ()) -> &'static () {
unimplemented!()
}
fn e26(&self, _t: &'static S<()>) -> &'static () {
unimplemented!()
}
fn e27(&self, _t: &'static S<'static, ()>) -> &'static () {
unimplemented!()
}
fn e28<'a>(&self, _t: &'static S<'static, ()>) -> &'a () {
unimplemented!()
}
fn e29<'b, T: Trait<'b>>(&self) {}
fn e30<'b, T: Trait<'b>, F>(&self, _e: F)
where
F: for<'d, 'c> FnOnce(),
{
}
fn e31<'b, T: Trait<'b>, F>(&self, _e: F)
where
F: for<'d, 'c> FnOnce(&'b ()),
{
}
fn e32<'b, F>(&self, _e: F)
where
F: for<'d, 'c> FnOnce(&'b ()),
{
}
}
#[enum_dispatch(FooAPI)]
pub enum Foo {
Something,
}
pub struct Something(u32);
impl FooAPI for Something {}
#[test]
fn main() {
assert_eq!(*Something(2).foo_err(&8), 8);
}