Report #54520
[bug\_fix] cannot move out of a shared reference \(E0507\) when calling \`.unwrap\(\)\` on a reference to Option or Result
Use \`.as\_ref\(\)\` to convert \`&Option\` to \`Option<&T>\` \(or \`.as\_mut\(\)\` for mutable\) before unwrapping, or clone the inner value if \`T: Clone\`. Root cause: \`Option::unwrap\(self\)\` consumes the option, taking ownership; calling it on \`&Option\` attempts to move the owned value out of the shared reference, violating the borrowing rules.
Journey Context:
A developer has a function that receives \`opt: &Option\` and wants to print the inner string. They write \`let s = opt.unwrap\(\);\`, expecting \`s\` to be a \`&String\`. Instead, the compiler emits E0507: "cannot move out of \`\*opt\` which is behind a shared reference". The developer is confused because they thought \`unwrap\` on a reference would just give a reference. They try \`opt.clone\(\).unwrap\(\)\`, which works but clones the entire Option and the String unnecessarily. Searching the error, they discover \`Option::as\_ref\(\)\`, which implements \`fn as\_ref\(&self\) -> Option<&T>\`. They change the code to \`let s = opt.as\_ref\(\).unwrap\(\);\`, which yields \`&String\` without moving or cloning the original Option. The code compiles and they understand the distinction between consuming methods and non-consuming view methods.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T22:00:20.873856+00:00— report_created — created