fix: explain E0120 better cover cases when its raised
This commit is contained in:
parent
8c3a94a1c7
commit
af7ecb6333
@ -1,7 +1,7 @@
|
||||
Drop was implemented on a trait, which is not allowed: only structs and
|
||||
enums can implement Drop.
|
||||
`Drop` was implemented on a trait object or reference, which is not allowed;
|
||||
only structs, enums, and unions can implement Drop.
|
||||
|
||||
Erroneous code example:
|
||||
Erroneous code examples:
|
||||
|
||||
```compile_fail,E0120
|
||||
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
|
||||
Drop on that:
|
||||
```compile_fail,E0120
|
||||
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 {}
|
||||
@ -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 {}
|
||||
|
||||
//or Box<MyTrait>, if you wanted an owned trait object
|
||||
struct MyWrapper<'a> { foo: &'a MyTrait }
|
||||
// or Box<dyn MyTrait>, if you wanted an owned trait object
|
||||
struct MyWrapper<'a> { foo: &'a dyn MyTrait }
|
||||
|
||||
impl <'a> Drop for MyWrapper<'a> {
|
||||
fn drop(&mut self) {}
|
||||
|
Loading…
Reference in New Issue
Block a user