forked fromrust-lang/rust
- Notifications
You must be signed in to change notification settings - Fork0
Commit57cea32
authored
Rollup merge ofrust-lang#120248 - WaffleLapkin:bonk-ptr-object-casts, r=compiler-errors,oli-obk,lnicola
Make casts of pointers to trait objects stricterThis is an attempt to `fix`rust-lang#120222 andrust-lang#120217.This is done by adding restrictions on casting pointers to trait objects.Before this PR the rules were as follows:> When casting `*const X<dyn A>` -> `*const Y<dyn B>`, principal traits in `A` and `B` must refer to the same trait definition (or no trait).With this PR the rules are changed to> When casting `*const X<dyn Src>` -> `*const Y<dyn Dst>`> - if `Dst` has a principal trait `DstP`,> - `Src` must have a principal trait `SrcP`> - `dyn SrcP` and `dyn DstP` must be the same type (modulo the trait object lifetime, `dyn T+'a` -> `dyn T+'b` is allowed)> - Auto traits in `Dst` must be a subset of auto traits in `Src`> - Not adhering to this is currently a FCW (warn-by-default + `FutureReleaseErrorReportInDeps`), instead of an error> - if `Src` has a principal trait `Dst` must as well> - this restriction will be removed in a follow up PRThis ensures that1. Principal trait's generic arguments match (no `*const dyn Tr<A>` -> `*const dyn Tr<B>` casts, which are a problem for [rust-lang#120222](rust-lang#120222))2. Principal trait's lifetime arguments match (no `*const dyn Tr<'a>` -> `*const dyn Tr<'b>` casts, which are a problem for [rust-lang#120217](rust-lang#120217))3. No auto traits can be _added_ (this is a problem for arbitrary self types, see [this comment](rust-lang#120248 (comment)))Some notes: - We only care about the metadata/last field, so you can still cast `*const dyn T` to `*const WithHeader<dyn T>`, etc- The lifetime of the trait object itself (`dyn A + 'lt`) is not checked, so you can still cast `*mut FnOnce() + '_` to `*mut FnOnce() + 'static`, etc - This feels fishy, but I couldn't come up with a reason it must be checkedThe diagnostics are currently not great, to say the least, but as far as I can tell this correctly fixes the issues.cc `@oli-obk` `@compiler-errors` `@lcnr`1 file changed
+3
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2374 | 2374 | | |
2375 | 2375 | | |
2376 | 2376 | | |
2377 | | - | |
| 2377 | + | |
2378 | 2378 | | |
2379 | 2379 | | |
2380 | 2380 | | |
| |||
2387 | 2387 | | |
2388 | 2388 | | |
2389 | 2389 | | |
2390 | | - | |
2391 | | - | |
| 2390 | + | |
| 2391 | + | |
2392 | 2392 | | |
2393 | 2393 | | |
2394 | 2394 | | |
| |||
0 commit comments
Comments
(0)