@@ -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