Basic removal of Ty
from places (boring)
This commit is contained in:
parent
7ebd2bdbf6
commit
58feec9b85
71 changed files with 331 additions and 581 deletions
|
@ -237,7 +237,8 @@ impl<'tcx> Const<'tcx> {
|
|||
#[inline(always)]
|
||||
pub fn ty(&self) -> Ty<'tcx> {
|
||||
match self {
|
||||
Const::Ty(c) => c.ty(),
|
||||
// THISPR
|
||||
Const::Ty(c) => todo!(),
|
||||
Const::Val(_, ty) | Const::Unevaluated(_, ty) => *ty,
|
||||
}
|
||||
}
|
||||
|
@ -260,7 +261,9 @@ impl<'tcx> Const<'tcx> {
|
|||
pub fn try_to_scalar(self) -> Option<Scalar> {
|
||||
match self {
|
||||
Const::Ty(c) => match c.kind() {
|
||||
ty::ConstKind::Value(valtree) if c.ty().is_primitive() => {
|
||||
// THISPR
|
||||
// if c.ty().is_primitive()
|
||||
ty::ConstKind::Value(valtree) if todo!() => {
|
||||
// A valtree of a type where leaves directly represent the scalar const value.
|
||||
// Just checking whether it is a leaf is insufficient as e.g. references are leafs
|
||||
// but the leaf value is the value they point to, not the reference itself!
|
||||
|
@ -279,9 +282,9 @@ impl<'tcx> Const<'tcx> {
|
|||
match self {
|
||||
Const::Val(ConstValue::Scalar(Scalar::Int(x)), _) => Some(x),
|
||||
Const::Ty(c) => match c.kind() {
|
||||
ty::ConstKind::Value(valtree) if c.ty().is_primitive() => {
|
||||
Some(valtree.unwrap_leaf())
|
||||
}
|
||||
// THISPR
|
||||
// if c.ty().is_primitive()
|
||||
ty::ConstKind::Value(valtree) if todo!() => Some(valtree.unwrap_leaf()),
|
||||
_ => None,
|
||||
},
|
||||
_ => None,
|
||||
|
@ -326,7 +329,7 @@ impl<'tcx> Const<'tcx> {
|
|||
match self.eval(tcx, param_env, DUMMY_SP) {
|
||||
Ok(val) => Self::Val(val, self.ty()),
|
||||
Err(ErrorHandled::Reported(guar, _span)) => {
|
||||
Self::Ty(ty::Const::new_error(tcx, guar.into(), self.ty()))
|
||||
Self::Ty(ty::Const::new_error(tcx, guar.into()))
|
||||
}
|
||||
Err(ErrorHandled::TooGeneric(_span)) => self,
|
||||
}
|
||||
|
@ -339,7 +342,9 @@ impl<'tcx> Const<'tcx> {
|
|||
param_env: ty::ParamEnv<'tcx>,
|
||||
) -> Option<Scalar> {
|
||||
match self {
|
||||
Const::Ty(c) if c.ty().is_primitive() => {
|
||||
// THISPR
|
||||
// c.ty().is_primitive()
|
||||
Const::Ty(c) if todo!() => {
|
||||
// Avoid the `valtree_to_const_val` query. Can only be done on primitive types that
|
||||
// are valtree leaves, and *not* on references. (References should return the
|
||||
// pointer here, which valtrees don't represent.)
|
||||
|
@ -443,8 +448,9 @@ impl<'tcx> Const<'tcx> {
|
|||
match c.kind() {
|
||||
ty::ConstKind::Value(valtree) => {
|
||||
// Make sure that if `c` is normalized, then the return value is normalized.
|
||||
let const_val = tcx.valtree_to_const_val((c.ty(), valtree));
|
||||
Self::Val(const_val, c.ty())
|
||||
// THISPR
|
||||
let const_val = tcx.valtree_to_const_val((todo!(), valtree));
|
||||
Self::Val(const_val, todo!())
|
||||
}
|
||||
_ => Self::Ty(c),
|
||||
}
|
||||
|
@ -463,7 +469,9 @@ impl<'tcx> Const<'tcx> {
|
|||
// A valtree may be a reference. Valtree references correspond to a
|
||||
// different allocation each time they are evaluated. Valtrees for primitive
|
||||
// types are fine though.
|
||||
ty::ConstKind::Value(_) => c.ty().is_primitive(),
|
||||
// THISPR
|
||||
// c.ty().is_primitive()
|
||||
ty::ConstKind::Value(_) => todo!(),
|
||||
ty::ConstKind::Unevaluated(..) | ty::ConstKind::Expr(..) => false,
|
||||
// This can happen if evaluation of a constant failed. The result does not matter
|
||||
// much since compilation is doomed.
|
||||
|
|
|
@ -53,7 +53,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
fn fold_const(&mut self, c: Const<'tcx>) -> Const<'tcx> {
|
||||
let ct = match c.kind() {
|
||||
ty::ConstKind::Unevaluated(uv) => match self.tcx.thir_abstract_const(uv.def) {
|
||||
Err(e) => ty::Const::new_error(self.tcx, e, c.ty()),
|
||||
Err(e) => ty::Const::new_error(self.tcx, e),
|
||||
Ok(Some(bac)) => {
|
||||
let args = self.tcx.erase_regions(uv.args);
|
||||
let bac = bac.instantiate(self.tcx, args);
|
||||
|
|
|
@ -350,8 +350,8 @@ impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> RefDecodable<'tcx, D>
|
|||
|
||||
impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<D> for ty::Const<'tcx> {
|
||||
fn decode(decoder: &mut D) -> Self {
|
||||
let consts: ty::ConstData<'tcx> = Decodable::decode(decoder);
|
||||
decoder.interner().mk_ct_from_kind(consts.kind, consts.ty)
|
||||
let kind: ty::ConstKind<'tcx> = Decodable::decode(decoder);
|
||||
decoder.interner().mk_ct_from_kind(kind)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ use rustc_error_messages::MultiSpan;
|
|||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_macros::{HashStable, TyDecodable, TyEncodable};
|
||||
use rustc_macros::HashStable;
|
||||
use rustc_type_ir::{self as ir, TypeFlags, WithCachedTypeInfo};
|
||||
use tracing::{debug, instrument};
|
||||
|
||||
|
@ -26,10 +26,9 @@ pub type UnevaluatedConst<'tcx> = ir::UnevaluatedConst<TyCtxt<'tcx>>;
|
|||
#[cfg(target_pointer_width = "64")]
|
||||
rustc_data_structures::static_assert_size!(ConstKind<'_>, 24);
|
||||
|
||||
/// Use this rather than `ConstData`, whenever possible.
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, HashStable)]
|
||||
#[rustc_pass_by_value]
|
||||
pub struct Const<'tcx>(pub(super) Interned<'tcx, WithCachedTypeInfo<ConstData<'tcx>>>);
|
||||
pub struct Const<'tcx>(pub(super) Interned<'tcx, WithCachedTypeInfo<ConstKind<'tcx>>>);
|
||||
|
||||
impl<'tcx> rustc_type_ir::inherent::IntoKind for Const<'tcx> {
|
||||
type Kind = ConstKind<'tcx>;
|
||||
|
@ -49,26 +48,11 @@ impl<'tcx> rustc_type_ir::visit::Flags for Const<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Typed constant value.
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
|
||||
#[derive(HashStable, TyEncodable, TyDecodable)]
|
||||
pub struct ConstData<'tcx> {
|
||||
pub ty: Ty<'tcx>,
|
||||
pub kind: ConstKind<'tcx>,
|
||||
}
|
||||
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
rustc_data_structures::static_assert_size!(ConstData<'_>, 32);
|
||||
|
||||
impl<'tcx> Const<'tcx> {
|
||||
#[inline]
|
||||
pub fn ty(self) -> Ty<'tcx> {
|
||||
self.0.ty
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn kind(self) -> ConstKind<'tcx> {
|
||||
self.0.kind
|
||||
let a: &ConstKind<'tcx> = self.0.0;
|
||||
*a
|
||||
}
|
||||
|
||||
// FIXME(compiler-errors): Think about removing this.
|
||||
|
@ -84,28 +68,28 @@ impl<'tcx> Const<'tcx> {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new(tcx: TyCtxt<'tcx>, kind: ty::ConstKind<'tcx>, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
tcx.mk_ct_from_kind(kind, ty)
|
||||
pub fn new(tcx: TyCtxt<'tcx>, kind: ty::ConstKind<'tcx>) -> Const<'tcx> {
|
||||
tcx.mk_ct_from_kind(kind)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_param(tcx: TyCtxt<'tcx>, param: ty::ParamConst, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Param(param), ty)
|
||||
pub fn new_param(tcx: TyCtxt<'tcx>, param: ty::ParamConst) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Param(param))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_var(tcx: TyCtxt<'tcx>, infer: ty::ConstVid, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Infer(ty::InferConst::Var(infer)), ty)
|
||||
pub fn new_var(tcx: TyCtxt<'tcx>, infer: ty::ConstVid) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Infer(ty::InferConst::Var(infer)))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_fresh(tcx: TyCtxt<'tcx>, fresh: u32, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Infer(ty::InferConst::Fresh(fresh)), ty)
|
||||
pub fn new_fresh(tcx: TyCtxt<'tcx>, fresh: u32) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Infer(ty::InferConst::Fresh(fresh)))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_infer(tcx: TyCtxt<'tcx>, infer: ty::InferConst, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Infer(infer), ty)
|
||||
pub fn new_infer(tcx: TyCtxt<'tcx>, infer: ty::InferConst) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Infer(infer))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -113,50 +97,40 @@ impl<'tcx> Const<'tcx> {
|
|||
tcx: TyCtxt<'tcx>,
|
||||
debruijn: ty::DebruijnIndex,
|
||||
var: ty::BoundVar,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Bound(debruijn, var), ty)
|
||||
Const::new(tcx, ty::ConstKind::Bound(debruijn, var))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_placeholder(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
placeholder: ty::PlaceholderConst,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Placeholder(placeholder), ty)
|
||||
pub fn new_placeholder(tcx: TyCtxt<'tcx>, placeholder: ty::PlaceholderConst) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Placeholder(placeholder))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_unevaluated(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
uv: ty::UnevaluatedConst<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Unevaluated(uv), ty)
|
||||
pub fn new_unevaluated(tcx: TyCtxt<'tcx>, uv: ty::UnevaluatedConst<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Unevaluated(uv))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_value(tcx: TyCtxt<'tcx>, val: ty::ValTree<'tcx>, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Value(val), ty)
|
||||
Const::new(tcx, ty::ConstKind::Value(ty, val))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_expr(tcx: TyCtxt<'tcx>, expr: ty::Expr<'tcx>, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Expr(expr), ty)
|
||||
pub fn new_expr(tcx: TyCtxt<'tcx>, expr: ty::Expr<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Expr(expr))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_error(tcx: TyCtxt<'tcx>, e: ty::ErrorGuaranteed, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Error(e), ty)
|
||||
pub fn new_error(tcx: TyCtxt<'tcx>, e: ty::ErrorGuaranteed) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Error(e))
|
||||
}
|
||||
|
||||
/// Like [Ty::new_error] but for constants.
|
||||
#[track_caller]
|
||||
pub fn new_misc_error(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
pub fn new_misc_error(tcx: TyCtxt<'tcx>) -> Const<'tcx> {
|
||||
Const::new_error_with_message(
|
||||
tcx,
|
||||
ty,
|
||||
DUMMY_SP,
|
||||
"ty::ConstKind::Error constructed but no error reported",
|
||||
)
|
||||
|
@ -166,48 +140,33 @@ impl<'tcx> Const<'tcx> {
|
|||
#[track_caller]
|
||||
pub fn new_error_with_message<S: Into<MultiSpan>>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
span: S,
|
||||
msg: &'static str,
|
||||
) -> Const<'tcx> {
|
||||
let reported = tcx.dcx().span_delayed_bug(span, msg);
|
||||
Const::new_error(tcx, reported, ty)
|
||||
Const::new_error(tcx, reported)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> rustc_type_ir::inherent::Const<TyCtxt<'tcx>> for Const<'tcx> {
|
||||
fn new_infer(tcx: TyCtxt<'tcx>, infer: ty::InferConst, ty: Ty<'tcx>) -> Self {
|
||||
Const::new_infer(tcx, infer, ty)
|
||||
fn new_infer(tcx: TyCtxt<'tcx>, infer: ty::InferConst) -> Self {
|
||||
Const::new_infer(tcx, infer)
|
||||
}
|
||||
|
||||
fn new_var(tcx: TyCtxt<'tcx>, vid: ty::ConstVid, ty: Ty<'tcx>) -> Self {
|
||||
Const::new_var(tcx, vid, ty)
|
||||
fn new_var(tcx: TyCtxt<'tcx>, vid: ty::ConstVid) -> Self {
|
||||
Const::new_var(tcx, vid)
|
||||
}
|
||||
|
||||
fn new_bound(
|
||||
interner: TyCtxt<'tcx>,
|
||||
debruijn: ty::DebruijnIndex,
|
||||
var: ty::BoundVar,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Self {
|
||||
Const::new_bound(interner, debruijn, var, ty)
|
||||
fn new_bound(interner: TyCtxt<'tcx>, debruijn: ty::DebruijnIndex, var: ty::BoundVar) -> Self {
|
||||
Const::new_bound(interner, debruijn, var)
|
||||
}
|
||||
|
||||
fn new_anon_bound(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
debruijn: ty::DebruijnIndex,
|
||||
var: ty::BoundVar,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Self {
|
||||
Const::new_bound(tcx, debruijn, var, ty)
|
||||
fn new_anon_bound(tcx: TyCtxt<'tcx>, debruijn: ty::DebruijnIndex, var: ty::BoundVar) -> Self {
|
||||
Const::new_bound(tcx, debruijn, var)
|
||||
}
|
||||
|
||||
fn new_unevaluated(
|
||||
interner: TyCtxt<'tcx>,
|
||||
uv: ty::UnevaluatedConst<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Self {
|
||||
Const::new_unevaluated(interner, uv, ty)
|
||||
fn new_unevaluated(interner: TyCtxt<'tcx>, uv: ty::UnevaluatedConst<'tcx>) -> Self {
|
||||
Const::new_unevaluated(interner, uv)
|
||||
}
|
||||
|
||||
fn ty(self) -> Ty<'tcx> {
|
||||
|
@ -241,7 +200,6 @@ impl<'tcx> Const<'tcx> {
|
|||
def: def.to_def_id(),
|
||||
args: GenericArgs::identity_for_item(tcx, def.to_def_id()),
|
||||
},
|
||||
ty,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
@ -293,9 +251,6 @@ impl<'tcx> Const<'tcx> {
|
|||
_,
|
||||
&hir::Path { res: Res::Def(DefKind::ConstParam, def_id), .. },
|
||||
)) => {
|
||||
// Use the type from the param's definition, since we can resolve it,
|
||||
// not the expected parameter type from WithOptConstParam.
|
||||
let param_ty = tcx.type_of(def_id).instantiate_identity();
|
||||
match tcx.named_bound_var(expr.hir_id) {
|
||||
Some(rbv::ResolvedArg::EarlyBound(_)) => {
|
||||
// Find the name and index of the const parameter by indexing the generics of
|
||||
|
@ -304,19 +259,12 @@ impl<'tcx> Const<'tcx> {
|
|||
let generics = tcx.generics_of(item_def_id);
|
||||
let index = generics.param_def_id_to_index[&def_id];
|
||||
let name = tcx.item_name(def_id);
|
||||
Some(ty::Const::new_param(tcx, ty::ParamConst::new(index, name), param_ty))
|
||||
Some(ty::Const::new_param(tcx, ty::ParamConst::new(index, name)))
|
||||
}
|
||||
Some(rbv::ResolvedArg::LateBound(debruijn, index, _)) => {
|
||||
Some(ty::Const::new_bound(
|
||||
tcx,
|
||||
debruijn,
|
||||
ty::BoundVar::from_u32(index),
|
||||
param_ty,
|
||||
))
|
||||
}
|
||||
Some(rbv::ResolvedArg::Error(guar)) => {
|
||||
Some(ty::Const::new_error(tcx, guar, param_ty))
|
||||
Some(ty::Const::new_bound(tcx, debruijn, ty::BoundVar::from_u32(index)))
|
||||
}
|
||||
Some(rbv::ResolvedArg::Error(guar)) => Some(ty::Const::new_error(tcx, guar)),
|
||||
arg => bug!("unexpected bound var resolution for {:?}: {arg:?}", expr.hir_id),
|
||||
}
|
||||
}
|
||||
|
@ -397,8 +345,8 @@ impl<'tcx> Const<'tcx> {
|
|||
#[inline]
|
||||
pub fn normalize(self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>) -> Self {
|
||||
match self.eval(tcx, param_env, DUMMY_SP) {
|
||||
Ok(val) => Self::new_value(tcx, val, self.ty()),
|
||||
Err(ErrorHandled::Reported(r, _span)) => Self::new_error(tcx, r.into(), self.ty()),
|
||||
Ok(val) => Self::new_value(tcx, val, self.ty_for_ctfe(tcx).unwrap()),
|
||||
Err(ErrorHandled::Reported(r, _span)) => Self::new_error(tcx, r.into()),
|
||||
Err(ErrorHandled::TooGeneric(_span)) => self,
|
||||
}
|
||||
}
|
||||
|
@ -430,8 +378,12 @@ impl<'tcx> Const<'tcx> {
|
|||
/// contains const generic parameters or pointers).
|
||||
pub fn try_eval_bits(self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>) -> Option<u128> {
|
||||
let int = self.try_eval_scalar_int(tcx, param_env)?;
|
||||
let size =
|
||||
tcx.layout_of(param_env.with_reveal_all_normalized(tcx).and(self.ty())).ok()?.size;
|
||||
let size = tcx
|
||||
.layout_of(
|
||||
param_env.with_reveal_all_normalized(tcx).and(self.ty_for_ctfe(tcx).unwrap()),
|
||||
)
|
||||
.ok()?
|
||||
.size;
|
||||
// if `ty` does not depend on generic parameters, use an empty param_env
|
||||
int.try_to_bits(size).ok()
|
||||
}
|
||||
|
@ -440,7 +392,7 @@ impl<'tcx> Const<'tcx> {
|
|||
/// Panics if the value cannot be evaluated or doesn't contain a valid integer of the given type.
|
||||
pub fn eval_bits(self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>) -> u128 {
|
||||
self.try_eval_bits(tcx, param_env)
|
||||
.unwrap_or_else(|| bug!("expected bits of {:#?}, got {:#?}", self.ty(), self))
|
||||
.unwrap_or_else(|| bug!("failed to evalate {:#?} to bits", self))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
@ -28,10 +28,10 @@ use crate::traits::solve::{
|
|||
};
|
||||
use crate::ty::predicate::ExistentialPredicateStableCmpExt as _;
|
||||
use crate::ty::{
|
||||
self, AdtDef, AdtDefData, AdtKind, Binder, Clause, Clauses, Const, ConstData,
|
||||
GenericParamDefKind, ImplPolarity, List, ListWithCachedTypeInfo, ParamConst, ParamTy, Pattern,
|
||||
PatternKind, PolyExistentialPredicate, PolyFnSig, Predicate, PredicateKind, PredicatePolarity,
|
||||
Region, RegionKind, ReprOptions, TraitObjectVisitor, Ty, TyKind, TyVid, Visibility,
|
||||
self, AdtDef, AdtDefData, AdtKind, Binder, Clause, Clauses, Const, GenericParamDefKind,
|
||||
ImplPolarity, List, ListWithCachedTypeInfo, ParamConst, ParamTy, Pattern, PatternKind,
|
||||
PolyExistentialPredicate, PolyFnSig, Predicate, PredicateKind, PredicatePolarity, Region,
|
||||
RegionKind, ReprOptions, TraitObjectVisitor, Ty, TyKind, TyVid, Visibility,
|
||||
};
|
||||
use crate::ty::{GenericArg, GenericArgs, GenericArgsRef};
|
||||
use rustc_ast::{self as ast, attr};
|
||||
|
@ -268,7 +268,7 @@ pub struct CtxtInterners<'tcx> {
|
|||
clauses: InternedSet<'tcx, ListWithCachedTypeInfo<Clause<'tcx>>>,
|
||||
projs: InternedSet<'tcx, List<ProjectionKind>>,
|
||||
place_elems: InternedSet<'tcx, List<PlaceElem<'tcx>>>,
|
||||
const_: InternedSet<'tcx, WithCachedTypeInfo<ConstData<'tcx>>>,
|
||||
const_: InternedSet<'tcx, WithCachedTypeInfo<ty::ConstKind<'tcx>>>,
|
||||
pat: InternedSet<'tcx, PatternKind<'tcx>>,
|
||||
const_allocation: InternedSet<'tcx, Allocation>,
|
||||
bound_variable_kinds: InternedSet<'tcx, List<ty::BoundVariableKind>>,
|
||||
|
@ -338,18 +338,18 @@ impl<'tcx> CtxtInterners<'tcx> {
|
|||
#[inline(never)]
|
||||
fn intern_const(
|
||||
&self,
|
||||
data: ty::ConstData<'tcx>,
|
||||
kind: ty::ConstKind<'tcx>,
|
||||
sess: &Session,
|
||||
untracked: &Untracked,
|
||||
) -> Const<'tcx> {
|
||||
Const(Interned::new_unchecked(
|
||||
self.const_
|
||||
.intern(data, |data: ConstData<'_>| {
|
||||
let flags = super::flags::FlagComputation::for_const(&data.kind, data.ty);
|
||||
let stable_hash = self.stable_hash(&flags, sess, untracked, &data);
|
||||
.intern(kind, |kind: ty::ConstKind<'_>| {
|
||||
let flags = super::flags::FlagComputation::for_const_kind(&kind);
|
||||
let stable_hash = self.stable_hash(&flags, sess, untracked, &kind);
|
||||
|
||||
InternedInSet(self.arena.alloc(WithCachedTypeInfo {
|
||||
internee: data,
|
||||
internee: kind,
|
||||
stable_hash,
|
||||
flags: flags.flags,
|
||||
outer_exclusive_binder: flags.outer_exclusive_binder,
|
||||
|
@ -601,18 +601,9 @@ impl<'tcx> CommonConsts<'tcx> {
|
|||
};
|
||||
|
||||
CommonConsts {
|
||||
unit: mk_const(ty::ConstData {
|
||||
kind: ty::ConstKind::Value(ty::ValTree::zst()),
|
||||
ty: types.unit,
|
||||
}),
|
||||
true_: mk_const(ty::ConstData {
|
||||
kind: ty::ConstKind::Value(ty::ValTree::Leaf(ty::ScalarInt::TRUE)),
|
||||
ty: types.bool,
|
||||
}),
|
||||
false_: mk_const(ty::ConstData {
|
||||
kind: ty::ConstKind::Value(ty::ValTree::Leaf(ty::ScalarInt::FALSE)),
|
||||
ty: types.bool,
|
||||
}),
|
||||
unit: mk_const(ty::ConstKind::Value(ty::ValTree::zst())),
|
||||
true_: mk_const(ty::ConstKind::Value(ty::ValTree::Leaf(ty::ScalarInt::TRUE))),
|
||||
false_: mk_const(ty::ConstKind::Value(ty::ValTree::Leaf(ty::ScalarInt::FALSE))),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2225,9 +2216,9 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn mk_ct_from_kind(self, kind: ty::ConstKind<'tcx>, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
pub fn mk_ct_from_kind(self, kind: ty::ConstKind<'tcx>) -> Const<'tcx> {
|
||||
self.interners.intern_const(
|
||||
ty::ConstData { kind, ty },
|
||||
kind,
|
||||
self.sess,
|
||||
// This is only used to create a stable hashing context.
|
||||
&self.untracked,
|
||||
|
@ -2252,14 +2243,10 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
ty::Region::new_early_param(self, param.to_early_bound_region_data()).into()
|
||||
}
|
||||
GenericParamDefKind::Type { .. } => Ty::new_param(self, param.index, param.name).into(),
|
||||
GenericParamDefKind::Const { .. } => ty::Const::new_param(
|
||||
self,
|
||||
ParamConst { index: param.index, name: param.name },
|
||||
self.type_of(param.def_id)
|
||||
.no_bound_vars()
|
||||
.expect("const parameter types cannot be generic"),
|
||||
)
|
||||
.into(),
|
||||
GenericParamDefKind::Const { .. } => {
|
||||
ty::Const::new_param(self, ParamConst { index: param.index, name: param.name })
|
||||
.into()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,10 +28,9 @@ impl FlagComputation {
|
|||
result
|
||||
}
|
||||
|
||||
pub fn for_const(c: &ty::ConstKind<'_>, t: Ty<'_>) -> FlagComputation {
|
||||
pub fn for_const_kind(kind: &ty::ConstKind<'_>) -> FlagComputation {
|
||||
let mut result = FlagComputation::new();
|
||||
result.add_const_kind(c);
|
||||
result.add_ty(t);
|
||||
result.add_const_kind(kind);
|
||||
result
|
||||
}
|
||||
|
||||
|
|
|
@ -134,13 +134,13 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for RegionFolder<'a, 'tcx> {
|
|||
pub trait BoundVarReplacerDelegate<'tcx> {
|
||||
fn replace_region(&mut self, br: ty::BoundRegion) -> ty::Region<'tcx>;
|
||||
fn replace_ty(&mut self, bt: ty::BoundTy) -> Ty<'tcx>;
|
||||
fn replace_const(&mut self, bv: ty::BoundVar, ty: Ty<'tcx>) -> ty::Const<'tcx>;
|
||||
fn replace_const(&mut self, bv: ty::BoundVar) -> ty::Const<'tcx>;
|
||||
}
|
||||
|
||||
pub struct FnMutDelegate<'a, 'tcx> {
|
||||
pub regions: &'a mut (dyn FnMut(ty::BoundRegion) -> ty::Region<'tcx> + 'a),
|
||||
pub types: &'a mut (dyn FnMut(ty::BoundTy) -> Ty<'tcx> + 'a),
|
||||
pub consts: &'a mut (dyn FnMut(ty::BoundVar, Ty<'tcx>) -> ty::Const<'tcx> + 'a),
|
||||
pub consts: &'a mut (dyn FnMut(ty::BoundVar) -> ty::Const<'tcx> + 'a),
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> BoundVarReplacerDelegate<'tcx> for FnMutDelegate<'a, 'tcx> {
|
||||
|
@ -150,8 +150,8 @@ impl<'a, 'tcx> BoundVarReplacerDelegate<'tcx> for FnMutDelegate<'a, 'tcx> {
|
|||
fn replace_ty(&mut self, bt: ty::BoundTy) -> Ty<'tcx> {
|
||||
(self.types)(bt)
|
||||
}
|
||||
fn replace_const(&mut self, bv: ty::BoundVar, ty: Ty<'tcx>) -> ty::Const<'tcx> {
|
||||
(self.consts)(bv, ty)
|
||||
fn replace_const(&mut self, bv: ty::BoundVar) -> ty::Const<'tcx> {
|
||||
(self.consts)(bv)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -224,7 +224,7 @@ where
|
|||
fn fold_const(&mut self, ct: ty::Const<'tcx>) -> ty::Const<'tcx> {
|
||||
match ct.kind() {
|
||||
ty::ConstKind::Bound(debruijn, bound_const) if debruijn == self.current_index => {
|
||||
let ct = self.delegate.replace_const(bound_const, ct.ty());
|
||||
let ct = self.delegate.replace_const(bound_const);
|
||||
debug_assert!(!ct.has_vars_bound_above(ty::INNERMOST));
|
||||
ty::fold::shift_vars(self.tcx, ct, self.current_index.as_u32())
|
||||
}
|
||||
|
@ -282,7 +282,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
let delegate = FnMutDelegate {
|
||||
regions: &mut replace_regions,
|
||||
types: &mut |b| bug!("unexpected bound ty in binder: {b:?}"),
|
||||
consts: &mut |b, ty| bug!("unexpected bound ct in binder: {b:?} {ty}"),
|
||||
consts: &mut |b| bug!("unexpected bound ct in binder: {b:?}"),
|
||||
};
|
||||
let mut replacer = BoundVarReplacer::new(self, delegate);
|
||||
value.fold_with(&mut replacer)
|
||||
|
@ -353,9 +353,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
ty::BoundTy { var: shift_bv(t.var), kind: t.kind },
|
||||
)
|
||||
},
|
||||
consts: &mut |c, ty: Ty<'tcx>| {
|
||||
ty::Const::new_bound(self, ty::INNERMOST, shift_bv(c), ty)
|
||||
},
|
||||
consts: &mut |c| ty::Const::new_bound(self, ty::INNERMOST, shift_bv(c)),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
@ -398,12 +396,12 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
.expect_ty();
|
||||
Ty::new_bound(self.tcx, ty::INNERMOST, BoundTy { var, kind })
|
||||
}
|
||||
fn replace_const(&mut self, bv: ty::BoundVar, ty: Ty<'tcx>) -> ty::Const<'tcx> {
|
||||
fn replace_const(&mut self, bv: ty::BoundVar) -> ty::Const<'tcx> {
|
||||
let entry = self.map.entry(bv);
|
||||
let index = entry.index();
|
||||
let var = ty::BoundVar::from_usize(index);
|
||||
let () = entry.or_insert_with(|| ty::BoundVariableKind::Const).expect_const();
|
||||
ty::Const::new_bound(self.tcx, ty::INNERMOST, var, ty)
|
||||
ty::Const::new_bound(self.tcx, ty::INNERMOST, var)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -228,7 +228,7 @@ impl<'tcx> GenericArg<'tcx> {
|
|||
ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
|
||||
))),
|
||||
CONST_TAG => GenericArgKind::Const(ty::Const(Interned::new_unchecked(
|
||||
ptr.cast::<WithCachedTypeInfo<ty::ConstData<'tcx>>>().as_ref(),
|
||||
ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
|
||||
))),
|
||||
_ => intrinsics::unreachable(),
|
||||
}
|
||||
|
@ -454,11 +454,11 @@ impl<'tcx> GenericArgs<'tcx> {
|
|||
def_id: DefId,
|
||||
original_args: &[GenericArg<'tcx>],
|
||||
) -> GenericArgsRef<'tcx> {
|
||||
ty::GenericArgs::for_item(tcx, def_id, |def, args| {
|
||||
ty::GenericArgs::for_item(tcx, def_id, |def, _| {
|
||||
if let Some(arg) = original_args.get(def.index as usize) {
|
||||
*arg
|
||||
} else {
|
||||
def.to_error(tcx, args)
|
||||
def.to_error(tcx)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -100,19 +100,11 @@ impl GenericParamDef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn to_error<'tcx>(
|
||||
&self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
preceding_args: &[ty::GenericArg<'tcx>],
|
||||
) -> ty::GenericArg<'tcx> {
|
||||
pub fn to_error<'tcx>(&self, tcx: TyCtxt<'tcx>) -> ty::GenericArg<'tcx> {
|
||||
match &self.kind {
|
||||
ty::GenericParamDefKind::Lifetime => ty::Region::new_error_misc(tcx).into(),
|
||||
ty::GenericParamDefKind::Type { .. } => Ty::new_misc_error(tcx).into(),
|
||||
ty::GenericParamDefKind::Const { .. } => ty::Const::new_misc_error(
|
||||
tcx,
|
||||
tcx.type_of(self.def_id).instantiate(tcx, preceding_args),
|
||||
)
|
||||
.into(),
|
||||
ty::GenericParamDefKind::Const { .. } => ty::Const::new_misc_error(tcx).into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -385,9 +385,7 @@ impl<'tcx> SizeSkeleton<'tcx> {
|
|||
),
|
||||
}
|
||||
}
|
||||
ty::Array(inner, len)
|
||||
if len.ty() == tcx.types.usize && tcx.features().transmute_generic_consts =>
|
||||
{
|
||||
ty::Array(inner, len) if tcx.features().transmute_generic_consts => {
|
||||
let len_eval = len.try_eval_target_usize(tcx, param_env);
|
||||
if len_eval == Some(0) {
|
||||
return Ok(SizeSkeleton::Known(Size::from_bytes(0)));
|
||||
|
|
|
@ -87,7 +87,7 @@ pub use self::closure::{
|
|||
CAPTURE_STRUCT_LOCAL,
|
||||
};
|
||||
pub use self::consts::{
|
||||
Const, ConstData, ConstInt, ConstKind, Expr, ExprKind, ScalarInt, UnevaluatedConst, ValTree,
|
||||
Const, ConstInt, ConstKind, Expr, ExprKind, ScalarInt, UnevaluatedConst, ValTree,
|
||||
};
|
||||
pub use self::context::{
|
||||
tls, CtxtInterners, CurrentGcx, DeducedParamAttrs, Feed, FreeRegionInfo, GlobalCtxt, Lift,
|
||||
|
@ -617,7 +617,7 @@ impl<'tcx> Term<'tcx> {
|
|||
ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
|
||||
))),
|
||||
CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
|
||||
ptr.cast::<WithCachedTypeInfo<ty::ConstData<'tcx>>>().as_ref(),
|
||||
ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
|
||||
))),
|
||||
_ => core::intrinsics::unreachable(),
|
||||
}
|
||||
|
|
|
@ -216,7 +216,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReverseMapper<'tcx> {
|
|||
})
|
||||
.emit_unless(self.ignore_errors);
|
||||
|
||||
ty::Const::new_error(self.tcx, guar, ct.ty())
|
||||
ty::Const::new_error(self.tcx, guar)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1467,7 +1467,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
|
|||
write!(this, "_")?;
|
||||
Ok(())
|
||||
},
|
||||
|this| this.print_type(ct.ty()),
|
||||
|this| this.print_type(todo!()),
|
||||
": ",
|
||||
)?;
|
||||
} else {
|
||||
|
@ -1512,7 +1512,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
|
|||
},
|
||||
ty::ConstKind::Param(ParamConst { name, .. }) => p!(write("{}", name)),
|
||||
ty::ConstKind::Value(value) => {
|
||||
return self.pretty_print_const_valtree(value, ct.ty(), print_ty);
|
||||
return self.pretty_print_const_valtree(value, todo!(), print_ty);
|
||||
}
|
||||
|
||||
ty::ConstKind::Bound(debruijn, bound_var) => {
|
||||
|
|
|
@ -652,18 +652,17 @@ pub fn structurally_relate_consts<'tcx, R: TypeRelation<'tcx>>(
|
|||
// and is the better alternative to waiting until `generic_const_exprs` can
|
||||
// be stabilized.
|
||||
(ty::ConstKind::Unevaluated(au), ty::ConstKind::Unevaluated(bu)) if au.def == bu.def => {
|
||||
assert_eq!(a.ty(), b.ty());
|
||||
let a_ty = tcx.type_of(au.def).instantiate(tcx, au.args);
|
||||
let b_ty = tcx.type_of(bu.def).instantiate(tcx, bu.args);
|
||||
assert_eq!(a_ty, b_ty);
|
||||
|
||||
let args = relation.relate_with_variance(
|
||||
ty::Variance::Invariant,
|
||||
ty::VarianceDiagInfo::default(),
|
||||
au.args,
|
||||
bu.args,
|
||||
)?;
|
||||
return Ok(ty::Const::new_unevaluated(
|
||||
tcx,
|
||||
ty::UnevaluatedConst { def: au.def, args },
|
||||
a.ty(),
|
||||
));
|
||||
return Ok(ty::Const::new_unevaluated(tcx, ty::UnevaluatedConst { def: au.def, args }));
|
||||
}
|
||||
(ty::ConstKind::Expr(ae), ty::ConstKind::Expr(be)) => {
|
||||
match (ae.kind, be.kind) {
|
||||
|
@ -676,7 +675,7 @@ pub fn structurally_relate_consts<'tcx, R: TypeRelation<'tcx>>(
|
|||
}
|
||||
|
||||
let args = relation.relate(ae.args(), be.args())?;
|
||||
return Ok(ty::Const::new_expr(tcx, ty::Expr::new(ae.kind, args), a.ty()));
|
||||
return Ok(ty::Const::new_expr(tcx, ty::Expr::new(ae.kind, args)));
|
||||
}
|
||||
_ => false,
|
||||
};
|
||||
|
|
|
@ -210,17 +210,14 @@ impl<'tcx> DebugWithInfcx<TyCtxt<'tcx>> for ty::Const<'tcx> {
|
|||
bug!("we checked that this is a valtree")
|
||||
};
|
||||
let mut cx = FmtPrinter::new(tcx, Namespace::ValueNS);
|
||||
cx.pretty_print_const_valtree(valtree, lifted.ty(), /*print_ty*/ true)?;
|
||||
// THISPR
|
||||
todo!();
|
||||
// cx.pretty_print_const_valtree(valtree, lifted.ty(), /*print_ty*/ true)?;
|
||||
f.write_str(&cx.into_buffer())
|
||||
});
|
||||
}
|
||||
// Fall back to something verbose.
|
||||
write!(
|
||||
f,
|
||||
"{kind:?}: {ty:?}",
|
||||
ty = &this.map(|data| data.ty()),
|
||||
kind = &this.map(|data| data.kind())
|
||||
)
|
||||
write!(f, "{kind:?}", kind = &this.map(|data| data.kind()))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -647,7 +644,6 @@ impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Const<'tcx> {
|
|||
self,
|
||||
folder: &mut F,
|
||||
) -> Result<Self, F::Error> {
|
||||
let ty = self.ty().try_fold_with(folder)?;
|
||||
let kind = match self.kind() {
|
||||
ConstKind::Param(p) => ConstKind::Param(p.try_fold_with(folder)?),
|
||||
ConstKind::Infer(i) => ConstKind::Infer(i.try_fold_with(folder)?),
|
||||
|
@ -660,17 +656,12 @@ impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Const<'tcx> {
|
|||
ConstKind::Error(e) => ConstKind::Error(e.try_fold_with(folder)?),
|
||||
ConstKind::Expr(e) => ConstKind::Expr(e.try_fold_with(folder)?),
|
||||
};
|
||||
if ty != self.ty() || kind != self.kind() {
|
||||
Ok(folder.interner().mk_ct_from_kind(kind, ty))
|
||||
} else {
|
||||
Ok(self)
|
||||
}
|
||||
if kind != self.kind() { Ok(folder.interner().mk_ct_from_kind(kind)) } else { Ok(self) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TypeSuperVisitable<TyCtxt<'tcx>> for ty::Const<'tcx> {
|
||||
fn super_visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
|
||||
try_visit!(self.ty().visit_with(visitor));
|
||||
match self.kind() {
|
||||
ConstKind::Param(p) => p.visit_with(visitor),
|
||||
ConstKind::Infer(i) => i.visit_with(visitor),
|
||||
|
|
|
@ -212,21 +212,18 @@ fn push_inner<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent: GenericArg<'tcx>)
|
|||
}
|
||||
},
|
||||
GenericArgKind::Lifetime(_) => {}
|
||||
GenericArgKind::Const(parent_ct) => {
|
||||
stack.push(parent_ct.ty().into());
|
||||
match parent_ct.kind() {
|
||||
ty::ConstKind::Infer(_)
|
||||
| ty::ConstKind::Param(_)
|
||||
| ty::ConstKind::Placeholder(_)
|
||||
| ty::ConstKind::Bound(..)
|
||||
| ty::ConstKind::Value(_)
|
||||
| ty::ConstKind::Error(_) => {}
|
||||
GenericArgKind::Const(parent_ct) => match parent_ct.kind() {
|
||||
ty::ConstKind::Infer(_)
|
||||
| ty::ConstKind::Param(_)
|
||||
| ty::ConstKind::Placeholder(_)
|
||||
| ty::ConstKind::Bound(..)
|
||||
| ty::ConstKind::Value(_)
|
||||
| ty::ConstKind::Error(_) => {}
|
||||
|
||||
ty::ConstKind::Expr(expr) => stack.extend(expr.args().iter().rev()),
|
||||
ty::ConstKind::Unevaluated(ct) => {
|
||||
stack.extend(ct.args.iter().rev());
|
||||
}
|
||||
ty::ConstKind::Expr(expr) => stack.extend(expr.args().iter().rev()),
|
||||
ty::ConstKind::Unevaluated(ct) => {
|
||||
stack.extend(ct.args.iter().rev());
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue