rust/compiler/rustc_middle/src
Matthias Krüger c4ee2df539
Rollup merge of #120248 - WaffleLapkin:bonk-ptr-object-casts, r=compiler-errors,oli-obk,lnicola
Make casts of pointers to trait objects stricter

This is an attempt to `fix` https://github.com/rust-lang/rust/issues/120222 and https://github.com/rust-lang/rust/issues/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 PR

This ensures that
1. Principal trait's generic arguments match (no `*const dyn Tr<A>` -> `*const dyn Tr<B>` casts, which are a problem for [#120222](https://github.com/rust-lang/rust/issues/120222))
2. Principal trait's lifetime arguments match (no `*const dyn Tr<'a>` -> `*const dyn Tr<'b>` casts, which are a problem for [#120217](https://github.com/rust-lang/rust/issues/120217))
3. No auto traits can be _added_ (this is a problem for arbitrary self types, see [this comment](https://github.com/rust-lang/rust/pull/120248#discussion_r1463835350))

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 checked

The 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`
2024-07-08 16:28:15 +02:00
..
dep_graph local_def_path_hash_to_def_id can fail 2024-06-19 07:45:47 -04:00
hir Cache hir_owner_nodes in ParentHirIterator. 2024-07-06 11:56:37 +00:00
hooks Remove #[macro_use] extern crate tracing from rustc_middle. 2024-05-23 18:02:40 +10:00
infer Simplify IntVarValue/FloatVarValue 2024-06-01 10:31:32 -04:00
middle Rollup merge of #124290 - klensy:dep-format, r=jieyouxu 2024-07-05 11:33:14 +02:00
mir Auto merge of #113128 - WaffleLapkin:become_trully_unuwuable, r=oli-obk,RalfJung 2024-07-08 04:35:04 +00:00
query Miscellaneous renaming 2024-07-02 15:48:48 -04:00
thir Track mutability of deref patterns 2024-04-20 15:59:54 +02:00
traits Get rid of the redundant elaboration in middle 2024-07-07 11:28:01 -04:00
ty Rollup merge of #120248 - WaffleLapkin:bonk-ptr-object-casts, r=compiler-errors,oli-obk,lnicola 2024-07-08 16:28:15 +02:00
util Instance::resolve -> Instance::try_resolve, and other nits 2024-07-02 17:28:03 -04:00
arena.rs Uplift PredefinedOpaquesData 2024-06-18 10:40:30 -04:00
error.rs Re-implement a type-size based limit 2024-07-02 15:48:48 -04:00
lib.rs Rollup merge of #125505 - aDotInTheVoid:middle-idl, r=pnkfelix 2024-06-05 18:21:09 +02:00
lint.rs Auto merge of #125410 - fmease:adj-lint-diag-api, r=nnethercote 2024-05-27 08:44:12 +00:00
macros.rs Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
metadata.rs Remove extern crate rustc_macros from rustc_middle. 2024-04-29 11:19:16 +10:00
tests.rs Give an item related to issue 27438 a more meaningful name 2024-04-30 22:27:19 +02:00
thir.rs Replace f16 and f128 pattern matching stubs with real implementations 2024-06-23 04:28:42 -05:00
values.rs Use Variance glob import everywhere 2024-06-12 16:25:45 -04:00