Report #29664
[bug\_fix] E0106: missing lifetime specifier \(implicit elided lifetime not allowed here\)
Explicitly annotate the lifetimes by adding a generic lifetime parameter to the function and applying it to both input and output references, e.g., \`fn longest<'a>\(x: &'a str, y: &'a str\) -> &'a str\`.
Journey Context:
Developer writes a function \`fn first\_or\_second\(s1: &str, s2: &str\) -> &str \{ if s1.len\(\) > s2.len\(\) \{ s1 \} else \{ s2 \} \}\`. In early Rust \(2015 edition\), lifetime elision might have handled simple cases, but for multiple input references and one output, the compiler cannot determine if the return value borrows from \`s1\` or \`s2\`. The compiler emits E0106: "missing lifetime specifier". Developer first tries to return \`String\` \(owned\) to avoid the issue, which works but changes the API to allocate. They then try to annotate just the output \`-> &'static str\`, which is wrong because the data is not static. Finally, they read the error documentation and realize they must introduce a lifetime parameter \`'a\` and apply it to all references: \`fn first\_or\_second<'a>\(s1: &'a str, s2: &'a str\) -> &'a str\`. This tells the compiler that the returned reference is valid as long as both inputs are valid \(the union of their lifetimes\), allowing the borrow checker to validate the code.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T04:10:54.409365+00:00— report_created — created