Make make_identity take CanonicalVarInfos

This commit is contained in:
Michael Goulet 2023-01-26 20:33:34 +00:00
parent 4ff674f942
commit 2d5591df00
2 changed files with 35 additions and 56 deletions

View File

@ -337,6 +337,39 @@ TrivialTypeTraversalAndLiftImpls! {
} }
impl<'tcx> CanonicalVarValues<'tcx> { impl<'tcx> CanonicalVarValues<'tcx> {
// Given a list of canonical variables, construct a set of values which are
// the identity response.
pub fn make_identity(
tcx: TyCtxt<'tcx>,
infos: CanonicalVarInfos<'tcx>,
) -> CanonicalVarValues<'tcx> {
CanonicalVarValues {
var_values: tcx.mk_substs(infos.iter().enumerate().map(
|(i, info)| -> ty::GenericArg<'tcx> {
match info.kind {
CanonicalVarKind::Ty(_) | CanonicalVarKind::PlaceholderTy(_) => tcx
.mk_ty(ty::Bound(ty::INNERMOST, ty::BoundVar::from_usize(i).into()))
.into(),
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => {
let br = ty::BoundRegion {
var: ty::BoundVar::from_usize(i),
kind: ty::BrAnon(i as u32, None),
};
tcx.mk_region(ty::ReLateBound(ty::INNERMOST, br)).into()
}
CanonicalVarKind::Const(_, ty)
| CanonicalVarKind::PlaceholderConst(_, ty) => tcx
.mk_const(
ty::ConstKind::Bound(ty::INNERMOST, ty::BoundVar::from_usize(i)),
ty,
)
.into(),
}
},
)),
}
}
/// Creates dummy var values which should not be used in a /// Creates dummy var values which should not be used in a
/// canonical response. /// canonical response.
pub fn dummy() -> CanonicalVarValues<'tcx> { pub fn dummy() -> CanonicalVarValues<'tcx> {
@ -347,41 +380,6 @@ impl<'tcx> CanonicalVarValues<'tcx> {
pub fn len(&self) -> usize { pub fn len(&self) -> usize {
self.var_values.len() self.var_values.len()
} }
/// Makes an identity substitution from this one: each bound var
/// is matched to the same bound var, preserving the original kinds.
/// For example, if we have:
/// `self.var_values == [Type(u32), Lifetime('a), Type(u64)]`
/// we'll return a substitution `subst` with:
/// `subst.var_values == [Type(^0), Lifetime(^1), Type(^2)]`.
pub fn make_identity(&self, tcx: TyCtxt<'tcx>) -> Self {
use crate::ty::subst::GenericArgKind;
CanonicalVarValues {
var_values: tcx.mk_substs(self.var_values.iter().enumerate().map(
|(i, kind)| -> ty::GenericArg<'tcx> {
match kind.unpack() {
GenericArgKind::Type(..) => tcx
.mk_ty(ty::Bound(ty::INNERMOST, ty::BoundVar::from_usize(i).into()))
.into(),
GenericArgKind::Lifetime(..) => {
let br = ty::BoundRegion {
var: ty::BoundVar::from_usize(i),
kind: ty::BrAnon(i as u32, None),
};
tcx.mk_region(ty::ReLateBound(ty::INNERMOST, br)).into()
}
GenericArgKind::Const(ct) => tcx
.mk_const(
ty::ConstKind::Bound(ty::INNERMOST, ty::BoundVar::from_usize(i)),
ct.ty(),
)
.into(),
}
},
)),
}
}
} }
impl<'a, 'tcx> IntoIterator for &'a CanonicalVarValues<'tcx> { impl<'a, 'tcx> IntoIterator for &'a CanonicalVarValues<'tcx> {

View File

@ -18,7 +18,7 @@
use std::mem; use std::mem;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_infer::infer::canonical::{Canonical, CanonicalVarKind, CanonicalVarValues}; use rustc_infer::infer::canonical::{Canonical, CanonicalVarValues};
use rustc_infer::infer::canonical::{OriginalQueryValues, QueryRegionConstraints, QueryResponse}; use rustc_infer::infer::canonical::{OriginalQueryValues, QueryRegionConstraints, QueryResponse};
use rustc_infer::infer::{InferCtxt, InferOk, TyCtxtInferExt}; use rustc_infer::infer::{InferCtxt, InferOk, TyCtxtInferExt};
use rustc_infer::traits::query::NoSolution; use rustc_infer::traits::query::NoSolution;
@ -481,30 +481,11 @@ pub(super) fn response_no_constraints<'tcx>(
goal: Canonical<'tcx, impl Sized>, goal: Canonical<'tcx, impl Sized>,
certainty: Certainty, certainty: Certainty,
) -> QueryResult<'tcx> { ) -> QueryResult<'tcx> {
let var_values =
tcx.mk_substs(goal.variables.iter().enumerate().map(|(i, info)| -> ty::GenericArg<'tcx> {
match info.kind {
CanonicalVarKind::Ty(_) | CanonicalVarKind::PlaceholderTy(_) => {
tcx.mk_ty(ty::Bound(ty::INNERMOST, ty::BoundVar::from_usize(i).into())).into()
}
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => {
let br = ty::BoundRegion {
var: ty::BoundVar::from_usize(i),
kind: ty::BrAnon(i as u32, None),
};
tcx.mk_region(ty::ReLateBound(ty::INNERMOST, br)).into()
}
CanonicalVarKind::Const(_, ty) | CanonicalVarKind::PlaceholderConst(_, ty) => tcx
.mk_const(ty::ConstKind::Bound(ty::INNERMOST, ty::BoundVar::from_usize(i)), ty)
.into(),
}
}));
Ok(Canonical { Ok(Canonical {
max_universe: goal.max_universe, max_universe: goal.max_universe,
variables: goal.variables, variables: goal.variables,
value: Response { value: Response {
var_values: CanonicalVarValues { var_values }, var_values: CanonicalVarValues::make_identity(tcx, goal.variables),
external_constraints: Default::default(), external_constraints: Default::default(),
certainty, certainty,
}, },