mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
Make make_identity take CanonicalVarInfos
This commit is contained in:
parent
4ff674f942
commit
2d5591df00
@ -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> {
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user