1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
// If the hidden type is a closure, we require the "outlives" bounds that appear on the
// defining site to also appear on the opaque type.
//
// It's not clear if this is the desired behavior but at least
// it's consistent and has no back-compat risk.
// check-fail
#![feature(type_alias_impl_trait)]
#![allow(dead_code)]
// requires `'a: 'b` bound
mod test1 {
type Opaque<'a, 'b> = impl Sized + 'a + 'b;
//~^ ERROR lifetime bound not satisfied
fn define<'a, 'b>() -> Opaque<'a, 'b>
where
'a: 'b,
{
|| {}
}
}
// Same as the above but through indirection `'x`
mod test2 {
type Opaque<'a, 'b> = impl Sized + 'a + 'b;
//~^ ERROR cannot infer an appropriate lifetime
fn define<'a, 'b, 'x>() -> Opaque<'a, 'b>
where
'a: 'x,
'x: 'b,
{
|| {}
}
}
// fixed version of the above
mod test2_fixed {
type Opaque<'a: 'b, 'b> = impl Sized + 'a + 'b;
fn define<'a, 'b, 'x>() -> Opaque<'a, 'b>
where
'a: 'x,
'x: 'b,
{
|| {}
}
}
// requires `T: 'static`
mod test3 {
type Opaque<T> = impl Sized;
//~^ ERROR the parameter type `T` may not live long enough
fn define<T>() -> Opaque<T>
where
T: 'static,
{
|| {}
}
}
fn main() {}
|