Rust errors / Ownership and borrowing
Rust compiler error · checked with rustc 1.99.0
Rust error E0764: mutable borrows of temporaries that have their lifetime extended until the end of the program are not allowed
What it meansA mutable reference was used in a constant.
What rustc prints
error[E0764]: mutable borrows of temporaries that have their lifetime extended until the end of the program are not allowed --> main.rs:2:39 | 2 | const OH_NO: &'static mut usize = &mut 1; // error! | ^^^^^^ this mutable borrow refers to such a temporary | = note: temporaries in constants and statics can have their lifetime extended until the end of the program = note: to avoid accidentally creating global mutable state, such temporaries must be immutable = help: if you really want global mutable state, try replacing the temporary by an interior mutable `static` or a `static mut`
Real output of rustc 1.99.0 compiling the official example below (2021 edition). Your names and line numbers will differ; the first line is the part to match.
The compiler team's explanation
A mutable reference was used in a constant.
Erroneous code example:
fn main() {
const OH_NO: &'static mut usize = &mut 1; // error!
}
Mutable references (&mut) can only be used in constant functions, not statics or constants. This limitation exists to prevent the creation of constants that have a mutable reference in their final value. If you had a constant of &mut i32 type, you could modify the value through that reference, making the constant essentially mutable.
While there could be a more fine-grained scheme in the future that allows mutable references if they are not "leaked" to the final value, a more conservative approach was chosen for now. const fn do not have this problem, as the borrow checker will prevent the const fn from returning new mutable references.
Remember: you cannot use a function call inside a constant or static. However, you can totally use it in constant functions:
const fn foo(x: usize) -> usize {
let mut y = 1;
let z = &mut y;
*z += x;
y
}
fn main() {
const FOO: usize = foo(10); // ok!
}From rustc --explain E0764 (1.99.0), part of the Rust project, MIT or Apache-2.0. Official page.
Related errors
- E0382borrow of moved value
- E0499cannot borrow as mutable more than once at a time
- E0502cannot borrow as mutable because it is also borrowed as immutable
- E0106missing lifetime specifier
- E0745cannot take address of a temporary
- E0747type provided when a lifetime was expected
- E0794cannot specify lifetime arguments explicitly if late bound lifetime parameters are present
- E0803cannot infer an appropriate lifetime for lifetime parameter '_ in generic type due to conflicting requirements
Up next
Often hit nextE0382: borrow of moved valueA related error from the same family.Read it next →Did this answer your question?