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