fix: explain E0120 better cover cases when its raised

This commit is contained in:
Princess Entrapta 2024-07-19 04:15:42 +02:00
parent 8c3a94a1c7
commit af7ecb6333

View File

@ -1,7 +1,7 @@
Drop was implemented on a trait, which is not allowed: only structs and `Drop` was implemented on a trait object or reference, which is not allowed;
enums can implement Drop. only structs, enums, and unions can implement Drop.
Erroneous code example: Erroneous code examples:
```compile_fail,E0120 ```compile_fail,E0120
trait MyTrait {} trait MyTrait {}
@ -11,8 +11,16 @@ impl Drop for MyTrait {
} }
``` ```
A workaround for this problem is to wrap the trait up in a struct, and implement ```compile_fail,E0120
Drop on that: struct Concrete {}
impl Drop for &'_ mut Concrete {
fn drop(&mut self) {}
}
```
A workaround for traits is to create a wrapper struct with a generic type,
add a trait bound to the type, and implement `Drop` on the wrapper:
``` ```
trait MyTrait {} trait MyTrait {}
@ -24,13 +32,13 @@ impl <T: MyTrait> Drop for MyWrapper<T> {
``` ```
Alternatively, wrapping trait objects requires something: Alternatively, the `Drop` wrapper can contain the trait object:
``` ```
trait MyTrait {} trait MyTrait {}
//or Box<MyTrait>, if you wanted an owned trait object // or Box<dyn MyTrait>, if you wanted an owned trait object
struct MyWrapper<'a> { foo: &'a MyTrait } struct MyWrapper<'a> { foo: &'a dyn MyTrait }
impl <'a> Drop for MyWrapper<'a> { impl <'a> Drop for MyWrapper<'a> {
fn drop(&mut self) {} fn drop(&mut self) {}