Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/infer/canonical/canonicalizer.rs')
-rw-r--r--crates/hir-ty/src/next_solver/infer/canonical/canonicalizer.rs87
1 files changed, 20 insertions, 67 deletions
diff --git a/crates/hir-ty/src/next_solver/infer/canonical/canonicalizer.rs b/crates/hir-ty/src/next_solver/infer/canonical/canonicalizer.rs
index beaac11a2d..1029a7ff39 100644
--- a/crates/hir-ty/src/next_solver/infer/canonical/canonicalizer.rs
+++ b/crates/hir-ty/src/next_solver/infer/canonical/canonicalizer.rs
@@ -10,7 +10,7 @@ use rustc_index::Idx;
use rustc_type_ir::InferTy::{self, FloatVar, IntVar, TyVar};
use rustc_type_ir::inherent::{Const as _, IntoKind as _, Region as _, SliceLike, Ty as _};
use rustc_type_ir::{
- BoundVar, CanonicalQueryInput, DebruijnIndex, Flags, InferConst, RegionKind, TyVid, TypeFlags,
+ BoundVar, BoundVarIndexKind, DebruijnIndex, Flags, InferConst, RegionKind, TyVid, TypeFlags,
TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitableExt, UniverseIndex,
};
use smallvec::SmallVec;
@@ -18,9 +18,8 @@ use tracing::debug;
use crate::next_solver::infer::InferCtxt;
use crate::next_solver::{
- Binder, BoundConst, BoundRegion, BoundRegionKind, BoundTy, Canonical, CanonicalVarKind,
- CanonicalVars, Const, ConstKind, DbInterner, GenericArg, ParamEnvAnd, Placeholder, Region, Ty,
- TyKind,
+ Binder, Canonical, CanonicalVarKind, CanonicalVars, Const, ConstKind, DbInterner, GenericArg,
+ Placeholder, Region, Ty, TyKind,
};
/// When we canonicalize a value to form a query, we wind up replacing
@@ -67,33 +66,19 @@ impl<'db> InferCtxt<'db> {
/// [c]: https://rust-lang.github.io/chalk/book/canonical_queries/canonicalization.html#canonicalizing-the-query
pub fn canonicalize_query<V>(
&self,
- value: ParamEnvAnd<'db, V>,
+ value: V,
query_state: &mut OriginalQueryValues<'db>,
- ) -> CanonicalQueryInput<DbInterner<'db>, ParamEnvAnd<'db, V>>
+ ) -> Canonical<'db, V>
where
V: TypeFoldable<DbInterner<'db>>,
{
- let (param_env, value) = value.into_parts();
- // FIXME(#118965): We don't canonicalize the static lifetimes that appear in the
- // `param_env` because they are treated differently by trait selection.
- let canonical_param_env = Canonicalizer::canonicalize(
- param_env,
- self,
- self.interner,
- &CanonicalizeFreeRegionsOtherThanStatic,
- query_state,
- );
-
- let canonical = Canonicalizer::canonicalize_with_base(
- canonical_param_env,
+ Canonicalizer::canonicalize(
value,
self,
self.interner,
&CanonicalizeAllFreeRegions,
query_state,
)
- .unchecked_map(|(param_env, value)| ParamEnvAnd { param_env, value });
- CanonicalQueryInput { canonical, typing_mode: self.typing_mode() }
}
/// Canonicalizes a query *response* `V`. When we canonicalize a
@@ -286,26 +271,6 @@ impl CanonicalizeMode for CanonicalizeAllFreeRegions {
}
}
-struct CanonicalizeFreeRegionsOtherThanStatic;
-
-impl CanonicalizeMode for CanonicalizeFreeRegionsOtherThanStatic {
- fn canonicalize_free_region<'db>(
- &self,
- canonicalizer: &mut Canonicalizer<'_, 'db>,
- r: Region<'db>,
- ) -> Region<'db> {
- if r.is_static() { r } else { canonicalizer.canonical_var_for_region_in_root_universe(r) }
- }
-
- fn any(&self) -> bool {
- true
- }
-
- fn preserve_universes(&self) -> bool {
- false
- }
-}
-
struct Canonicalizer<'cx, 'db> {
/// Set to `None` to disable the resolution of inference variables.
infcx: &'cx InferCtxt<'db>,
@@ -345,12 +310,9 @@ impl<'cx, 'db> TypeFolder<DbInterner<'db>> for Canonicalizer<'cx, 'db> {
fn fold_region(&mut self, r: Region<'db>) -> Region<'db> {
match r.kind() {
- RegionKind::ReBound(index, ..) => {
- if index >= self.binder_index {
- panic!("escaping late-bound region during canonicalization");
- } else {
- r
- }
+ RegionKind::ReBound(BoundVarIndexKind::Bound(..), ..) => r,
+ RegionKind::ReBound(BoundVarIndexKind::Canonical, ..) => {
+ panic!("canonicalized bound var found during canonicalization");
}
RegionKind::ReStatic
@@ -427,12 +389,9 @@ impl<'cx, 'db> TypeFolder<DbInterner<'db>> for Canonicalizer<'cx, 'db> {
self.canonicalize_ty_var(CanonicalVarKind::PlaceholderTy(placeholder), t)
}
- TyKind::Bound(debruijn, _) => {
- if debruijn >= self.binder_index {
- panic!("escaping bound type during canonicalization")
- } else {
- t
- }
+ TyKind::Bound(BoundVarIndexKind::Bound(..), _) => t,
+ TyKind::Bound(BoundVarIndexKind::Canonical, ..) => {
+ panic!("canonicalized bound var found during canonicalization");
}
TyKind::Closure(..)
@@ -503,12 +462,11 @@ impl<'cx, 'db> TypeFolder<DbInterner<'db>> for Canonicalizer<'cx, 'db> {
ConstKind::Infer(InferConst::Fresh(_)) => {
panic!("encountered a fresh const during canonicalization")
}
- ConstKind::Bound(debruijn, _) => {
- if debruijn >= self.binder_index {
- panic!("escaping bound const during canonicalization")
- } else {
- return ct;
- }
+ ConstKind::Bound(BoundVarIndexKind::Bound(..), _) => {
+ return ct;
+ }
+ ConstKind::Bound(BoundVarIndexKind::Canonical, ..) => {
+ panic!("canonicalized bound var found during canonicalization");
}
ConstKind::Placeholder(placeholder) => {
return self
@@ -758,8 +716,7 @@ impl<'cx, 'db> Canonicalizer<'cx, 'db> {
r: Region<'db>,
) -> Region<'db> {
let var = self.canonical_var(info, r.into());
- let br = BoundRegion { var, kind: BoundRegionKind::Anon };
- Region::new_bound(self.cx(), self.binder_index, br)
+ Region::new_canonical_bound(self.cx(), var)
}
/// Given a type variable `ty_var` of the given kind, first check
@@ -769,11 +726,7 @@ impl<'cx, 'db> Canonicalizer<'cx, 'db> {
fn canonicalize_ty_var(&mut self, info: CanonicalVarKind<'db>, ty_var: Ty<'db>) -> Ty<'db> {
debug_assert_eq!(ty_var, self.infcx.shallow_resolve(ty_var));
let var = self.canonical_var(info, ty_var.into());
- Ty::new_bound(
- self.tcx,
- self.binder_index,
- BoundTy { kind: crate::next_solver::BoundTyKind::Anon, var },
- )
+ Ty::new_canonical_bound(self.cx(), var)
}
/// Given a type variable `const_var` of the given kind, first check
@@ -787,6 +740,6 @@ impl<'cx, 'db> Canonicalizer<'cx, 'db> {
) -> Const<'db> {
debug_assert_eq!(const_var, self.infcx.shallow_resolve_const(const_var));
let var = self.canonical_var(info, const_var.into());
- Const::new_bound(self.tcx, self.binder_index, BoundConst { var })
+ Const::new_canonical_bound(self.cx(), var)
}
}