blob: 240ff6c270413dadd68169cd41e1eb33cf8b50f3 [file] [log] [blame]
//@ 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();
}