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.
This commit is contained in:
Kirby Linvill 2023-11-14 19:19:35 -07:00
parent ae1726bfce
commit c036a10ed5
No known key found for this signature in database
GPG Key ID: E304CE3F028E6E3F
2 changed files with 7 additions and 6 deletions

View File

@ -712,6 +712,11 @@ impl<'tcx> Stable<'tcx> for mir::PlaceElem<'tcx> {
to: *to, to: *to,
from_end: *from_end, 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)), Downcast(_, idx) => stable_mir::mir::ProjectionElem::Downcast(idx.stable(tables)),
OpaqueCast(ty) => stable_mir::mir::ProjectionElem::OpaqueCast(ty.stable(tables)), OpaqueCast(ty) => stable_mir::mir::ProjectionElem::OpaqueCast(ty.stable(tables)),
Subtype(ty) => stable_mir::mir::ProjectionElem::Subtype(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; type T = stable_mir::mir::UserTypeProjection;
fn stable(&self, _tables: &mut Tables<'tcx>) -> Self::T { 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) }
} }
} }

View File

@ -465,10 +465,6 @@ pub enum ProjectionElem {
}, },
/// "Downcast" to a variant of an enum or a coroutine. /// "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), Downcast(VariantIdx),
/// Like an explicit cast from an opaque type to a concrete type, but without /// 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 struct UserTypeProjection {
pub base: UserTypeAnnotationIndex, pub base: UserTypeAnnotationIndex,
pub projection: String, pub projection: Opaque,
} }
pub type Local = usize; pub type Local = usize;