]> git.lizzy.rs Git - rust.git/blob - src/test/ui/lub-glb/empty-binders.rs
Rollup merge of #98640 - cuviper:stable-rust-analyzer, r=Mark-Simulacrum
[rust.git] / src / test / ui / lub-glb / empty-binders.rs
1 // check-pass
2 //
3 // Check that computing the lub works even for empty binders.
4 fn lt<'a: 'a>() -> &'a () {
5     &()
6 }
7
8 fn lt_in_fn<'a: 'a>() -> fn(&'a ()) {
9     |_| ()
10 }
11
12 struct Contra<'a>(fn(&'a ()));
13 fn lt_in_contra<'a: 'a>() -> Contra<'a> {
14     Contra(|_| ())
15 }
16
17 fn ok<'a, 'b, 'upper, 'lower>(v: bool)
18 where
19     'upper: 'a,
20     'upper: 'b,
21     'a: 'lower,
22     'b: 'lower,
23
24 {
25     let _: &'lower () = match v {
26         true => lt::<'a>(),
27         false => lt::<'b>(),
28     };
29
30     // This errored in the past because LUB and GLB always
31     // bailed out when encountering binders, even if they were
32     // empty.
33     let _: fn(&'upper ()) = match v {
34         true => lt_in_fn::<'a>(),
35         false => lt_in_fn::<'b>(),
36     };
37
38     // This was already accepted, as relate didn't encounter any binders.
39     let _: Contra<'upper> = match v {
40         true => lt_in_contra::<'a>(),
41         false => lt_in_contra::<'b>(),
42     };
43 }
44
45 fn main() {}