I\'m pretty confused by the errors from this simple code (Playground):
fn main() {
let a = fn1(\"test123\");
}
fn fn1(a1: &str) -> &str {
A long time ago, when a function returned a borrowed pointer, the compiler inferred the 'static lifetime, so fn2 would compile successfully. Since then, lifetime elision has been implemented. Lifetime elision is a process where the compiler will automatically link the lifetime of an input parameter to the lifetime of the output value without having to explicitly name it.
For example, fn1, without lifetime elision, would be written like this:
fn fn1<'a>(a1: &'a str) -> &'a str {
let a = fn2();
a
}
However, fn2 has no parameters that are borrowed pointers or structs with lifetime parameters (indeed, it has no parameters at all). You must therefore mention the lifetime explicitly. Since you're returning a string literal, the correct lifetime is 'static (as suggested by the compiler).
fn fn2() -> &'static str {
"12345abc"
}