diff --git a/compiler/rustc_smir/src/rustc_smir/mod.rs b/compiler/rustc_smir/src/rustc_smir/mod.rs index 3b6bacaa168ff..128ba07654458 100644 --- a/compiler/rustc_smir/src/rustc_smir/mod.rs +++ b/compiler/rustc_smir/src/rustc_smir/mod.rs @@ -1532,7 +1532,7 @@ impl<'tcx> Stable<'tcx> for ty::RegionKind<'tcx> { }) } ty::ReErased => RegionKind::ReErased, - _=> unimplemented!() + _ => unimplemented!(), } } } diff --git a/compiler/stable_mir/src/fold.rs b/compiler/stable_mir/src/fold.rs index edaf55f2aeb81..bdc80bc8aa37c 100644 --- a/compiler/stable_mir/src/fold.rs +++ b/compiler/stable_mir/src/fold.rs @@ -1,6 +1,9 @@ use std::ops::ControlFlow; -use crate::Opaque; +use crate::{ + ty::{self, BoundRegion, BoundRegionKind}, + Opaque, +}; use super::ty::{ Allocation, Binder, Const, ConstDef, ConstantKind, ExistentialPredicate, FnSig, GenericArgKind, @@ -15,6 +18,9 @@ pub trait Folder: Sized { fn fold_const(&mut self, c: &Const) -> ControlFlow { c.super_fold(self) } + fn visit_reg(&mut self, reg: &Region) -> ControlFlow { + reg.super_fold(self) + } } pub trait Foldable: Sized + Clone { @@ -107,8 +113,39 @@ impl Foldable for GenericArgs { } impl Foldable for Region { + fn fold(&self, folder: &mut V) -> ControlFlow { + folder.visit_reg(self) + } + fn super_fold(&self, folder: &mut V) -> ControlFlow { + let mut kind = self.kind.clone(); + match &mut kind { + crate::ty::RegionKind::ReEarlyBound(_) => {} + crate::ty::RegionKind::ReLateBound(_, bound_reg) => { + *bound_reg = bound_reg.fold(folder)? + } + crate::ty::RegionKind::ReStatic => {} + crate::ty::RegionKind::RePlaceholder(bound_reg) => { + bound_reg.bound = bound_reg.bound.fold(folder)? + } + crate::ty::RegionKind::ReErased => {} + } + ControlFlow::Continue(ty::Region { kind: kind }.into()) + } +} + +impl Foldable for BoundRegion { + fn super_fold(&self, folder: &mut V) -> ControlFlow { + ControlFlow::Continue(BoundRegion { var: self.var, kind: self.kind.fold(folder)? }) + } +} + +impl Foldable for BoundRegionKind { fn super_fold(&self, _folder: &mut V) -> ControlFlow { - ControlFlow::Continue(self.clone()) + match self { + BoundRegionKind::BrAnon => ControlFlow::Continue(self.clone()), + BoundRegionKind::BrNamed(_, _) => ControlFlow::Continue(self.clone()), + BoundRegionKind::BrEnv => ControlFlow::Continue(self.clone()), + } } }