//@ known-bug: #110534 //@ edition:2021 use core::cell::Ref; struct System; trait IntoSystem { fn into_system(self) -> System; } impl IntoSystem for fn(Ref<'_, u32>) { fn into_system(self) -> System { System } } impl IntoSystem for fn(A) where // n.b. No `Ref<'_, u32>` can satisfy this bound A: 'static + for<'x> MaybeBorrowed<'x, Output = A>, { fn into_system(self) -> System { System } } //--------------------------------------------------- trait MaybeBorrowed<'a> { type Output: 'a; } // If you comment this out you'll see the compiler chose to look at the // fn(A) implementation of IntoSystem above impl<'a, 'b> MaybeBorrowed<'a> for Ref<'b, u32> { type Output = Ref<'a, u32>; } // --------------------------------------------- fn main() { fn sys_ref(_age: Ref) {} let _sys_c = (sys_ref as fn(_)).into_system(); // properly fails // let _sys_c = (sys_ref as fn(Ref<'static, u32>)).into_system(); // properly succeeds // let _sys_c = (sys_ref as fn(Ref<'_, u32>)).into_system(); }