Skip to content

Commit

Permalink
add real folder to Region
Browse files Browse the repository at this point in the history
  • Loading branch information
ouz-a committed Sep 28, 2023
1 parent da2f897 commit bb17fe8
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_smir/src/rustc_smir/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1532,7 +1532,7 @@ impl<'tcx> Stable<'tcx> for ty::RegionKind<'tcx> {
})
}
ty::ReErased => RegionKind::ReErased,
_=> unimplemented!()
_ => unimplemented!(),
}
}
}
Expand Down
41 changes: 39 additions & 2 deletions compiler/stable_mir/src/fold.rs
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -15,6 +18,9 @@ pub trait Folder: Sized {
fn fold_const(&mut self, c: &Const) -> ControlFlow<Self::Break, Const> {
c.super_fold(self)
}
fn visit_reg(&mut self, reg: &Region) -> ControlFlow<Self::Break, Region> {
reg.super_fold(self)
}
}

pub trait Foldable: Sized + Clone {
Expand Down Expand Up @@ -107,8 +113,39 @@ impl Foldable for GenericArgs {
}

impl Foldable for Region {
fn fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
folder.visit_reg(self)
}
fn super_fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
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<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
ControlFlow::Continue(BoundRegion { var: self.var, kind: self.kind.fold(folder)? })
}
}

impl Foldable for BoundRegionKind {
fn super_fold<V: Folder>(&self, _folder: &mut V) -> ControlFlow<V::Break, Self> {
ControlFlow::Continue(self.clone())
match self {
BoundRegionKind::BrAnon => ControlFlow::Continue(self.clone()),
BoundRegionKind::BrNamed(_, _) => ControlFlow::Continue(self.clone()),
BoundRegionKind::BrEnv => ControlFlow::Continue(self.clone()),
}
}
}

Expand Down

0 comments on commit bb17fe8

Please sign in to comment.