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` 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` 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 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;