| // 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")); | |
| } |