| //@ 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<A> 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<u32>) {} |
| 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(); |
| } |