diff options
| author | Kirby Linvill <kjlinvill@gmail.com> | 2023-11-14 19:19:35 -0700 |
|---|---|---|
| committer | Kirby Linvill <kjlinvill@gmail.com> | 2023-11-14 19:19:35 -0700 |
| commit | c036a10ed501cd2c4b501af03c920af3f28d360f (patch) | |
| tree | 7a90c646262ea9ec6ed061d562d7f063848bff1a | |
| parent | ae1726bfceffa271131d9ef852c1d553688aa6a4 (diff) | |
| download | rust-c036a10ed501cd2c4b501af03c920af3f28d360f.tar.gz rust-c036a10ed501cd2c4b501af03c920af3f28d360f.zip | |
Make UserTypeProjection projections Opaque
Also shifts comments explaining why Stable MIR drops an optional variant name field, for `Downcast` projection elements, to the `Place::stable` function.
| -rw-r--r-- | compiler/rustc_smir/src/rustc_smir/mod.rs | 7 | ||||
| -rw-r--r-- | compiler/stable_mir/src/mir/body.rs | 6 |
2 files changed, 7 insertions, 6 deletions
diff --git a/compiler/rustc_smir/src/rustc_smir/mod.rs b/compiler/rustc_smir/src/rustc_smir/mod.rs index a4d83debb57..1bdcc805f63 100644 --- a/compiler/rustc_smir/src/rustc_smir/mod.rs +++ b/compiler/rustc_smir/src/rustc_smir/mod.rs @@ -712,6 +712,11 @@ impl<'tcx> Stable<'tcx> for mir::PlaceElem<'tcx> { to: *to, from_end: *from_end, }, + // MIR includes an `Option<Symbol>` argument for `Downcast` that is the name of the + // variant, used for printing MIR. However this information should also be accessible + // via a lookup using the `VariantIdx`. The `Option<Symbol>` argument is therefore + // dropped when converting to Stable MIR. A brief justification for this decision can be + // found at https://github.com/rust-lang/rust/pull/117517#issuecomment-1811683486 Downcast(_, idx) => stable_mir::mir::ProjectionElem::Downcast(idx.stable(tables)), OpaqueCast(ty) => stable_mir::mir::ProjectionElem::OpaqueCast(ty.stable(tables)), Subtype(ty) => stable_mir::mir::ProjectionElem::Subtype(ty.stable(tables)), @@ -723,7 +728,7 @@ impl<'tcx> Stable<'tcx> for mir::UserTypeProjection { type T = stable_mir::mir::UserTypeProjection; fn stable(&self, _tables: &mut Tables<'tcx>) -> Self::T { - UserTypeProjection { base: self.base.as_usize(), projection: format!("{:?}", self.projs) } + UserTypeProjection { base: self.base.as_usize(), projection: opaque(&self.projs) } } } diff --git a/compiler/stable_mir/src/mir/body.rs b/compiler/stable_mir/src/mir/body.rs index a5b51ce6a34..351e7bb69c3 100644 --- a/compiler/stable_mir/src/mir/body.rs +++ b/compiler/stable_mir/src/mir/body.rs @@ -465,10 +465,6 @@ pub enum ProjectionElem { }, /// "Downcast" to a variant of an enum or a coroutine. - // - // TODO(klinvill): MIR includes an Option<Symbol> argument that is the name of the variant, used - // for printing MIR. However I don't see it used anywhere. Is such a field needed or can we just - // include the VariantIdx which could be used to recover the field name if needed? Downcast(VariantIdx), /// Like an explicit cast from an opaque type to a concrete type, but without @@ -488,7 +484,7 @@ pub enum ProjectionElem { pub struct UserTypeProjection { pub base: UserTypeAnnotationIndex, - pub projection: String, + pub projection: Opaque, } pub type Local = usize; |
