Add intern table for List<ProjectionElem<'tcx, (), ()>>
.
Also added alias `ProjectionKind<'tcx>` for `ProjectionElem<'tcx, (), ()>`.
This commit is contained in:
parent
92cbe4772a
commit
47e2d825e1
2 changed files with 28 additions and 2 deletions
|
@ -1944,6 +1944,10 @@ pub type PlaceProjection<'tcx> = Projection<'tcx, Place<'tcx>, Local, Ty<'tcx>>;
|
||||||
/// and the index is a local.
|
/// and the index is a local.
|
||||||
pub type PlaceElem<'tcx> = ProjectionElem<'tcx, Local, Ty<'tcx>>;
|
pub type PlaceElem<'tcx> = ProjectionElem<'tcx, Local, Ty<'tcx>>;
|
||||||
|
|
||||||
|
/// Alias for projections as they appear in `UserTypeProjection`, where we
|
||||||
|
/// need neither the `V` parameter for `Index` nor the `T` for `Field`.
|
||||||
|
pub type ProjectionKind<'tcx> = ProjectionElem<'tcx, (), ()>;
|
||||||
|
|
||||||
newtype_index! {
|
newtype_index! {
|
||||||
pub struct Field {
|
pub struct Field {
|
||||||
DEBUG_FORMAT = "field[{}]"
|
DEBUG_FORMAT = "field[{}]"
|
||||||
|
@ -2531,6 +2535,10 @@ pub struct UserTypeProjection<'tcx> {
|
||||||
pub projs: Vec<ProjectionElem<'tcx, (), ()>>,
|
pub projs: Vec<ProjectionElem<'tcx, (), ()>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Copy for ProjectionKind<'tcx> { }
|
||||||
|
|
||||||
|
CloneTypeFoldableAndLiftImpls! { ProjectionKind<'tcx>, }
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjection<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjection<'tcx> {
|
||||||
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
||||||
use mir::ProjectionElem::*;
|
use mir::ProjectionElem::*;
|
||||||
|
|
|
@ -31,7 +31,7 @@ use middle::cstore::EncodedMetadata;
|
||||||
use middle::lang_items;
|
use middle::lang_items;
|
||||||
use middle::resolve_lifetime::{self, ObjectLifetimeDefault};
|
use middle::resolve_lifetime::{self, ObjectLifetimeDefault};
|
||||||
use middle::stability;
|
use middle::stability;
|
||||||
use mir::{self, Mir, interpret};
|
use mir::{self, Mir, interpret, ProjectionKind};
|
||||||
use mir::interpret::Allocation;
|
use mir::interpret::Allocation;
|
||||||
use ty::subst::{CanonicalUserSubsts, Kind, Substs, Subst};
|
use ty::subst::{CanonicalUserSubsts, Kind, Substs, Subst};
|
||||||
use ty::ReprOptions;
|
use ty::ReprOptions;
|
||||||
|
@ -132,6 +132,7 @@ pub struct CtxtInterners<'tcx> {
|
||||||
clauses: InternedSet<'tcx, List<Clause<'tcx>>>,
|
clauses: InternedSet<'tcx, List<Clause<'tcx>>>,
|
||||||
goal: InternedSet<'tcx, GoalKind<'tcx>>,
|
goal: InternedSet<'tcx, GoalKind<'tcx>>,
|
||||||
goal_list: InternedSet<'tcx, List<Goal<'tcx>>>,
|
goal_list: InternedSet<'tcx, List<Goal<'tcx>>>,
|
||||||
|
projs: InternedSet<'tcx, List<ProjectionKind<'tcx>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'gcx: 'tcx, 'tcx> CtxtInterners<'tcx> {
|
impl<'gcx: 'tcx, 'tcx> CtxtInterners<'tcx> {
|
||||||
|
@ -149,6 +150,7 @@ impl<'gcx: 'tcx, 'tcx> CtxtInterners<'tcx> {
|
||||||
clauses: Default::default(),
|
clauses: Default::default(),
|
||||||
goal: Default::default(),
|
goal: Default::default(),
|
||||||
goal_list: Default::default(),
|
goal_list: Default::default(),
|
||||||
|
projs: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2294,6 +2296,13 @@ impl<'tcx: 'lcx, 'lcx> Borrow<[Kind<'lcx>]> for Interned<'tcx, Substs<'tcx>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx: 'lcx, 'lcx> Borrow<[ProjectionKind<'lcx>]>
|
||||||
|
for Interned<'tcx, List<ProjectionKind<'tcx>>> {
|
||||||
|
fn borrow<'a>(&'a self) -> &'a [ProjectionKind<'lcx>] {
|
||||||
|
&self.0[..]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> Borrow<RegionKind> for Interned<'tcx, RegionKind> {
|
impl<'tcx> Borrow<RegionKind> for Interned<'tcx, RegionKind> {
|
||||||
fn borrow<'a>(&'a self) -> &'a RegionKind {
|
fn borrow<'a>(&'a self) -> &'a RegionKind {
|
||||||
&self.0
|
&self.0
|
||||||
|
@ -2441,7 +2450,8 @@ slice_interners!(
|
||||||
type_list: _intern_type_list(Ty),
|
type_list: _intern_type_list(Ty),
|
||||||
substs: _intern_substs(Kind),
|
substs: _intern_substs(Kind),
|
||||||
clauses: _intern_clauses(Clause),
|
clauses: _intern_clauses(Clause),
|
||||||
goal_list: _intern_goals(Goal)
|
goal_list: _intern_goals(Goal),
|
||||||
|
projs: _intern_projs(ProjectionKind)
|
||||||
);
|
);
|
||||||
|
|
||||||
// This isn't a perfect fit: CanonicalVarInfo slices are always
|
// This isn't a perfect fit: CanonicalVarInfo slices are always
|
||||||
|
@ -2743,6 +2753,14 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn intern_projs(self, ps: &[ProjectionKind<'tcx>]) -> &'tcx List<ProjectionKind<'tcx>> {
|
||||||
|
if ps.len() == 0 {
|
||||||
|
List::empty()
|
||||||
|
} else {
|
||||||
|
self._intern_projs(ps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn intern_canonical_var_infos(self, ts: &[CanonicalVarInfo]) -> CanonicalVarInfos<'gcx> {
|
pub fn intern_canonical_var_infos(self, ts: &[CanonicalVarInfo]) -> CanonicalVarInfos<'gcx> {
|
||||||
if ts.len() == 0 {
|
if ts.len() == 0 {
|
||||||
List::empty()
|
List::empty()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue