@@ -25,7 +25,7 @@ use std::slice;
25
25
use std:: vec:: IntoIter ;
26
26
use std:: { iter, mem, option, u32} ;
27
27
use syntax:: ast:: { self , Name } ;
28
- use syntax:: symbol:: InternedString ;
28
+ use syntax:: symbol:: { InternedString , Symbol } ;
29
29
use syntax_pos:: { Span , DUMMY_SP } ;
30
30
use crate :: ty:: fold:: { TypeFoldable , TypeFolder , TypeVisitor } ;
31
31
use crate :: ty:: subst:: { Subst , SubstsRef } ;
@@ -772,7 +772,7 @@ pub struct LocalDecl<'tcx> {
772
772
/// e.g., via `let x: T`, then we carry that type here. The MIR
773
773
/// borrow checker needs this information since it can affect
774
774
/// region inference.
775
- pub user_ty : UserTypeProjections < ' tcx > ,
775
+ pub user_ty : UserTypeProjections ,
776
776
777
777
/// Name of the local, used in debuginfo and pretty-printing.
778
778
///
@@ -1805,7 +1805,7 @@ pub enum StatementKind<'tcx> {
1805
1805
/// - `Contravariant` -- requires that `T_y :> T`
1806
1806
/// - `Invariant` -- requires that `T_y == T`
1807
1807
/// - `Bivariant` -- no effect
1808
- AscribeUserType ( Place < ' tcx > , ty:: Variance , Box < UserTypeProjection < ' tcx > > ) ,
1808
+ AscribeUserType ( Place < ' tcx > , ty:: Variance , Box < UserTypeProjection > ) ,
1809
1809
1810
1810
/// No-op. Useful for deleting instructions without affecting statement indices.
1811
1811
Nop ,
@@ -1939,14 +1939,14 @@ impl_stable_hash_for!(struct Static<'tcx> {
1939
1939
/// `PlaceProjection` etc below.
1940
1940
#[ derive( Clone , Debug , PartialEq , Eq , PartialOrd , Ord ,
1941
1941
Hash , RustcEncodable , RustcDecodable , HashStable ) ]
1942
- pub struct Projection < ' tcx , B , V , T > {
1942
+ pub struct Projection < B , V , T > {
1943
1943
pub base : B ,
1944
- pub elem : ProjectionElem < ' tcx , V , T > ,
1944
+ pub elem : ProjectionElem < V , T > ,
1945
1945
}
1946
1946
1947
1947
#[ derive( Clone , Debug , PartialEq , Eq , PartialOrd , Ord ,
1948
1948
Hash , RustcEncodable , RustcDecodable , HashStable ) ]
1949
- pub enum ProjectionElem < ' tcx , V , T > {
1949
+ pub enum ProjectionElem < V , T > {
1950
1950
Deref ,
1951
1951
Field ( Field , T ) ,
1952
1952
Index ( V ) ,
@@ -1980,16 +1980,16 @@ pub enum ProjectionElem<'tcx, V, T> {
1980
1980
/// "Downcast" to a variant of an ADT. Currently, we only introduce
1981
1981
/// this for ADTs with more than one variant. It may be better to
1982
1982
/// just introduce it always, or always for enums.
1983
- Downcast ( & ' tcx AdtDef , VariantIdx ) ,
1983
+ Downcast ( Option < Symbol > , VariantIdx ) ,
1984
1984
}
1985
1985
1986
1986
/// Alias for projections as they appear in places, where the base is a place
1987
1987
/// 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 > > ;
1989
1989
1990
1990
/// Alias for projections as they appear in places, where the base is a place
1991
1991
/// 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 > > ;
1993
1993
1994
1994
// at least on 64 bit systems, `PlaceElem` should not be larger than two pointers
1995
1995
static_assert ! ( PROJECTION_ELEM_IS_2_PTRS_LARGE :
@@ -1998,7 +1998,7 @@ static_assert!(PROJECTION_ELEM_IS_2_PTRS_LARGE:
1998
1998
1999
1999
/// Alias for projections as they appear in `UserTypeProjection`, where we
2000
2000
/// need neither the `V` parameter for `Index` nor the `T` for `Field`.
2001
- pub type ProjectionKind < ' tcx > = ProjectionElem < ' tcx , ( ) , ( ) > ;
2001
+ pub type ProjectionKind = ProjectionElem < ( ) , ( ) > ;
2002
2002
2003
2003
newtype_index ! {
2004
2004
pub struct Field {
@@ -2019,7 +2019,9 @@ impl<'tcx> Place<'tcx> {
2019
2019
}
2020
2020
2021
2021
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) )
2023
2025
}
2024
2026
2025
2027
pub fn index ( self , index : Local ) -> Place < ' tcx > {
@@ -2080,8 +2082,11 @@ impl<'tcx> Debug for Place<'tcx> {
2080
2082
)
2081
2083
} ,
2082
2084
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)
2085
2090
}
2086
2091
ProjectionElem :: Deref => write ! ( fmt, "(*{:?})" , data. base) ,
2087
2092
ProjectionElem :: Field ( field, ty) => {
@@ -2541,36 +2546,36 @@ pub struct Constant<'tcx> {
2541
2546
/// inferred region `'1`). The second will lead to the constraint `w:
2542
2547
/// &'static str`.
2543
2548
#[ 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 ) > ,
2546
2551
}
2547
2552
2548
2553
BraceStructTypeFoldableImpl ! {
2549
- impl <' tcx> TypeFoldable <' tcx> for UserTypeProjections < ' tcx> {
2554
+ impl <' tcx> TypeFoldable <' tcx> for UserTypeProjections {
2550
2555
contents
2551
2556
}
2552
2557
}
2553
2558
2554
- impl < ' tcx > UserTypeProjections < ' tcx > {
2559
+ impl < ' tcx > UserTypeProjections {
2555
2560
pub fn none ( ) -> Self {
2556
2561
UserTypeProjections { contents : vec ! [ ] }
2557
2562
}
2558
2563
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 {
2560
2565
UserTypeProjections { contents : projs. collect ( ) }
2561
2566
}
2562
2567
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 ) > {
2564
2569
self . contents . iter ( )
2565
2570
}
2566
2571
2567
- pub fn projections ( & self ) -> impl Iterator < Item =& UserTypeProjection < ' tcx > > {
2572
+ pub fn projections ( & self ) -> impl Iterator < Item =& UserTypeProjection > {
2568
2573
self . contents . iter ( ) . map ( |& ( ref user_type, _span) | user_type)
2569
2574
}
2570
2575
2571
2576
pub fn push_projection (
2572
2577
mut self ,
2573
- user_ty : & UserTypeProjection < ' tcx > ,
2578
+ user_ty : & UserTypeProjection ,
2574
2579
span : Span ,
2575
2580
) -> Self {
2576
2581
self . contents . push ( ( user_ty. clone ( ) , span) ) ;
@@ -2579,7 +2584,7 @@ impl<'tcx> UserTypeProjections<'tcx> {
2579
2584
2580
2585
fn map_projections (
2581
2586
mut self ,
2582
- mut f : impl FnMut ( UserTypeProjection < ' tcx > ) -> UserTypeProjection < ' tcx >
2587
+ mut f : impl FnMut ( UserTypeProjection ) -> UserTypeProjection
2583
2588
) -> Self {
2584
2589
self . contents = self . contents . drain ( ..) . map ( |( proj, span) | ( f ( proj) , span) ) . collect ( ) ;
2585
2590
self
@@ -2627,14 +2632,14 @@ impl<'tcx> UserTypeProjections<'tcx> {
2627
2632
/// `field[0]` (aka `.0`), indicating that the type of `s` is
2628
2633
/// determined by finding the type of the `.0` field from `T`.
2629
2634
#[ derive( Clone , Debug , PartialEq , Eq , Hash , RustcEncodable , RustcDecodable , HashStable ) ]
2630
- pub struct UserTypeProjection < ' tcx > {
2635
+ pub struct UserTypeProjection {
2631
2636
pub base : UserTypeAnnotationIndex ,
2632
- pub projs : Vec < ProjectionElem < ' tcx , ( ) , ( ) > > ,
2637
+ pub projs : Vec < ProjectionElem < ( ) , ( ) > > ,
2633
2638
}
2634
2639
2635
- impl < ' tcx > Copy for ProjectionKind < ' tcx > { }
2640
+ impl Copy for ProjectionKind { }
2636
2641
2637
- impl < ' tcx > UserTypeProjection < ' tcx > {
2642
+ impl UserTypeProjection {
2638
2643
pub ( crate ) fn index ( mut self ) -> Self {
2639
2644
self . projs . push ( ProjectionElem :: Index ( ( ) ) ) ;
2640
2645
self
@@ -2661,15 +2666,17 @@ impl<'tcx> UserTypeProjection<'tcx> {
2661
2666
variant_index : VariantIdx ,
2662
2667
field : Field ,
2663
2668
) -> 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) ) ;
2665
2672
self . projs . push ( ProjectionElem :: Field ( field, ( ) ) ) ;
2666
2673
self
2667
2674
}
2668
2675
}
2669
2676
2670
- CloneTypeFoldableAndLiftImpls ! { ProjectionKind < ' tcx> , }
2677
+ CloneTypeFoldableAndLiftImpls ! { ProjectionKind , }
2671
2678
2672
- impl < ' tcx > TypeFoldable < ' tcx > for UserTypeProjection < ' tcx > {
2679
+ impl < ' tcx > TypeFoldable < ' tcx > for UserTypeProjection {
2673
2680
fn super_fold_with < ' gcx : ' tcx , F : TypeFolder < ' gcx , ' tcx > > ( & self , folder : & mut F ) -> Self {
2674
2681
use crate :: mir:: ProjectionElem :: * ;
2675
2682
@@ -3427,7 +3434,7 @@ impl<'tcx> TypeFoldable<'tcx> for Operand<'tcx> {
3427
3434
}
3428
3435
}
3429
3436
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 >
3431
3438
where
3432
3439
B : TypeFoldable < ' tcx > ,
3433
3440
V : TypeFoldable < ' tcx > ,
0 commit comments