// check-pass // // Check that computing the lub works even for empty binders. fn lt<'a: 'a>() -> &'a () { &() } fn lt_in_fn<'a: 'a>() -> fn(&'a ()) { |_| () } struct Contra<'a>(fn(&'a ())); fn lt_in_contra<'a: 'a>() -> Contra<'a> { Contra(|_| ()) } fn ok<'a, 'b, 'upper, 'lower>(v: bool) where 'upper: 'a, 'upper: 'b, 'a: 'lower, 'b: 'lower, { let _: &'lower () = match v { true => lt::<'a>(), false => lt::<'b>(), }; // This errored in the past because LUB and GLB always // bailed out when encountering binders, even if they were // empty. let _: fn(&'upper ()) = match v { true => lt_in_fn::<'a>(), false => lt_in_fn::<'b>(), }; // This was already accepted, as relate didn't encounter any binders. let _: Contra<'upper> = match v { true => lt_in_contra::<'a>(), false => lt_in_contra::<'b>(), }; } fn main() {}