]> git.lizzy.rs Git - rust.git/blobdiff - compiler/rustc_infer/src/infer/glb.rs
Auto merge of #97841 - nvzqz:inline-encode-wide, r=thomcc
[rust.git] / compiler / rustc_infer / src / infer / glb.rs
index 0d38b94965afe2d61f401d3771b43ef5a5600195..1570a08f3ca8bdb0aa11a3e4bbbe9131fc673a64 100644 (file)
@@ -95,12 +95,20 @@ fn binders<T>(
         T: Relate<'tcx>,
     {
         debug!("binders(a={:?}, b={:?})", a, b);
-
-        // When higher-ranked types are involved, computing the LUB is
-        // very challenging, switch to invariance. This is obviously
-        // overly conservative but works ok in practice.
-        self.relate_with_variance(ty::Variance::Invariant, ty::VarianceDiagInfo::default(), a, b)?;
-        Ok(a)
+        if a.skip_binder().has_escaping_bound_vars() || b.skip_binder().has_escaping_bound_vars() {
+            // When higher-ranked types are involved, computing the GLB is
+            // very challenging, switch to invariance. This is obviously
+            // overly conservative but works ok in practice.
+            self.relate_with_variance(
+                ty::Variance::Invariant,
+                ty::VarianceDiagInfo::default(),
+                a,
+                b,
+            )?;
+            Ok(a)
+        } else {
+            Ok(ty::Binder::dummy(self.relate(a.skip_binder(), b.skip_binder())?))
+        }
     }
 }