diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-07-19 20:03:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-19 20:03:56 +0200 |
| commit | 41d3cb6dbed196e929148cfea218fc5c03b6d989 (patch) | |
| tree | 82c0ebc6cd19eb9d5365c0659db13003cedd33df | |
| parent | 3b20150b484689e1992d5af7f1df9503d982ecf8 (diff) | |
| parent | af7ecb6333950031bf07e5a2fadc7327b7f84963 (diff) | |
| download | rust-41d3cb6dbed196e929148cfea218fc5c03b6d989.tar.gz rust-41d3cb6dbed196e929148cfea218fc5c03b6d989.zip | |
Rollup merge of #127949 - princess-entrapta:master, r=tgross35
fix: explain E0120 better cover cases when its raised Fixes https://github.com/rust-lang/rust/issues/98996 Wording change on the explain of E0120 as requested
| -rw-r--r-- | compiler/rustc_error_codes/src/error_codes/E0120.md | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0120.md b/compiler/rustc_error_codes/src/error_codes/E0120.md index dc7258d8731..aa701df5774 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0120.md +++ b/compiler/rustc_error_codes/src/error_codes/E0120.md @@ -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) {} |
