2018-12-10 05:53:46 -06:00
|
|
|
// 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
|
2022-08-17 21:13:37 -05:00
|
|
|
// follow the same lifetime-elision rules used elsewhere. See
|
2018-12-10 05:53:46 -06:00
|
|
|
// rust-lang/rust#56537
|
|
|
|
|
2019-11-03 18:00:00 -06:00
|
|
|
// check-pass
|
2018-12-10 05:53:46 -06:00
|
|
|
|
|
|
|
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"));
|
|
|
|
}
|