about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2019-04-25 20:16:11 +0100
committervarkor <github@varkor.com>2019-04-25 20:16:11 +0100
commitf024196dd5468aeb684ac7437dc51dbf84dab67d (patch)
treec6dcf6cd71373662f4cf07d074f60c9e9b30ccd9
parentbd31c392f286d61caac0babee68c900cdaa8b504 (diff)
downloadrust-f024196dd5468aeb684ac7437dc51dbf84dab67d.tar.gz
rust-f024196dd5468aeb684ac7437dc51dbf84dab67d.zip
Fix indexing issue for const parameter invariance
-rw-r--r--src/librustc_typeck/variance/solve.rs22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/librustc_typeck/variance/solve.rs b/src/librustc_typeck/variance/solve.rs
index b783bbfad16..51a1d088ddc 100644
--- a/src/librustc_typeck/variance/solve.rs
+++ b/src/librustc_typeck/variance/solve.rs
@@ -78,6 +78,22 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
         }
     }
 
+    fn enforce_const_invariance(&self, generics: &ty::Generics, variances: &mut Vec<ty::Variance>) {
+        let tcx = self.terms_cx.tcx;
+
+        // Make all const parameters invariant.
+        for param in generics.params.iter() {
+            if let ty::GenericParamDefKind::Const = param.kind {
+                variances[param.index as usize] = ty::Invariant;
+            }
+        }
+
+        // Make all the const parameters in the parent invariant (recursively).
+        if let Some(def_id) = generics.parent {
+            self.enforce_const_invariance(tcx.generics_of(def_id), variances);
+        }
+    }
+
     fn create_map(&self) -> FxHashMap<DefId, Lrc<Vec<ty::Variance>>> {
         let tcx = self.terms_cx.tcx;
 
@@ -91,11 +107,7 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
             debug!("id={} variances={:?}", id, variances);
 
             // Const parameters are always invariant.
-            for (idx, param) in generics.params.iter().enumerate() {
-                if let ty::GenericParamDefKind::Const = param.kind {
-                    variances[idx] = ty::Invariant;
-                }
-            }
+            self.enforce_const_invariance(generics, &mut variances);
 
             // Functions are permitted to have unused generic parameters: make those invariant.
             if let ty::FnDef(..) = tcx.type_of(def_id).sty {