summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_middle/src/infer/canonical.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_middle/src/infer/canonical.rs')
-rw-r--r--compiler/rustc_middle/src/infer/canonical.rs84
1 files changed, 8 insertions, 76 deletions
diff --git a/compiler/rustc_middle/src/infer/canonical.rs b/compiler/rustc_middle/src/infer/canonical.rs
index 41beca072..64b63f4c5 100644
--- a/compiler/rustc_middle/src/infer/canonical.rs
+++ b/compiler/rustc_middle/src/infer/canonical.rs
@@ -21,35 +21,17 @@
//!
//! [c]: https://rust-lang.github.io/chalk/book/canonical_queries/canonicalization.html
-use crate::infer::MemberConstraint;
-use crate::mir::ConstraintCategory;
-use crate::ty::GenericArg;
-use crate::ty::{self, BoundVar, List, Region, Ty, TyCtxt};
use rustc_macros::HashStable;
+use rustc_type_ir::Canonical as IrCanonical;
use smallvec::SmallVec;
-use std::fmt::Display;
use std::ops::Index;
-/// A "canonicalized" type `V` is one where all free inference
-/// variables have been rewritten to "canonical vars". These are
-/// numbered starting from 0 in order of first appearance.
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TyDecodable, TyEncodable)]
-#[derive(HashStable, TypeFoldable, TypeVisitable)]
-pub struct Canonical<'tcx, V> {
- pub value: V,
- pub max_universe: ty::UniverseIndex,
- pub variables: CanonicalVarInfos<'tcx>,
-}
+use crate::infer::MemberConstraint;
+use crate::mir::ConstraintCategory;
+use crate::ty::GenericArg;
+use crate::ty::{self, BoundVar, List, Region, Ty, TyCtxt};
-impl<'tcx, V: Display> std::fmt::Display for Canonical<'tcx, V> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(
- f,
- "Canonical {{ value: {}, max_universe: {:?}, variables: {:?} }}",
- self.value, self.max_universe, self.variables
- )
- }
-}
+pub type Canonical<'tcx, V> = IrCanonical<TyCtxt<'tcx>, V>;
pub type CanonicalVarInfos<'tcx> = &'tcx List<CanonicalVarInfo<'tcx>>;
@@ -104,7 +86,7 @@ impl CanonicalVarValues<'_> {
} else {
// It's ok if this region var isn't unique
}
- },
+ }
ty::GenericArgKind::Type(ty) => {
if let ty::Bound(ty::INNERMOST, bt) = *ty.kind()
&& var == bt.var
@@ -240,7 +222,7 @@ pub enum CanonicalVarKind<'tcx> {
Effect,
/// A "placeholder" that represents "any const".
- PlaceholderConst(ty::PlaceholderConst<'tcx>, Ty<'tcx>),
+ PlaceholderConst(ty::PlaceholderConst, Ty<'tcx>),
}
impl<'tcx> CanonicalVarKind<'tcx> {
@@ -379,56 +361,6 @@ impl<'tcx, R> QueryResponse<'tcx, R> {
}
}
-impl<'tcx, R> Canonical<'tcx, QueryResponse<'tcx, R>> {
- pub fn is_proven(&self) -> bool {
- self.value.is_proven()
- }
-
- pub fn is_ambiguous(&self) -> bool {
- !self.is_proven()
- }
-}
-
-impl<'tcx, V> Canonical<'tcx, V> {
- /// Allows you to map the `value` of a canonical while keeping the
- /// same set of bound variables.
- ///
- /// **WARNING:** This function is very easy to mis-use, hence the
- /// name! In particular, the new value `W` must use all **the
- /// same type/region variables** in **precisely the same order**
- /// as the original! (The ordering is defined by the
- /// `TypeFoldable` implementation of the type in question.)
- ///
- /// An example of a **correct** use of this:
- ///
- /// ```rust,ignore (not real code)
- /// let a: Canonical<'_, T> = ...;
- /// let b: Canonical<'_, (T,)> = a.unchecked_map(|v| (v, ));
- /// ```
- ///
- /// An example of an **incorrect** use of this:
- ///
- /// ```rust,ignore (not real code)
- /// let a: Canonical<'tcx, T> = ...;
- /// let ty: Ty<'tcx> = ...;
- /// let b: Canonical<'tcx, (T, Ty<'tcx>)> = a.unchecked_map(|v| (v, ty));
- /// ```
- pub fn unchecked_map<W>(self, map_op: impl FnOnce(V) -> W) -> Canonical<'tcx, W> {
- let Canonical { max_universe, variables, value } = self;
- Canonical { max_universe, variables, value: map_op(value) }
- }
-
- /// Allows you to map the `value` of a canonical while keeping the same set of
- /// bound variables.
- ///
- /// **WARNING:** This function is very easy to mis-use, hence the name! See
- /// the comment of [Canonical::unchecked_map] for more details.
- pub fn unchecked_rebind<W>(self, value: W) -> Canonical<'tcx, W> {
- let Canonical { max_universe, variables, value: _ } = self;
- Canonical { max_universe, variables, value }
- }
-}
-
pub type QueryOutlivesConstraint<'tcx> =
(ty::OutlivesPredicate<GenericArg<'tcx>, Region<'tcx>>, ConstraintCategory<'tcx>);