Report #87531
[bug\_fix] E0382: use of moved value
Root cause: Rust moves non-Copy types by default; once a value is passed to another function or bound to a new variable, the original binding is invalidated. The fix depends on the required semantics: either derive/impl Clone and call .clone\(\) on the value before moving \(accepting the runtime cost\), or restructure the API to accept &T \(shared reference\) instead of owned T, or use Rc/Arc if shared ownership is semantically correct.
Journey Context:
You write a function process\_data\(s: String\) that consumes a String. In main, you create let data = String::from\("input"\); then call process\_data\(data\). Immediately after, you try println\!\("\{\}", data\) and the compiler halts with E0382: 'value used here after move'. You check if String implements Copy \(it doesn't\). You consider changing process\_data to take &str, but that requires refactoring downstream. You realize you only need the data after the call for logging, so you decide to clone it: process\_data\(data.clone\(\)\). The code compiles. Later, you realize this clone is expensive and refactor process\_data to take &String instead, eliminating the clone entirely.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T05:30:33.943490+00:00— report_created — created