Skip to content

Commit cf5fd22

Browse files
committed
Replace adt_def with name in mir::ProjectionElem::Downcast
1 parent 237bf32 commit cf5fd22

File tree

15 files changed

+98
-86
lines changed

15 files changed

+98
-86
lines changed

src/librustc/mir/mod.rs

+37-30
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use std::slice;
2525
use std::vec::IntoIter;
2626
use std::{iter, mem, option, u32};
2727
use syntax::ast::{self, Name};
28-
use syntax::symbol::InternedString;
28+
use syntax::symbol::{InternedString, Symbol};
2929
use syntax_pos::{Span, DUMMY_SP};
3030
use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
3131
use crate::ty::subst::{Subst, SubstsRef};
@@ -772,7 +772,7 @@ pub struct LocalDecl<'tcx> {
772772
/// e.g., via `let x: T`, then we carry that type here. The MIR
773773
/// borrow checker needs this information since it can affect
774774
/// region inference.
775-
pub user_ty: UserTypeProjections<'tcx>,
775+
pub user_ty: UserTypeProjections,
776776

777777
/// Name of the local, used in debuginfo and pretty-printing.
778778
///
@@ -1805,7 +1805,7 @@ pub enum StatementKind<'tcx> {
18051805
/// - `Contravariant` -- requires that `T_y :> T`
18061806
/// - `Invariant` -- requires that `T_y == T`
18071807
/// - `Bivariant` -- no effect
1808-
AscribeUserType(Place<'tcx>, ty::Variance, Box<UserTypeProjection<'tcx>>),
1808+
AscribeUserType(Place<'tcx>, ty::Variance, Box<UserTypeProjection>),
18091809

18101810
/// No-op. Useful for deleting instructions without affecting statement indices.
18111811
Nop,
@@ -1939,14 +1939,14 @@ impl_stable_hash_for!(struct Static<'tcx> {
19391939
/// `PlaceProjection` etc below.
19401940
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord,
19411941
Hash, RustcEncodable, RustcDecodable, HashStable)]
1942-
pub struct Projection<'tcx, B, V, T> {
1942+
pub struct Projection<B, V, T> {
19431943
pub base: B,
1944-
pub elem: ProjectionElem<'tcx, V, T>,
1944+
pub elem: ProjectionElem<V, T>,
19451945
}
19461946

19471947
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord,
19481948
Hash, RustcEncodable, RustcDecodable, HashStable)]
1949-
pub enum ProjectionElem<'tcx, V, T> {
1949+
pub enum ProjectionElem<V, T> {
19501950
Deref,
19511951
Field(Field, T),
19521952
Index(V),
@@ -1980,16 +1980,16 @@ pub enum ProjectionElem<'tcx, V, T> {
19801980
/// "Downcast" to a variant of an ADT. Currently, we only introduce
19811981
/// this for ADTs with more than one variant. It may be better to
19821982
/// just introduce it always, or always for enums.
1983-
Downcast(&'tcx AdtDef, VariantIdx),
1983+
Downcast(Option<Symbol>, VariantIdx),
19841984
}
19851985

19861986
/// Alias for projections as they appear in places, where the base is a place
19871987
/// and the index is a local.
1988-
pub type PlaceProjection<'tcx> = Projection<'tcx, Place<'tcx>, Local, Ty<'tcx>>;
1988+
pub type PlaceProjection<'tcx> = Projection<Place<'tcx>, Local, Ty<'tcx>>;
19891989

19901990
/// Alias for projections as they appear in places, where the base is a place
19911991
/// and the index is a local.
1992-
pub type PlaceElem<'tcx> = ProjectionElem<'tcx, Local, Ty<'tcx>>;
1992+
pub type PlaceElem<'tcx> = ProjectionElem<Local, Ty<'tcx>>;
19931993

19941994
// at least on 64 bit systems, `PlaceElem` should not be larger than two pointers
19951995
static_assert!(PROJECTION_ELEM_IS_2_PTRS_LARGE:
@@ -1998,7 +1998,7 @@ static_assert!(PROJECTION_ELEM_IS_2_PTRS_LARGE:
19981998

19991999
/// Alias for projections as they appear in `UserTypeProjection`, where we
20002000
/// need neither the `V` parameter for `Index` nor the `T` for `Field`.
2001-
pub type ProjectionKind<'tcx> = ProjectionElem<'tcx, (), ()>;
2001+
pub type ProjectionKind = ProjectionElem<(), ()>;
20022002

20032003
newtype_index! {
20042004
pub struct Field {
@@ -2019,7 +2019,9 @@ impl<'tcx> Place<'tcx> {
20192019
}
20202020

20212021
pub fn downcast(self, adt_def: &'tcx AdtDef, variant_index: VariantIdx) -> Place<'tcx> {
2022-
self.elem(ProjectionElem::Downcast(adt_def, variant_index))
2022+
self.elem(ProjectionElem::Downcast(
2023+
Some(adt_def.variants[variant_index].ident.name),
2024+
variant_index))
20232025
}
20242026

20252027
pub fn index(self, index: Local) -> Place<'tcx> {
@@ -2080,8 +2082,11 @@ impl<'tcx> Debug for Place<'tcx> {
20802082
)
20812083
},
20822084
Projection(ref data) => match data.elem {
2083-
ProjectionElem::Downcast(ref adt_def, index) => {
2084-
write!(fmt, "({:?} as {})", data.base, adt_def.variants[index].ident)
2085+
ProjectionElem::Downcast(Some(name), _index) => {
2086+
write!(fmt, "({:?} as {})", data.base, name)
2087+
}
2088+
ProjectionElem::Downcast(None, index) => {
2089+
write!(fmt, "({:?} as variant#{:?})", data.base, index)
20852090
}
20862091
ProjectionElem::Deref => write!(fmt, "(*{:?})", data.base),
20872092
ProjectionElem::Field(field, ty) => {
@@ -2541,36 +2546,36 @@ pub struct Constant<'tcx> {
25412546
/// inferred region `'1`). The second will lead to the constraint `w:
25422547
/// &'static str`.
25432548
#[derive(Clone, Debug, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, HashStable)]
2544-
pub struct UserTypeProjections<'tcx> {
2545-
pub(crate) contents: Vec<(UserTypeProjection<'tcx>, Span)>,
2549+
pub struct UserTypeProjections {
2550+
pub(crate) contents: Vec<(UserTypeProjection, Span)>,
25462551
}
25472552

25482553
BraceStructTypeFoldableImpl! {
2549-
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjections<'tcx> {
2554+
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjections {
25502555
contents
25512556
}
25522557
}
25532558

2554-
impl<'tcx> UserTypeProjections<'tcx> {
2559+
impl<'tcx> UserTypeProjections {
25552560
pub fn none() -> Self {
25562561
UserTypeProjections { contents: vec![] }
25572562
}
25582563

2559-
pub fn from_projections(projs: impl Iterator<Item=(UserTypeProjection<'tcx>, Span)>) -> Self {
2564+
pub fn from_projections(projs: impl Iterator<Item=(UserTypeProjection, Span)>) -> Self {
25602565
UserTypeProjections { contents: projs.collect() }
25612566
}
25622567

2563-
pub fn projections_and_spans(&self) -> impl Iterator<Item=&(UserTypeProjection<'tcx>, Span)> {
2568+
pub fn projections_and_spans(&self) -> impl Iterator<Item=&(UserTypeProjection, Span)> {
25642569
self.contents.iter()
25652570
}
25662571

2567-
pub fn projections(&self) -> impl Iterator<Item=&UserTypeProjection<'tcx>> {
2572+
pub fn projections(&self) -> impl Iterator<Item=&UserTypeProjection> {
25682573
self.contents.iter().map(|&(ref user_type, _span)| user_type)
25692574
}
25702575

25712576
pub fn push_projection(
25722577
mut self,
2573-
user_ty: &UserTypeProjection<'tcx>,
2578+
user_ty: &UserTypeProjection,
25742579
span: Span,
25752580
) -> Self {
25762581
self.contents.push((user_ty.clone(), span));
@@ -2579,7 +2584,7 @@ impl<'tcx> UserTypeProjections<'tcx> {
25792584

25802585
fn map_projections(
25812586
mut self,
2582-
mut f: impl FnMut(UserTypeProjection<'tcx>) -> UserTypeProjection<'tcx>
2587+
mut f: impl FnMut(UserTypeProjection) -> UserTypeProjection
25832588
) -> Self {
25842589
self.contents = self.contents.drain(..).map(|(proj, span)| (f(proj), span)).collect();
25852590
self
@@ -2627,14 +2632,14 @@ impl<'tcx> UserTypeProjections<'tcx> {
26272632
/// `field[0]` (aka `.0`), indicating that the type of `s` is
26282633
/// determined by finding the type of the `.0` field from `T`.
26292634
#[derive(Clone, Debug, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, HashStable)]
2630-
pub struct UserTypeProjection<'tcx> {
2635+
pub struct UserTypeProjection {
26312636
pub base: UserTypeAnnotationIndex,
2632-
pub projs: Vec<ProjectionElem<'tcx, (), ()>>,
2637+
pub projs: Vec<ProjectionElem<(), ()>>,
26332638
}
26342639

2635-
impl<'tcx> Copy for ProjectionKind<'tcx> { }
2640+
impl Copy for ProjectionKind { }
26362641

2637-
impl<'tcx> UserTypeProjection<'tcx> {
2642+
impl UserTypeProjection {
26382643
pub(crate) fn index(mut self) -> Self {
26392644
self.projs.push(ProjectionElem::Index(()));
26402645
self
@@ -2661,15 +2666,17 @@ impl<'tcx> UserTypeProjection<'tcx> {
26612666
variant_index: VariantIdx,
26622667
field: Field,
26632668
) -> Self {
2664-
self.projs.push(ProjectionElem::Downcast(adt_def, variant_index));
2669+
self.projs.push(ProjectionElem::Downcast(
2670+
Some(adt_def.variants[variant_index].ident.name),
2671+
variant_index));
26652672
self.projs.push(ProjectionElem::Field(field, ()));
26662673
self
26672674
}
26682675
}
26692676

2670-
CloneTypeFoldableAndLiftImpls! { ProjectionKind<'tcx>, }
2677+
CloneTypeFoldableAndLiftImpls! { ProjectionKind, }
26712678

2672-
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjection<'tcx> {
2679+
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjection {
26732680
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
26742681
use crate::mir::ProjectionElem::*;
26752682

@@ -3427,7 +3434,7 @@ impl<'tcx> TypeFoldable<'tcx> for Operand<'tcx> {
34273434
}
34283435
}
34293436

3430-
impl<'tcx, B, V, T> TypeFoldable<'tcx> for Projection<'tcx, B, V, T>
3437+
impl<'tcx, B, V, T> TypeFoldable<'tcx> for Projection<B, V, T>
34313438
where
34323439
B: TypeFoldable<'tcx>,
34333440
V: TypeFoldable<'tcx>,

src/librustc/mir/tcx.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ impl<'a, 'gcx, 'tcx> PlaceTy<'tcx> {
8686
pub fn projection_ty_core<V, T>(
8787
self,
8888
tcx: TyCtxt<'a, 'gcx, 'tcx>,
89-
elem: &ProjectionElem<'tcx, V, T>,
89+
elem: &ProjectionElem<V, T>,
9090
mut handle_field: impl FnMut(&Self, &Field, &T) -> Ty<'tcx>)
9191
-> PlaceTy<'tcx>
9292
where
@@ -124,12 +124,11 @@ impl<'a, 'gcx, 'tcx> PlaceTy<'tcx> {
124124
}
125125
}
126126
}
127-
ProjectionElem::Downcast(adt_def1, index) =>
127+
ProjectionElem::Downcast(_name, index) =>
128128
match self.to_ty(tcx).sty {
129129
ty::Adt(adt_def, substs) => {
130130
assert!(adt_def.is_enum());
131131
assert!(index.as_usize() < adt_def.variants.len());
132-
assert_eq!(adt_def, adt_def1);
133132
PlaceTy::Downcast { adt_def,
134133
substs,
135134
variant_index: index }

src/librustc/mir/visit.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ macro_rules! make_mir_visitor {
137137
fn visit_ascribe_user_ty(&mut self,
138138
place: & $($mutability)? Place<'tcx>,
139139
variance: & $($mutability)? ty::Variance,
140-
user_ty: & $($mutability)? UserTypeProjection<'tcx>,
140+
user_ty: & $($mutability)? UserTypeProjection,
141141
location: Location) {
142142
self.super_ascribe_user_ty(place, variance, user_ty, location);
143143
}
@@ -205,7 +205,7 @@ macro_rules! make_mir_visitor {
205205

206206
fn visit_user_type_projection(
207207
&mut self,
208-
ty: & $($mutability)? UserTypeProjection<'tcx>,
208+
ty: & $($mutability)? UserTypeProjection,
209209
) {
210210
self.super_user_type_projection(ty);
211211
}
@@ -700,7 +700,7 @@ macro_rules! make_mir_visitor {
700700
fn super_ascribe_user_ty(&mut self,
701701
place: & $($mutability)? Place<'tcx>,
702702
_variance: & $($mutability)? ty::Variance,
703-
user_ty: & $($mutability)? UserTypeProjection<'tcx>,
703+
user_ty: & $($mutability)? UserTypeProjection,
704704
location: Location) {
705705
self.visit_place(
706706
place,
@@ -777,7 +777,7 @@ macro_rules! make_mir_visitor {
777777
min_length: _,
778778
from_end: _ } => {
779779
}
780-
ProjectionElem::Downcast(_adt_def, _variant_index) => {
780+
ProjectionElem::Downcast(_name, _variant_index) => {
781781
}
782782
}
783783
}
@@ -851,7 +851,7 @@ macro_rules! make_mir_visitor {
851851

852852
fn super_user_type_projection(
853853
&mut self,
854-
_ty: & $($mutability)? UserTypeProjection<'tcx>,
854+
_ty: & $($mutability)? UserTypeProjection,
855855
) {
856856
}
857857

src/librustc/ty/context.rs

+16-16
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub struct CtxtInterners<'tcx> {
125125
clauses: InternedSet<'tcx, List<Clause<'tcx>>>,
126126
goal: InternedSet<'tcx, GoalKind<'tcx>>,
127127
goal_list: InternedSet<'tcx, List<Goal<'tcx>>>,
128-
projs: InternedSet<'tcx, List<ProjectionKind<'tcx>>>,
128+
projs: InternedSet<'tcx, List<ProjectionKind>>,
129129
const_: InternedSet<'tcx, Const<'tcx>>,
130130
}
131131

@@ -1793,7 +1793,7 @@ nop_list_lift!{Ty<'a> => Ty<'tcx>}
17931793
nop_list_lift!{ExistentialPredicate<'a> => ExistentialPredicate<'tcx>}
17941794
nop_list_lift!{Predicate<'a> => Predicate<'tcx>}
17951795
nop_list_lift!{CanonicalVarInfo => CanonicalVarInfo}
1796-
nop_list_lift!{ProjectionKind<'a> => ProjectionKind<'tcx>}
1796+
nop_list_lift!{ProjectionKind => ProjectionKind}
17971797

17981798
// this is the impl for `&'a InternalSubsts<'a>`
17991799
nop_list_lift!{Kind<'a> => Kind<'tcx>}
@@ -2252,9 +2252,9 @@ impl<'tcx: 'lcx, 'lcx> Borrow<[Kind<'lcx>]> for Interned<'tcx, InternalSubsts<'t
22522252
}
22532253
}
22542254

2255-
impl<'tcx: 'lcx, 'lcx> Borrow<[ProjectionKind<'lcx>]>
2256-
for Interned<'tcx, List<ProjectionKind<'tcx>>> {
2257-
fn borrow<'a>(&'a self) -> &'a [ProjectionKind<'lcx>] {
2255+
impl<'tcx> Borrow<[ProjectionKind]>
2256+
for Interned<'tcx, List<ProjectionKind>> {
2257+
fn borrow<'a>(&'a self) -> &'a [ProjectionKind] {
22582258
&self.0[..]
22592259
}
22602260
}
@@ -2382,22 +2382,22 @@ direct_interners!('tcx,
23822382
);
23832383

23842384
macro_rules! slice_interners {
2385-
($($field:ident: $method:ident($ty:ident)),+) => (
2385+
($($field:ident: $method:ident($ty:ty)),+) => (
23862386
$(intern_method!( 'tcx, $field: $method(
2387-
&[$ty<'tcx>],
2387+
&[$ty],
23882388
|a, v| List::from_arena(a, v),
23892389
Deref::deref,
2390-
|xs: &[$ty<'_>]| xs.iter().any(keep_local)) -> List<$ty<'tcx>>);)+
2391-
)
2390+
|xs: &[$ty]| xs.iter().any(keep_local)) -> List<$ty>);)+
2391+
);
23922392
}
23932393

23942394
slice_interners!(
2395-
existential_predicates: _intern_existential_predicates(ExistentialPredicate),
2396-
predicates: _intern_predicates(Predicate),
2397-
type_list: _intern_type_list(Ty),
2398-
substs: _intern_substs(Kind),
2399-
clauses: _intern_clauses(Clause),
2400-
goal_list: _intern_goals(Goal),
2395+
existential_predicates: _intern_existential_predicates(ExistentialPredicate<'tcx>),
2396+
predicates: _intern_predicates(Predicate<'tcx>),
2397+
type_list: _intern_type_list(Ty<'tcx>),
2398+
substs: _intern_substs(Kind<'tcx>),
2399+
clauses: _intern_clauses(Clause<'tcx>),
2400+
goal_list: _intern_goals(Goal<'tcx>),
24012401
projs: _intern_projs(ProjectionKind)
24022402
);
24032403

@@ -2761,7 +2761,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
27612761
}
27622762
}
27632763

2764-
pub fn intern_projs(self, ps: &[ProjectionKind<'tcx>]) -> &'tcx List<ProjectionKind<'tcx>> {
2764+
pub fn intern_projs(self, ps: &[ProjectionKind]) -> &'tcx List<ProjectionKind> {
27652765
if ps.len() == 0 {
27662766
List::empty()
27672767
} else {

src/librustc/ty/structural_impls.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<Ty<'tcx>> {
936936
}
937937
}
938938

939-
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind<'tcx>> {
939+
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind> {
940940
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
941941
let v = self.iter().map(|t| t.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
942942
folder.tcx().intern_projs(&v)

src/librustc_mir/borrow_check/error_reporting.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1748,8 +1748,9 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
17481748
self.describe_field_from_ty(&static_.ty, field),
17491749
Place::Projection(ref proj) => match proj.elem {
17501750
ProjectionElem::Deref => self.describe_field(&proj.base, field),
1751-
ProjectionElem::Downcast(def, variant_index) =>
1752-
def.variants[variant_index].fields[field.index()].ident.to_string(),
1751+
ProjectionElem::Downcast(Some(name), _variant_index) => name.to_string(),
1752+
ProjectionElem::Downcast(None, variant_index) =>
1753+
format!("variant#{:?}", variant_index),
17531754
ProjectionElem::Field(_, field_type) => {
17541755
self.describe_field_from_ty(&field_type, field)
17551756
}

src/librustc_mir/borrow_check/nll/constraint_generation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ impl<'cg, 'cx, 'gcx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'gcx
174174
&mut self,
175175
_place: &Place<'tcx>,
176176
_variance: &ty::Variance,
177-
_user_ty: &UserTypeProjection<'tcx>,
177+
_user_ty: &UserTypeProjection,
178178
_location: Location,
179179
) {
180180
}

0 commit comments

Comments
 (0)