Rust Error E0502: cannot borrow as mutable because it is also borrowed as immutable
Learn what Rust error E0502 means, why it happens, and how to fix it with practical code examples.
Rust Error E0502: cannot borrow as mutable because it is also borrowed as immutable
What does E0502 mean?
Rust error E0502 occurs when there is an active immutable borrow when a mutable borrow is attempted. This is a compile-time error that prevents potentially unsafe or incorrect code from running.
Broken Code
// This will cause error E0502
let mut s = String::from("hello");
let r = &s;
s.push_str(" world");
println!("{}", r);Why This Happens
The Rust compiler performs strict checks on ownership, borrowing, lifetimes, and types at compile time. When it reports E0502, it is preventing code that could lead to:
- Use-after-free bugs (dangling references)
- Data races (concurrent unsynchronized access)
- Type confusion (mixing incompatible types)
- Undefined behavior (violating Rust's safety guarantees)
How to Fix E0502
The fix is to limit the scope of the immutable borrow or restructure the code.
// Fixed version
let mut s = String::from("hello");
let r = s.clone();
s.push_str(" world");
println!("{}", r);Step-by-Step Debugging
1. Read the full error message — the compiler usually points to the exact line
2. Check the "note" lines — they often explain the root cause
3. Trace ownership flow — find where the value is created, moved, and used
4. Decide on the fix — borrow, clone, restructure, or change types
FAQ
Is E0502 a runtime error?
No. E0502 is a compile-time error. The program will not run until the issue is fixed.
Should I always use .clone() to fix this?
Not necessarily. While clone() can work, it may not be the most efficient solution. Consider borrowing, restructuring ownership, or using references instead.
Why is Rust so strict about this?
Rust guarantees memory safety without a garbage collector. The strict rules prevent entire classes of bugs at compile time, making your code more reliable.
Related Errors
See other common Rust errors in the error reference.