Rust errors / Ownership and borrowing
Rust compiler error · checked with rustc 1.99.0
Rust error E0493: destructor of `(DropType, DropType)` cannot be evaluated at compile-time
What it meansA value with a custom Drop implementation may be dropped during const-eval.
What rustc prints
error[E0493]: destructor of `(DropType, DropType)` cannot be evaluated at compile-time
--> main.rs:13:33
|
13 | static FOO: Foo = Foo { field1: (DropType::A, DropType::A).1 }; // error!
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ - value is dropped here
| |
| the destructor for this type cannot be evaluated in staticsReal 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 value with a custom Drop implementation may be dropped during const-eval.
Erroneous code example:
enum DropType {
A,
}
impl Drop for DropType {
fn drop(&mut self) {}
}
struct Foo {
field1: DropType,
}
static FOO: Foo = Foo { field1: (DropType::A, DropType::A).1 }; // error!
The problem here is that if the given type or one of its fields implements the Drop trait, this Drop implementation cannot be called within a const context since it may run arbitrary, non-const-checked code. To prevent this issue, ensure all values with a custom Drop implementation escape the initializer.
enum DropType {
A,
}
impl Drop for DropType {
fn drop(&mut self) {}
}
struct Foo {
field1: DropType,
}
static FOO: Foo = Foo { field1: DropType::A }; // We initialize all fields
// by hand.From rustc --explain E0493 (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
- E0491in type `&'a Foo<'b>`, reference has a longer lifetime than the data it references
- E0492interior mutable shared borrows of temporaries that have their lifetime extended until the end of the program are not allowed
- E0496lifetime name `'a` shadows a lifetime name that is already in scope
Up next
Often hit nextE0382: borrow of moved valueA related error from the same family.Read it next →Did this answer your question?