rust/compiler/rustc_errors/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
..
json Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
markdown Add blank lines after module-level //! comments. 2024-06-20 09:23:20 +10:00
annotate_snippet_emitter_writer.rs Rename DiagnosticMessage as DiagMessage. 2024-03-05 12:14:49 +11:00
codes.rs Stop using String for error codes. 2024-01-29 07:41:41 +11:00
diagnostic_impls.rs Make DiagSymbolList more generic 2024-07-04 17:57:31 +02:00
diagnostic.rs Automatically taint InferCtxt when errors are emitted 2024-06-26 16:01:45 +00:00
emitter.rs Properly handle removal suggestion rendering 2024-07-04 05:04:48 +00:00
error.rs Minor visibility and formatting improvements. 2024-02-29 16:30:09 +11:00
json.rs Clarify comment on changing to warn future breakage items 2024-06-26 17:00:46 +02:00
lib.rs Document new field and function 2024-06-27 09:45:26 +00:00
lock.rs windows bump to 0.52 2024-02-18 16:02:16 +03:00
registry.rs Stop using String for error codes. 2024-01-29 07:41:41 +11:00
snippet.rs Remove extern crate rustc_macros from numerous crates. 2024-04-29 10:21:54 +10:00
styled_buffer.rs Replace some _ == _ || _ == _s with matches!(_, _ | _)s 2023-01-30 12:26:26 +00:00
tests.rs Rename DiagnosticMessage as DiagMessage. 2024-03-05 12:14:49 +11:00
translation.rs Remove extern crate tracing from numerous crates. 2024-04-30 16:47:49 +10:00