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
66
67
|
// This is a collection of examples where a function's formal
// parameter has an explicit lifetime and a closure within that
// function returns that formal parameter. The closure's return type,
// to be correctly inferred, needs to include the lifetime introduced
// by the function.
//
// This works today, which precludes changing things so that closures
// follow the same lifetime-elision rules used elsewhere. See
// rust-lang/rust#56537
// check-pass
fn willy_no_annot<'w>(p: &'w str, q: &str) -> &'w str {
let free_dumb = |_x| { p }; // no type annotation at all
let hello = format!("Hello");
free_dumb(&hello)
}
fn willy_ret_type_annot<'w>(p: &'w str, q: &str) -> &'w str {
let free_dumb = |_x| -> &str { p }; // type annotation on the return type
let hello = format!("Hello");
free_dumb(&hello)
}
fn willy_ret_region_annot<'w>(p: &'w str, q: &str) -> &'w str {
let free_dumb = |_x| -> &'w str { p }; // type+region annotation on return type
let hello = format!("Hello");
free_dumb(&hello)
}
fn willy_arg_type_ret_type_annot<'w>(p: &'w str, q: &str) -> &'w str {
let free_dumb = |_x: &str| -> &str { p }; // type annotation on arg and return types
let hello = format!("Hello");
free_dumb(&hello)
}
fn willy_arg_type_ret_region_annot<'w>(p: &'w str, q: &str) -> &'w str {
let free_dumb = |_x: &str| -> &'w str { p }; // fully annotated
let hello = format!("Hello");
free_dumb(&hello)
}
fn main() {
let world = format!("World");
let w1: &str = {
let hello = format!("He11o");
willy_no_annot(&world, &hello)
};
let w2: &str = {
let hello = format!("He22o");
willy_ret_type_annot(&world, &hello)
};
let w3: &str = {
let hello = format!("He33o");
willy_ret_region_annot(&world, &hello)
};
let w4: &str = {
let hello = format!("He44o");
willy_arg_type_ret_type_annot(&world, &hello)
};
let w5: &str = {
let hello = format!("He55o");
willy_arg_type_ret_region_annot(&world, &hello)
};
assert_eq!((w1, w2, w3, w4, w5),
("World","World","World","World","World"));
}
|