Add needs_normalization
This commit is contained in:
parent
d954a8ee8e
commit
fa839b1194
2 changed files with 21 additions and 4 deletions
|
@ -293,6 +293,18 @@ where
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn needs_normalization<'tcx, T: TypeFoldable<'tcx>>(value: &T, reveal: Reveal) -> bool {
|
||||||
|
match reveal {
|
||||||
|
Reveal::UserFacing => value
|
||||||
|
.has_type_flags(ty::TypeFlags::HAS_TY_PROJECTION | ty::TypeFlags::HAS_CT_PROJECTION),
|
||||||
|
Reveal::All => value.has_type_flags(
|
||||||
|
ty::TypeFlags::HAS_TY_PROJECTION
|
||||||
|
| ty::TypeFlags::HAS_TY_OPAQUE
|
||||||
|
| ty::TypeFlags::HAS_CT_PROJECTION,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct AssocTypeNormalizer<'a, 'b, 'tcx> {
|
struct AssocTypeNormalizer<'a, 'b, 'tcx> {
|
||||||
selcx: &'a mut SelectionContext<'b, 'tcx>,
|
selcx: &'a mut SelectionContext<'b, 'tcx>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
|
@ -323,7 +335,11 @@ impl<'a, 'b, 'tcx> AssocTypeNormalizer<'a, 'b, 'tcx> {
|
||||||
value
|
value
|
||||||
);
|
);
|
||||||
|
|
||||||
if !value.has_projections() { value } else { value.fold_with(self) }
|
if !needs_normalization(&value, self.param_env.reveal()) {
|
||||||
|
value
|
||||||
|
} else {
|
||||||
|
value.fold_with(self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +359,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||||
if !ty.has_projections() {
|
if !needs_normalization(&ty, self.param_env.reveal()) {
|
||||||
return ty;
|
return ty;
|
||||||
}
|
}
|
||||||
// We don't want to normalize associated types that occur inside of region
|
// We don't want to normalize associated types that occur inside of region
|
||||||
|
|
|
@ -6,6 +6,7 @@ use crate::infer::at::At;
|
||||||
use crate::infer::canonical::OriginalQueryValues;
|
use crate::infer::canonical::OriginalQueryValues;
|
||||||
use crate::infer::{InferCtxt, InferOk};
|
use crate::infer::{InferCtxt, InferOk};
|
||||||
use crate::traits::error_reporting::InferCtxtExt;
|
use crate::traits::error_reporting::InferCtxtExt;
|
||||||
|
use crate::traits::project::needs_normalization;
|
||||||
use crate::traits::{Obligation, ObligationCause, PredicateObligation, Reveal};
|
use crate::traits::{Obligation, ObligationCause, PredicateObligation, Reveal};
|
||||||
use rustc_data_structures::sso::SsoHashMap;
|
use rustc_data_structures::sso::SsoHashMap;
|
||||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||||
|
@ -49,7 +50,7 @@ impl<'cx, 'tcx> AtExt<'tcx> for At<'cx, 'tcx> {
|
||||||
value,
|
value,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
);
|
);
|
||||||
if !value.has_projections() {
|
if !needs_normalization(&value, self.param_env.reveal()) {
|
||||||
return Ok(Normalized { value, obligations: vec![] });
|
return Ok(Normalized { value, obligations: vec![] });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +113,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {
|
||||||
|
|
||||||
#[instrument(level = "debug", skip(self))]
|
#[instrument(level = "debug", skip(self))]
|
||||||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||||
if !ty.has_projections() {
|
if !needs_normalization(&ty, self.param_env.reveal()) {
|
||||||
return ty;
|
return ty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue