about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-03-01 17:49:21 +0000
committerMichael Goulet <michael@errs.io>2024-03-01 18:11:45 +0000
commit003b920591eb0141d6c1ce2da4d119c6e7279fee (patch)
tree10e29c11b32117202deecd904281c063d90df153 /compiler
parent6db96de66c2c0ea3f4f2f348ed1a83c2c507687d (diff)
downloadrust-003b920591eb0141d6c1ce2da4d119c6e7279fee.tar.gz
rust-003b920591eb0141d6c1ce2da4d119c6e7279fee.zip
Don't grab variances if we're invariant
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_infer/src/infer/relate/type_relating.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/compiler/rustc_infer/src/infer/relate/type_relating.rs b/compiler/rustc_infer/src/infer/relate/type_relating.rs
index 18822351f4f..86a24eef7f5 100644
--- a/compiler/rustc_infer/src/infer/relate/type_relating.rs
+++ b/compiler/rustc_infer/src/infer/relate/type_relating.rs
@@ -5,7 +5,9 @@ use crate::infer::{
 };
 use crate::traits::{Obligation, PredicateObligations};
 
-use rustc_middle::ty::relate::{Relate, RelateResult, TypeRelation};
+use rustc_middle::ty::relate::{
+    relate_args_invariantly, relate_args_with_variances, Relate, RelateResult, TypeRelation,
+};
 use rustc_middle::ty::TyVar;
 use rustc_middle::ty::{self, Ty, TyCtxt};
 use rustc_span::Span;
@@ -36,6 +38,24 @@ impl<'tcx> TypeRelation<'tcx> for TypeRelating<'_, '_, 'tcx> {
         self.fields.infcx.tcx
     }
 
+    fn relate_item_args(
+        &mut self,
+        item_def_id: rustc_hir::def_id::DefId,
+        a_arg: ty::GenericArgsRef<'tcx>,
+        b_arg: ty::GenericArgsRef<'tcx>,
+    ) -> RelateResult<'tcx, ty::GenericArgsRef<'tcx>> {
+        if self.ambient_variance == ty::Variance::Invariant {
+            // Avoid fetching the variance if we are in an invariant
+            // context; no need, and it can induce dependency cycles
+            // (e.g., #41849).
+            relate_args_invariantly(self, a_arg, b_arg)
+        } else {
+            let tcx = self.tcx();
+            let opt_variances = tcx.variances_of(item_def_id);
+            relate_args_with_variances(self, item_def_id, opt_variances, a_arg, b_arg, false)
+        }
+    }
+
     fn relate_with_variance<T: Relate<'tcx>>(
         &mut self,
         variance: ty::Variance,