@@ -25,7 +25,7 @@ use std::slice;
2525use std:: vec:: IntoIter ;
2626use std:: { iter, mem, option, u32} ;
2727use syntax:: ast:: { self , Name } ;
28- use syntax:: symbol:: InternedString ;
28+ use syntax:: symbol:: { InternedString , Symbol } ;
2929use syntax_pos:: { Span , DUMMY_SP } ;
3030use crate :: ty:: fold:: { TypeFoldable , TypeFolder , TypeVisitor } ;
3131use 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
19951995static_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
20032003newtype_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
25482553BraceStructTypeFoldableImpl ! {
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 >
34313438where
34323439 B : TypeFoldable < ' tcx > ,
34333440 V : TypeFoldable < ' tcx > ,
0 commit comments