@@ -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,18 @@ 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+ ///
1984+ /// The included Symbol is the name of the variant, used for printing MIR.
1985+ Downcast ( Option < Symbol > , VariantIdx ) ,
19841986}
19851987
19861988/// Alias for projections as they appear in places, where the base is a place
19871989/// and the index is a local.
1988- pub type PlaceProjection < ' tcx > = Projection < ' tcx , Place < ' tcx > , Local , Ty < ' tcx > > ;
1990+ pub type PlaceProjection < ' tcx > = Projection < Place < ' tcx > , Local , Ty < ' tcx > > ;
19891991
19901992/// Alias for projections as they appear in places, where the base is a place
19911993/// and the index is a local.
1992- pub type PlaceElem < ' tcx > = ProjectionElem < ' tcx , Local , Ty < ' tcx > > ;
1994+ pub type PlaceElem < ' tcx > = ProjectionElem < Local , Ty < ' tcx > > ;
19931995
19941996// at least on 64 bit systems, `PlaceElem` should not be larger than two pointers
19951997static_assert ! ( PROJECTION_ELEM_IS_2_PTRS_LARGE :
@@ -1998,7 +2000,7 @@ static_assert!(PROJECTION_ELEM_IS_2_PTRS_LARGE:
19982000
19992001/// Alias for projections as they appear in `UserTypeProjection`, where we
20002002/// need neither the `V` parameter for `Index` nor the `T` for `Field`.
2001- pub type ProjectionKind < ' tcx > = ProjectionElem < ' tcx , ( ) , ( ) > ;
2003+ pub type ProjectionKind = ProjectionElem < ( ) , ( ) > ;
20022004
20032005newtype_index ! {
20042006 pub struct Field {
@@ -2019,7 +2021,9 @@ impl<'tcx> Place<'tcx> {
20192021 }
20202022
20212023 pub fn downcast ( self , adt_def : & ' tcx AdtDef , variant_index : VariantIdx ) -> Place < ' tcx > {
2022- self . elem ( ProjectionElem :: Downcast ( adt_def, variant_index) )
2024+ self . elem ( ProjectionElem :: Downcast (
2025+ Some ( adt_def. variants [ variant_index] . ident . name ) ,
2026+ variant_index) )
20232027 }
20242028
20252029 pub fn index ( self , index : Local ) -> Place < ' tcx > {
@@ -2080,8 +2084,11 @@ impl<'tcx> Debug for Place<'tcx> {
20802084 )
20812085 } ,
20822086 Projection ( ref data) => match data. elem {
2083- ProjectionElem :: Downcast ( ref adt_def, index) => {
2084- write ! ( fmt, "({:?} as {})" , data. base, adt_def. variants[ index] . ident)
2087+ ProjectionElem :: Downcast ( Some ( name) , _index) => {
2088+ write ! ( fmt, "({:?} as {})" , data. base, name)
2089+ }
2090+ ProjectionElem :: Downcast ( None , index) => {
2091+ write ! ( fmt, "({:?} as variant#{:?})" , data. base, index)
20852092 }
20862093 ProjectionElem :: Deref => write ! ( fmt, "(*{:?})" , data. base) ,
20872094 ProjectionElem :: Field ( field, ty) => {
@@ -2542,36 +2549,36 @@ pub struct Constant<'tcx> {
25422549/// inferred region `'1`). The second will lead to the constraint `w:
25432550/// &'static str`.
25442551#[ derive( Clone , Debug , PartialEq , Eq , Hash , RustcEncodable , RustcDecodable , HashStable ) ]
2545- pub struct UserTypeProjections < ' tcx > {
2546- pub ( crate ) contents : Vec < ( UserTypeProjection < ' tcx > , Span ) > ,
2552+ pub struct UserTypeProjections {
2553+ pub ( crate ) contents : Vec < ( UserTypeProjection , Span ) > ,
25472554}
25482555
25492556BraceStructTypeFoldableImpl ! {
2550- impl <' tcx> TypeFoldable <' tcx> for UserTypeProjections < ' tcx> {
2557+ impl <' tcx> TypeFoldable <' tcx> for UserTypeProjections {
25512558 contents
25522559 }
25532560}
25542561
2555- impl < ' tcx > UserTypeProjections < ' tcx > {
2562+ impl < ' tcx > UserTypeProjections {
25562563 pub fn none ( ) -> Self {
25572564 UserTypeProjections { contents : vec ! [ ] }
25582565 }
25592566
2560- pub fn from_projections ( projs : impl Iterator < Item =( UserTypeProjection < ' tcx > , Span ) > ) -> Self {
2567+ pub fn from_projections ( projs : impl Iterator < Item =( UserTypeProjection , Span ) > ) -> Self {
25612568 UserTypeProjections { contents : projs. collect ( ) }
25622569 }
25632570
2564- pub fn projections_and_spans ( & self ) -> impl Iterator < Item =& ( UserTypeProjection < ' tcx > , Span ) > {
2571+ pub fn projections_and_spans ( & self ) -> impl Iterator < Item =& ( UserTypeProjection , Span ) > {
25652572 self . contents . iter ( )
25662573 }
25672574
2568- pub fn projections ( & self ) -> impl Iterator < Item =& UserTypeProjection < ' tcx > > {
2575+ pub fn projections ( & self ) -> impl Iterator < Item =& UserTypeProjection > {
25692576 self . contents . iter ( ) . map ( |& ( ref user_type, _span) | user_type)
25702577 }
25712578
25722579 pub fn push_projection (
25732580 mut self ,
2574- user_ty : & UserTypeProjection < ' tcx > ,
2581+ user_ty : & UserTypeProjection ,
25752582 span : Span ,
25762583 ) -> Self {
25772584 self . contents . push ( ( user_ty. clone ( ) , span) ) ;
@@ -2580,7 +2587,7 @@ impl<'tcx> UserTypeProjections<'tcx> {
25802587
25812588 fn map_projections (
25822589 mut self ,
2583- mut f : impl FnMut ( UserTypeProjection < ' tcx > ) -> UserTypeProjection < ' tcx >
2590+ mut f : impl FnMut ( UserTypeProjection ) -> UserTypeProjection
25842591 ) -> Self {
25852592 self . contents = self . contents . drain ( ..) . map ( |( proj, span) | ( f ( proj) , span) ) . collect ( ) ;
25862593 self
@@ -2628,14 +2635,14 @@ impl<'tcx> UserTypeProjections<'tcx> {
26282635/// `field[0]` (aka `.0`), indicating that the type of `s` is
26292636/// determined by finding the type of the `.0` field from `T`.
26302637#[ derive( Clone , Debug , PartialEq , Eq , Hash , RustcEncodable , RustcDecodable , HashStable ) ]
2631- pub struct UserTypeProjection < ' tcx > {
2638+ pub struct UserTypeProjection {
26322639 pub base : UserTypeAnnotationIndex ,
2633- pub projs : Vec < ProjectionElem < ' tcx , ( ) , ( ) > > ,
2640+ pub projs : Vec < ProjectionElem < ( ) , ( ) > > ,
26342641}
26352642
2636- impl < ' tcx > Copy for ProjectionKind < ' tcx > { }
2643+ impl Copy for ProjectionKind { }
26372644
2638- impl < ' tcx > UserTypeProjection < ' tcx > {
2645+ impl UserTypeProjection {
26392646 pub ( crate ) fn index ( mut self ) -> Self {
26402647 self . projs . push ( ProjectionElem :: Index ( ( ) ) ) ;
26412648 self
@@ -2662,15 +2669,17 @@ impl<'tcx> UserTypeProjection<'tcx> {
26622669 variant_index : VariantIdx ,
26632670 field : Field ,
26642671 ) -> Self {
2665- self . projs . push ( ProjectionElem :: Downcast ( adt_def, variant_index) ) ;
2672+ self . projs . push ( ProjectionElem :: Downcast (
2673+ Some ( adt_def. variants [ variant_index] . ident . name ) ,
2674+ variant_index) ) ;
26662675 self . projs . push ( ProjectionElem :: Field ( field, ( ) ) ) ;
26672676 self
26682677 }
26692678}
26702679
2671- CloneTypeFoldableAndLiftImpls ! { ProjectionKind < ' tcx> , }
2680+ CloneTypeFoldableAndLiftImpls ! { ProjectionKind , }
26722681
2673- impl < ' tcx > TypeFoldable < ' tcx > for UserTypeProjection < ' tcx > {
2682+ impl < ' tcx > TypeFoldable < ' tcx > for UserTypeProjection {
26742683 fn super_fold_with < ' gcx : ' tcx , F : TypeFolder < ' gcx , ' tcx > > ( & self , folder : & mut F ) -> Self {
26752684 use crate :: mir:: ProjectionElem :: * ;
26762685
@@ -3428,7 +3437,7 @@ impl<'tcx> TypeFoldable<'tcx> for Operand<'tcx> {
34283437 }
34293438}
34303439
3431- impl < ' tcx , B , V , T > TypeFoldable < ' tcx > for Projection < ' tcx , B , V , T >
3440+ impl < ' tcx , B , V , T > TypeFoldable < ' tcx > for Projection < B , V , T >
34323441where
34333442 B : TypeFoldable < ' tcx > ,
34343443 V : TypeFoldable < ' tcx > ,
0 commit comments