@@ -78,6 +78,22 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
78
78
}
79
79
}
80
80
81
+ fn enforce_const_invariance ( & self , generics : & ty:: Generics , variances : & mut Vec < ty:: Variance > ) {
82
+ let tcx = self . terms_cx . tcx ;
83
+
84
+ // Make all const parameters invariant.
85
+ for param in generics. params . iter ( ) {
86
+ if let ty:: GenericParamDefKind :: Const = param. kind {
87
+ variances[ param. index as usize ] = ty:: Invariant ;
88
+ }
89
+ }
90
+
91
+ // Make all the const parameters in the parent invariant (recursively).
92
+ if let Some ( def_id) = generics. parent {
93
+ self . enforce_const_invariance ( tcx. generics_of ( def_id) , variances) ;
94
+ }
95
+ }
96
+
81
97
fn create_map ( & self ) -> FxHashMap < DefId , Lrc < Vec < ty:: Variance > > > {
82
98
let tcx = self . terms_cx . tcx ;
83
99
@@ -91,11 +107,7 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
91
107
debug ! ( "id={} variances={:?}" , id, variances) ;
92
108
93
109
// Const parameters are always invariant.
94
- for ( idx, param) in generics. params . iter ( ) . enumerate ( ) {
95
- if let ty:: GenericParamDefKind :: Const = param. kind {
96
- variances[ idx] = ty:: Invariant ;
97
- }
98
- }
110
+ self . enforce_const_invariance ( generics, & mut variances) ;
99
111
100
112
// Functions are permitted to have unused generic parameters: make those invariant.
101
113
if let ty:: FnDef ( ..) = tcx. type_of ( def_id) . sty {
0 commit comments