Rollup merge of #116024 - ouz-a:smir_region, r=oli-obk
Implement Region for smir Adds Region and it's relevant types to smir and covers them with stable implementation r? `@oli-obk`
This commit is contained in:
commit
26be5754c6
@ -86,6 +86,10 @@ pub fn impl_def(&mut self, did: DefId) -> stable_mir::ty::ImplDef {
|
||||
stable_mir::ty::ImplDef(self.create_def_id(did))
|
||||
}
|
||||
|
||||
pub fn region_def(&mut self, did: DefId) -> stable_mir::ty::RegionDef {
|
||||
stable_mir::ty::RegionDef(self.create_def_id(did))
|
||||
}
|
||||
|
||||
pub fn prov(&mut self, aid: AllocId) -> stable_mir::ty::Prov {
|
||||
stable_mir::ty::Prov(self.create_alloc_id(aid))
|
||||
}
|
||||
|
@ -7,7 +7,8 @@
|
||||
//!
|
||||
//! For now, we are developing everything inside `rustc`, thus, we keep this module private.
|
||||
|
||||
use hir::def::DefKind;
|
||||
use crate::rustc_smir::hir::def::DefKind;
|
||||
use crate::rustc_smir::stable_mir::ty::{BoundRegion, EarlyBoundRegion, Region};
|
||||
use rustc_hir as hir;
|
||||
use rustc_middle::mir;
|
||||
use rustc_middle::mir::interpret::{alloc_range, AllocId};
|
||||
@ -1500,9 +1501,39 @@ fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
impl<'tcx> Stable<'tcx> for ty::Region<'tcx> {
|
||||
type T = stable_mir::ty::Region;
|
||||
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
// FIXME: add a real implementation of stable regions
|
||||
opaque(self)
|
||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||
Region { kind: self.kind().stable(tables) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for ty::RegionKind<'tcx> {
|
||||
type T = stable_mir::ty::RegionKind;
|
||||
|
||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||
use stable_mir::ty::RegionKind;
|
||||
match self {
|
||||
ty::ReEarlyBound(early_reg) => RegionKind::ReEarlyBound(EarlyBoundRegion {
|
||||
def_id: tables.region_def(early_reg.def_id),
|
||||
index: early_reg.index,
|
||||
name: early_reg.name.to_string(),
|
||||
}),
|
||||
ty::ReLateBound(db_index, bound_reg) => RegionKind::ReLateBound(
|
||||
db_index.as_u32(),
|
||||
BoundRegion { var: bound_reg.var.as_u32(), kind: bound_reg.kind.stable(tables) },
|
||||
),
|
||||
ty::ReStatic => RegionKind::ReStatic,
|
||||
ty::RePlaceholder(place_holder) => {
|
||||
RegionKind::RePlaceholder(stable_mir::ty::Placeholder {
|
||||
universe: place_holder.universe.as_u32(),
|
||||
bound: BoundRegion {
|
||||
var: place_holder.bound.var.as_u32(),
|
||||
kind: place_holder.bound.kind.stable(tables),
|
||||
},
|
||||
})
|
||||
}
|
||||
ty::ReErased => RegionKind::ReErased,
|
||||
_ => unreachable!("{self:?}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,17 +4,20 @@
|
||||
|
||||
use super::ty::{
|
||||
Allocation, Binder, Const, ConstDef, ConstantKind, ExistentialPredicate, FnSig, GenericArgKind,
|
||||
GenericArgs, Promoted, RigidTy, TermKind, Ty, TyKind, UnevaluatedConst,
|
||||
GenericArgs, Promoted, Region, RigidTy, TermKind, Ty, TyKind, UnevaluatedConst,
|
||||
};
|
||||
|
||||
pub trait Folder: Sized {
|
||||
type Break;
|
||||
fn visit_ty(&mut self, ty: &Ty) -> ControlFlow<Self::Break, Ty> {
|
||||
fn fold_ty(&mut self, ty: &Ty) -> ControlFlow<Self::Break, Ty> {
|
||||
ty.super_fold(self)
|
||||
}
|
||||
fn fold_const(&mut self, c: &Const) -> ControlFlow<Self::Break, Const> {
|
||||
c.super_fold(self)
|
||||
}
|
||||
fn fold_reg(&mut self, reg: &Region) -> ControlFlow<Self::Break, Region> {
|
||||
reg.super_fold(self)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Foldable: Sized + Clone {
|
||||
@ -26,7 +29,7 @@ fn fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
|
||||
impl Foldable for Ty {
|
||||
fn fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
folder.visit_ty(self)
|
||||
folder.fold_ty(self)
|
||||
}
|
||||
fn super_fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
let mut kind = self.kind();
|
||||
@ -106,6 +109,15 @@ fn super_fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
}
|
||||
}
|
||||
|
||||
impl Foldable for Region {
|
||||
fn fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
folder.fold_reg(self)
|
||||
}
|
||||
fn super_fold<V: Folder>(&self, _: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
ControlFlow::Continue(self.clone())
|
||||
}
|
||||
}
|
||||
|
||||
impl Foldable for GenericArgKind {
|
||||
fn super_fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
let mut this = self.clone();
|
||||
@ -136,7 +148,10 @@ fn super_fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
}
|
||||
RigidTy::Slice(inner) => *inner = inner.fold(folder)?,
|
||||
RigidTy::RawPtr(ty, _) => *ty = ty.fold(folder)?,
|
||||
RigidTy::Ref(_, ty, _) => *ty = ty.fold(folder)?,
|
||||
RigidTy::Ref(reg, ty, _) => {
|
||||
*reg = reg.fold(folder)?;
|
||||
*ty = ty.fold(folder)?
|
||||
}
|
||||
RigidTy::FnDef(_, args) => *args = args.fold(folder)?,
|
||||
RigidTy::FnPtr(sig) => *sig = sig.fold(folder)?,
|
||||
RigidTy::Closure(_, args) => *args = args.fold(folder)?,
|
||||
@ -214,7 +229,7 @@ pub enum Never {}
|
||||
impl Folder for GenericArgs {
|
||||
type Break = Never;
|
||||
|
||||
fn visit_ty(&mut self, ty: &Ty) -> ControlFlow<Self::Break, Ty> {
|
||||
fn fold_ty(&mut self, ty: &Ty) -> ControlFlow<Self::Break, Ty> {
|
||||
ControlFlow::Continue(match ty.kind() {
|
||||
TyKind::Param(p) => self[p],
|
||||
_ => *ty,
|
||||
|
@ -1,7 +1,7 @@
|
||||
use super::{
|
||||
mir::Safety,
|
||||
mir::{Body, Mutability},
|
||||
with, AllocId, DefId,
|
||||
with, AllocId, DefId, Symbol,
|
||||
};
|
||||
use crate::Opaque;
|
||||
use std::fmt::{self, Debug, Formatter};
|
||||
@ -34,7 +34,46 @@ pub struct Const {
|
||||
}
|
||||
|
||||
type Ident = Opaque;
|
||||
pub type Region = Opaque;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Region {
|
||||
pub kind: RegionKind,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum RegionKind {
|
||||
ReEarlyBound(EarlyBoundRegion),
|
||||
ReLateBound(DebruijnIndex, BoundRegion),
|
||||
ReStatic,
|
||||
RePlaceholder(Placeholder<BoundRegion>),
|
||||
ReErased,
|
||||
}
|
||||
|
||||
pub(crate) type DebruijnIndex = u32;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct EarlyBoundRegion {
|
||||
pub def_id: RegionDef,
|
||||
pub index: u32,
|
||||
pub name: Symbol,
|
||||
}
|
||||
|
||||
pub(crate) type BoundVar = u32;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct BoundRegion {
|
||||
pub var: BoundVar,
|
||||
pub kind: BoundRegionKind,
|
||||
}
|
||||
|
||||
pub(crate) type UniverseIndex = u32;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Placeholder<T> {
|
||||
pub universe: UniverseIndex,
|
||||
pub bound: T,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
pub struct Span(pub usize);
|
||||
|
||||
@ -152,6 +191,9 @@ pub fn body(&self) -> Body {
|
||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||
pub struct ImplDef(pub DefId);
|
||||
|
||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||
pub struct RegionDef(pub DefId);
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct GenericArgs(pub Vec<GenericArgKind>);
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
use super::ty::{
|
||||
Allocation, Binder, Const, ConstDef, ExistentialPredicate, FnSig, GenericArgKind, GenericArgs,
|
||||
Promoted, RigidTy, TermKind, Ty, UnevaluatedConst,
|
||||
Promoted, Region, RigidTy, TermKind, Ty, UnevaluatedConst,
|
||||
};
|
||||
|
||||
pub trait Visitor: Sized {
|
||||
@ -15,6 +15,9 @@ fn visit_ty(&mut self, ty: &Ty) -> ControlFlow<Self::Break> {
|
||||
fn visit_const(&mut self, c: &Const) -> ControlFlow<Self::Break> {
|
||||
c.super_visit(self)
|
||||
}
|
||||
fn visit_reg(&mut self, reg: &Region) -> ControlFlow<Self::Break> {
|
||||
reg.super_visit(self)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Visitable {
|
||||
@ -101,6 +104,16 @@ fn super_visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break> {
|
||||
}
|
||||
}
|
||||
|
||||
impl Visitable for Region {
|
||||
fn visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break> {
|
||||
visitor.visit_reg(self)
|
||||
}
|
||||
|
||||
fn super_visit<V: Visitor>(&self, _: &mut V) -> ControlFlow<V::Break> {
|
||||
ControlFlow::Continue(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Visitable for GenericArgKind {
|
||||
fn super_visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break> {
|
||||
match self {
|
||||
@ -128,7 +141,10 @@ fn super_visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break> {
|
||||
}
|
||||
RigidTy::Slice(inner) => inner.visit(visitor),
|
||||
RigidTy::RawPtr(ty, _) => ty.visit(visitor),
|
||||
RigidTy::Ref(_, ty, _) => ty.visit(visitor),
|
||||
RigidTy::Ref(reg, ty, _) => {
|
||||
reg.visit(visitor);
|
||||
ty.visit(visitor)
|
||||
}
|
||||
RigidTy::FnDef(_, args) => args.visit(visitor),
|
||||
RigidTy::FnPtr(sig) => sig.visit(visitor),
|
||||
RigidTy::Closure(_, args) => args.visit(visitor),
|
||||
|
Loading…
Reference in New Issue
Block a user