diff options
| author | Ralf Jung <post@ralfj.de> | 2023-09-11 10:24:53 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2023-09-11 10:24:53 +0200 |
| commit | e68e9d4a14a487bd109ec654ee3e2da1432edbd0 (patch) | |
| tree | bb7bb601005bef54cbb1d94801e3ed092d922857 | |
| parent | e00120906e6a00408c45d941b34f20c5e3277d95 (diff) | |
| download | rust-e68e9d4a14a487bd109ec654ee3e2da1432edbd0.tar.gz rust-e68e9d4a14a487bd109ec654ee3e2da1432edbd0.zip | |
explain why DispatchFromDyn does the check it does
| -rw-r--r-- | compiler/rustc_hir_analysis/src/coherence/builtin.rs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler/rustc_hir_analysis/src/coherence/builtin.rs b/compiler/rustc_hir_analysis/src/coherence/builtin.rs index 67aef0a7c43..94f3e8706fc 100644 --- a/compiler/rustc_hir_analysis/src/coherence/builtin.rs +++ b/compiler/rustc_hir_analysis/src/coherence/builtin.rs @@ -157,6 +157,14 @@ fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDef let infcx = tcx.infer_ctxt().build(); let cause = ObligationCause::misc(span, impl_did); + // Later parts of the compiler rely on all DispatchFromDyn types to be ABI-compatible with raw + // pointers. This is enforced here: we only allow impls for references, raw pointers, and things + // that are effectively repr(transparent) newtypes around types that already hav a + // DispatchedFromDyn impl. We cannot literally use repr(transparent) on those tpyes since some + // of them support an allocator, but we ensure that for the cases where the type implements this + // trait, they *do* satisfy the repr(transparent) rules, and then we assume that everything else + // in the compiler (in particular, all the call ABI logic) will treat them as repr(transparent) + // even if they do not carry that attribute. use rustc_type_ir::sty::TyKind::*; match (source.kind(), target.kind()) { (&Ref(r_a, _, mutbl_a), Ref(r_b, _, mutbl_b)) |
