88use rustc:: hir:: def_id:: DefId ;
99use rustc:: ty;
1010use rustc_data_structures:: fx:: FxHashMap ;
11- use rustc_data_structures:: sync:: Lrc ;
1211
1312use super :: constraints:: * ;
1413use super :: terms:: * ;
@@ -23,7 +22,9 @@ struct SolveContext<'a, 'tcx: 'a> {
2322 solutions : Vec < ty:: Variance > ,
2423}
2524
26- pub fn solve_constraints ( constraints_cx : ConstraintContext < ' _ , ' _ > ) -> ty:: CrateVariancesMap {
25+ pub fn solve_constraints < ' tcx > (
26+ constraints_cx : ConstraintContext < ' _ , ' tcx >
27+ ) -> ty:: CrateVariancesMap < ' tcx > {
2728 let ConstraintContext { terms_cx, constraints, .. } = constraints_cx;
2829
2930 let mut solutions = vec ! [ ty:: Bivariant ; terms_cx. inferred_terms. len( ) ] ;
@@ -41,9 +42,8 @@ pub fn solve_constraints(constraints_cx: ConstraintContext<'_, '_>) -> ty::Crate
4142 } ;
4243 solutions_cx. solve ( ) ;
4344 let variances = solutions_cx. create_map ( ) ;
44- let empty_variance = Lrc :: new ( Vec :: new ( ) ) ;
4545
46- ty:: CrateVariancesMap { variances, empty_variance }
46+ ty:: CrateVariancesMap { variances }
4747}
4848
4949impl < ' a , ' tcx > SolveContext < ' a , ' tcx > {
@@ -78,7 +78,7 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
7878 }
7979 }
8080
81- fn enforce_const_invariance ( & self , generics : & ty:: Generics , variances : & mut Vec < ty:: Variance > ) {
81+ fn enforce_const_invariance ( & self , generics : & ty:: Generics , variances : & mut [ ty:: Variance ] ) {
8282 let tcx = self . terms_cx . tcx ;
8383
8484 // Make all const parameters invariant.
@@ -94,7 +94,7 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
9494 }
9595 }
9696
97- fn create_map ( & self ) -> FxHashMap < DefId , Lrc < Vec < ty:: Variance > > > {
97+ fn create_map ( & self ) -> FxHashMap < DefId , & ' tcx [ ty:: Variance ] > {
9898 let tcx = self . terms_cx . tcx ;
9999
100100 let solutions = & self . solutions ;
@@ -103,22 +103,21 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
103103 let generics = tcx. generics_of ( def_id) ;
104104 let count = generics. count ( ) ;
105105
106- let mut variances = solutions[ start..( start + count) ] . to_vec ( ) ;
107- debug ! ( "id={} variances={:?}" , id, variances) ;
106+ let variances = tcx. arena . alloc_slice ( & solutions[ start..( start + count) ] ) ;
108107
109108 // Const parameters are always invariant.
110- self . enforce_const_invariance ( generics, & mut variances) ;
109+ self . enforce_const_invariance ( generics, variances) ;
111110
112111 // Functions are permitted to have unused generic parameters: make those invariant.
113112 if let ty:: FnDef ( ..) = tcx. type_of ( def_id) . sty {
114- for variance in & mut variances {
113+ for variance in variances. iter_mut ( ) {
115114 if * variance == ty:: Bivariant {
116115 * variance = ty:: Invariant ;
117116 }
118117 }
119118 }
120119
121- ( def_id, Lrc :: new ( variances) )
120+ ( def_id, & * variances)
122121 } ) . collect ( )
123122 }
124123
0 commit comments