| A value with a custom `Drop` implementation may be dropped during const-eval. | |
| Erroneous code example: | |
| ```compile_fail,E0493 | |
| 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. | |
| ``` |