diff options
| author | Michael Goulet <michael@errs.io> | 2024-03-01 17:49:21 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-03-01 18:11:45 +0000 |
| commit | 003b920591eb0141d6c1ce2da4d119c6e7279fee (patch) | |
| tree | 10e29c11b32117202deecd904281c063d90df153 /compiler | |
| parent | 6db96de66c2c0ea3f4f2f348ed1a83c2c507687d (diff) | |
| download | rust-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.rs | 22 |
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, |
