]> git.lizzy.rs Git - rust.git/blobdiff - compiler/rustc_middle/src/ty/relate.rs
Optimize relate_substs by extracting match
[rust.git] / compiler / rustc_middle / src / ty / relate.rs
index d9b55563996bab580d050db2d2d9d4d517e244ed..b1cfa3fa96433ef4a068ab959ae3acdc53599f42 100644 (file)
@@ -142,11 +142,12 @@ pub fn relate_substs<'tcx, R: TypeRelation<'tcx>>(
     b_subst: SubstsRef<'tcx>,
 ) -> RelateResult<'tcx, SubstsRef<'tcx>> {
     let tcx = relation.tcx();
-    let mut cached_ty = None;
 
-    let params = iter::zip(a_subst, b_subst).enumerate().map(|(i, (a, b))| {
-        let (variance, variance_info) = match variances {
-            Some((ty_def_id, variances)) => {
+    let zipped = iter::zip(a_subst, b_subst);
+    match variances {
+        Some((ty_def_id, variances)) => {
+            let mut cached_ty = None;
+            tcx.mk_substs(zipped.enumerate().map(|(i, (a, b))| {
                 let variance = variances[i];
                 let variance_info = if variance == ty::Invariant {
                     let ty = *cached_ty
@@ -155,14 +156,13 @@ pub fn relate_substs<'tcx, R: TypeRelation<'tcx>>(
                 } else {
                     ty::VarianceDiagInfo::default()
                 };
-                (variance, variance_info)
-            }
-            None => (ty::Invariant, ty::VarianceDiagInfo::default()),
-        };
-        relation.relate_with_variance(variance, variance_info, a, b)
-    });
-
-    tcx.mk_substs(params)
+                relation.relate_with_variance(variance, variance_info, a, b)
+            }))
+        }
+        None => tcx.mk_substs(zipped.map(|(a, b)| {
+            relation.relate_with_variance(ty::Invariant, ty::VarianceDiagInfo::default(), a, b)
+        })),
+    }
 }
 
 impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> {