-
Notifications
You must be signed in to change notification settings - Fork 14k
Description
Consider compile_fail/regions-nested-fns.rs:
fn ignore<T>(t: T) {}
fn nested<'x>(x: &'x int) {
let y = 3;
let mut ay = &y; //~ ERROR cannot infer an appropriate lifetime
ignore::< <'z>|&'z int|>(|z| {
ay = x;
ay = &y;
ay = z;
});
ignore::< <'z>|&'z int| -> &'z int>(|z| {
if false { return x; } //~ ERROR mismatched types
//~^ ERROR cannot infer an appropriate lifetime
if false { return ay; }
return z;
});
}
fn main() {}When you run this, in addition to various error output, you will also see messages prefixed by note:. In those messages, when a lifetime is printed, it is printed with a leading & in addition to the ' that is part of its name. For example:
[...] the lifetime cannot outlive the lifetime &'z1 as defined [...].
In my opinion, this is confusing. 'z is a lifetime, while &'z are the first three characters of some (incomplete) type expression that is missing the pointed-to type (along with a potential mut qualifier).
I suspect the leading & is arising probably some artifact of how the code is implementing the fmt::Default trait; it might also involve the use of bound_region_ptr_to_str as the implementation of how lifetimes are printed (even though the former says it is for printing ptrs, not lifetimes).
Also, there is an extra space between &'z and as defined above.