Uplift InferConst to rustc_type_ir
This commit is contained in:
parent
c3ba158d30
commit
b4c3d7f3fd
8 changed files with 80 additions and 84 deletions
|
@ -3,7 +3,6 @@ use crate::mir;
|
||||||
use crate::ty::abstract_const::CastKind;
|
use crate::ty::abstract_const::CastKind;
|
||||||
use crate::ty::GenericArgsRef;
|
use crate::ty::GenericArgsRef;
|
||||||
use crate::ty::{self, visit::TypeVisitableExt as _, List, Ty, TyCtxt};
|
use crate::ty::{self, visit::TypeVisitableExt as _, List, Ty, TyCtxt};
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_macros::HashStable;
|
use rustc_macros::HashStable;
|
||||||
|
|
||||||
|
@ -77,28 +76,3 @@ static_assert_size!(Expr<'_>, 24);
|
||||||
|
|
||||||
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||||
static_assert_size!(super::ConstKind<'_>, 32);
|
static_assert_size!(super::ConstKind<'_>, 32);
|
||||||
|
|
||||||
/// An inference variable for a const, for use in const generics.
|
|
||||||
#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord, TyEncodable, TyDecodable, Hash)]
|
|
||||||
pub enum InferConst {
|
|
||||||
/// Infer the value of the const.
|
|
||||||
Var(ty::ConstVid),
|
|
||||||
/// Infer the value of the effect.
|
|
||||||
///
|
|
||||||
/// For why this is separate from the `Var` variant above, see the
|
|
||||||
/// documentation on `EffectVid`.
|
|
||||||
EffectVar(ty::EffectVid),
|
|
||||||
/// A fresh const variable. See `infer::freshen` for more details.
|
|
||||||
Fresh(u32),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<CTX> HashStable<CTX> for InferConst {
|
|
||||||
fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
|
|
||||||
match self {
|
|
||||||
InferConst::Var(_) | InferConst::EffectVar(_) => {
|
|
||||||
panic!("const variables should not be hashed: {self:?}")
|
|
||||||
}
|
|
||||||
InferConst::Fresh(i) => i.hash_stable(hcx, hasher),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -102,7 +102,6 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
|
||||||
type AllocId = crate::mir::interpret::AllocId;
|
type AllocId = crate::mir::interpret::AllocId;
|
||||||
|
|
||||||
type Const = ty::Const<'tcx>;
|
type Const = ty::Const<'tcx>;
|
||||||
type InferConst = ty::InferConst;
|
|
||||||
type AliasConst = ty::UnevaluatedConst<'tcx>;
|
type AliasConst = ty::UnevaluatedConst<'tcx>;
|
||||||
type PlaceholderConst = ty::PlaceholderConst;
|
type PlaceholderConst = ty::PlaceholderConst;
|
||||||
type ParamConst = ty::ParamConst;
|
type ParamConst = ty::ParamConst;
|
||||||
|
|
|
@ -84,9 +84,7 @@ pub use self::closure::{
|
||||||
CapturedPlace, ClosureKind, ClosureTypeInfo, MinCaptureInformationMap, MinCaptureList,
|
CapturedPlace, ClosureKind, ClosureTypeInfo, MinCaptureInformationMap, MinCaptureList,
|
||||||
RootVariableMinCaptureList, UpvarCapture, UpvarId, UpvarPath, CAPTURE_STRUCT_LOCAL,
|
RootVariableMinCaptureList, UpvarCapture, UpvarId, UpvarPath, CAPTURE_STRUCT_LOCAL,
|
||||||
};
|
};
|
||||||
pub use self::consts::{
|
pub use self::consts::{Const, ConstData, ConstInt, Expr, ScalarInt, UnevaluatedConst, ValTree};
|
||||||
Const, ConstData, ConstInt, Expr, InferConst, ScalarInt, UnevaluatedConst, ValTree,
|
|
||||||
};
|
|
||||||
pub use self::context::{
|
pub use self::context::{
|
||||||
tls, CtxtInterners, DeducedParamAttrs, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed,
|
tls, CtxtInterners, DeducedParamAttrs, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed,
|
||||||
};
|
};
|
||||||
|
@ -98,7 +96,7 @@ pub use self::sty::BoundRegionKind::*;
|
||||||
pub use self::sty::{
|
pub use self::sty::{
|
||||||
AliasTy, Article, Binder, BoundRegion, BoundRegionKind, BoundTy, BoundTyKind, BoundVar,
|
AliasTy, Article, Binder, BoundRegion, BoundRegionKind, BoundTy, BoundTyKind, BoundVar,
|
||||||
BoundVariableKind, CanonicalPolyFnSig, ClauseKind, ClosureArgs, ClosureArgsParts, ConstKind,
|
BoundVariableKind, CanonicalPolyFnSig, ClauseKind, ClosureArgs, ClosureArgsParts, ConstKind,
|
||||||
ConstVid, CoroutineArgs, CoroutineArgsParts, EarlyParamRegion, EffectVid, ExistentialPredicate,
|
CoroutineArgs, CoroutineArgsParts, EarlyParamRegion, ExistentialPredicate,
|
||||||
ExistentialProjection, ExistentialTraitRef, FnSig, GenSig, InlineConstArgs,
|
ExistentialProjection, ExistentialTraitRef, FnSig, GenSig, InlineConstArgs,
|
||||||
InlineConstArgsParts, LateParamRegion, ParamConst, ParamTy, PolyExistentialPredicate,
|
InlineConstArgsParts, LateParamRegion, ParamConst, ParamTy, PolyExistentialPredicate,
|
||||||
PolyExistentialProjection, PolyExistentialTraitRef, PolyFnSig, PolyGenSig, PolyTraitRef,
|
PolyExistentialProjection, PolyExistentialTraitRef, PolyFnSig, PolyGenSig, PolyTraitRef,
|
||||||
|
|
|
@ -202,34 +202,6 @@ impl<'tcx> DebugWithInfcx<TyCtxt<'tcx>> for AliasTy<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for ty::InferConst {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
match self {
|
|
||||||
InferConst::Var(var) => write!(f, "{var:?}"),
|
|
||||||
InferConst::EffectVar(var) => write!(f, "{var:?}"),
|
|
||||||
InferConst::Fresh(var) => write!(f, "Fresh({var:?})"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'tcx> DebugWithInfcx<TyCtxt<'tcx>> for ty::InferConst {
|
|
||||||
fn fmt<Infcx: InferCtxtLike<Interner = TyCtxt<'tcx>>>(
|
|
||||||
this: WithInfcx<'_, Infcx, &Self>,
|
|
||||||
f: &mut core::fmt::Formatter<'_>,
|
|
||||||
) -> core::fmt::Result {
|
|
||||||
use ty::InferConst::*;
|
|
||||||
match this.infcx.universe_of_ct(*this.data) {
|
|
||||||
None => write!(f, "{:?}", this.data),
|
|
||||||
Some(universe) => match *this.data {
|
|
||||||
Var(vid) => write!(f, "?{}_{}c", vid.index(), universe.index()),
|
|
||||||
EffectVar(vid) => write!(f, "?{}_{}e", vid.index(), universe.index()),
|
|
||||||
Fresh(_) => {
|
|
||||||
unreachable!()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> fmt::Debug for ty::consts::Expr<'tcx> {
|
impl<'tcx> fmt::Debug for ty::consts::Expr<'tcx> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
WithInfcx::with_no_infcx(self).fmt(f)
|
WithInfcx::with_no_infcx(self).fmt(f)
|
||||||
|
|
|
@ -1608,24 +1608,6 @@ impl fmt::Debug for EarlyParamRegion {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rustc_index::newtype_index! {
|
|
||||||
/// A **`const`** **v**ariable **ID**.
|
|
||||||
#[debug_format = "?{}c"]
|
|
||||||
pub struct ConstVid {}
|
|
||||||
}
|
|
||||||
|
|
||||||
rustc_index::newtype_index! {
|
|
||||||
/// An **effect** **v**ariable **ID**.
|
|
||||||
///
|
|
||||||
/// Handling effect infer variables happens separately from const infer variables
|
|
||||||
/// because we do not want to reuse any of the const infer machinery. If we try to
|
|
||||||
/// relate an effect variable with a normal one, we would ICE, which can catch bugs
|
|
||||||
/// where we are not correctly using the effect var for an effect param. Fallback
|
|
||||||
/// is also implemented on top of having separate effect and normal const variables.
|
|
||||||
#[debug_format = "?{}e"]
|
|
||||||
pub struct EffectVid {}
|
|
||||||
}
|
|
||||||
|
|
||||||
rustc_index::newtype_index! {
|
rustc_index::newtype_index! {
|
||||||
/// A **region** (lifetime) **v**ariable **ID**.
|
/// A **region** (lifetime) **v**ariable **ID**.
|
||||||
#[derive(HashStable)]
|
#[derive(HashStable)]
|
||||||
|
|
|
@ -22,7 +22,7 @@ pub enum ConstKind<I: Interner> {
|
||||||
Param(I::ParamConst),
|
Param(I::ParamConst),
|
||||||
|
|
||||||
/// Infer the value of the const.
|
/// Infer the value of the const.
|
||||||
Infer(I::InferConst),
|
Infer(InferConst),
|
||||||
|
|
||||||
/// Bound const variable, used only when preparing a trait query.
|
/// Bound const variable, used only when preparing a trait query.
|
||||||
Bound(DebruijnIndex, I::BoundConst),
|
Bound(DebruijnIndex, I::BoundConst),
|
||||||
|
@ -65,7 +65,6 @@ const fn const_kind_discriminant<I: Interner>(value: &ConstKind<I>) -> usize {
|
||||||
impl<CTX: crate::HashStableContext, I: Interner> HashStable<CTX> for ConstKind<I>
|
impl<CTX: crate::HashStableContext, I: Interner> HashStable<CTX> for ConstKind<I>
|
||||||
where
|
where
|
||||||
I::ParamConst: HashStable<CTX>,
|
I::ParamConst: HashStable<CTX>,
|
||||||
I::InferConst: HashStable<CTX>,
|
|
||||||
I::BoundConst: HashStable<CTX>,
|
I::BoundConst: HashStable<CTX>,
|
||||||
I::PlaceholderConst: HashStable<CTX>,
|
I::PlaceholderConst: HashStable<CTX>,
|
||||||
I::AliasConst: HashStable<CTX>,
|
I::AliasConst: HashStable<CTX>,
|
||||||
|
@ -136,3 +135,77 @@ impl<I: Interner> DebugWithInfcx<I> for ConstKind<I> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rustc_index::newtype_index! {
|
||||||
|
/// A **`const`** **v**ariable **ID**.
|
||||||
|
#[debug_format = "?{}c"]
|
||||||
|
#[gate_rustc_only]
|
||||||
|
pub struct ConstVid {}
|
||||||
|
}
|
||||||
|
|
||||||
|
rustc_index::newtype_index! {
|
||||||
|
/// An **effect** **v**ariable **ID**.
|
||||||
|
///
|
||||||
|
/// Handling effect infer variables happens separately from const infer variables
|
||||||
|
/// because we do not want to reuse any of the const infer machinery. If we try to
|
||||||
|
/// relate an effect variable with a normal one, we would ICE, which can catch bugs
|
||||||
|
/// where we are not correctly using the effect var for an effect param. Fallback
|
||||||
|
/// is also implemented on top of having separate effect and normal const variables.
|
||||||
|
#[debug_format = "?{}e"]
|
||||||
|
#[gate_rustc_only]
|
||||||
|
pub struct EffectVid {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// An inference variable for a const, for use in const generics.
|
||||||
|
#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord, Hash)]
|
||||||
|
#[cfg_attr(feature = "nightly", derive(TyEncodable, TyDecodable))]
|
||||||
|
pub enum InferConst {
|
||||||
|
/// Infer the value of the const.
|
||||||
|
Var(ConstVid),
|
||||||
|
/// Infer the value of the effect.
|
||||||
|
///
|
||||||
|
/// For why this is separate from the `Var` variant above, see the
|
||||||
|
/// documentation on `EffectVid`.
|
||||||
|
EffectVar(EffectVid),
|
||||||
|
/// A fresh const variable. See `infer::freshen` for more details.
|
||||||
|
Fresh(u32),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for InferConst {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
InferConst::Var(var) => write!(f, "{var:?}"),
|
||||||
|
InferConst::EffectVar(var) => write!(f, "{var:?}"),
|
||||||
|
InferConst::Fresh(var) => write!(f, "Fresh({var:?})"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<I: Interner> DebugWithInfcx<I> for InferConst {
|
||||||
|
fn fmt<Infcx: InferCtxtLike<Interner = I>>(
|
||||||
|
this: WithInfcx<'_, Infcx, &Self>,
|
||||||
|
f: &mut core::fmt::Formatter<'_>,
|
||||||
|
) -> core::fmt::Result {
|
||||||
|
match this.infcx.universe_of_ct(*this.data) {
|
||||||
|
None => write!(f, "{:?}", this.data),
|
||||||
|
Some(universe) => match *this.data {
|
||||||
|
InferConst::Var(vid) => write!(f, "?{}_{}c", vid.index(), universe.index()),
|
||||||
|
InferConst::EffectVar(vid) => write!(f, "?{}_{}e", vid.index(), universe.index()),
|
||||||
|
InferConst::Fresh(_) => {
|
||||||
|
unreachable!()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "nightly")]
|
||||||
|
impl<CTX> HashStable<CTX> for InferConst {
|
||||||
|
fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
|
||||||
|
match self {
|
||||||
|
InferConst::Var(_) | InferConst::EffectVar(_) => {
|
||||||
|
panic!("const variables should not be hashed: {self:?}")
|
||||||
|
}
|
||||||
|
InferConst::Fresh(i) => i.hash_stable(hcx, hasher),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{InferTy, Interner, UniverseIndex};
|
use crate::{InferConst, InferTy, Interner, UniverseIndex};
|
||||||
|
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
@ -13,8 +13,7 @@ pub trait InferCtxtLike {
|
||||||
lt: <Self::Interner as Interner>::InferRegion,
|
lt: <Self::Interner as Interner>::InferRegion,
|
||||||
) -> Option<UniverseIndex>;
|
) -> Option<UniverseIndex>;
|
||||||
|
|
||||||
fn universe_of_ct(&self, ct: <Self::Interner as Interner>::InferConst)
|
fn universe_of_ct(&self, ct: InferConst) -> Option<UniverseIndex>;
|
||||||
-> Option<UniverseIndex>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct NoInfcx<I>(PhantomData<I>);
|
pub struct NoInfcx<I>(PhantomData<I>);
|
||||||
|
@ -26,7 +25,7 @@ impl<I: Interner> InferCtxtLike for NoInfcx<I> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn universe_of_ct(&self, _ct: <I as Interner>::InferConst) -> Option<UniverseIndex> {
|
fn universe_of_ct(&self, _ct: InferConst) -> Option<UniverseIndex> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@ pub trait Interner: Sized {
|
||||||
|
|
||||||
// Kinds of consts
|
// Kinds of consts
|
||||||
type Const: Clone + DebugWithInfcx<Self> + Hash + Ord;
|
type Const: Clone + DebugWithInfcx<Self> + Hash + Ord;
|
||||||
type InferConst: Clone + DebugWithInfcx<Self> + Hash + Ord;
|
|
||||||
type AliasConst: Clone + DebugWithInfcx<Self> + Hash + Ord;
|
type AliasConst: Clone + DebugWithInfcx<Self> + Hash + Ord;
|
||||||
type PlaceholderConst: Clone + Debug + Hash + Ord;
|
type PlaceholderConst: Clone + Debug + Hash + Ord;
|
||||||
type ParamConst: Clone + Debug + Hash + Ord;
|
type ParamConst: Clone + Debug + Hash + Ord;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue