tweak ClosureOutlivesSubjectTy
This commit is contained in:
parent
10da7710cd
commit
97381d2f1e
@ -1153,7 +1153,7 @@ fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(ClosureOutlivesSubject::Ty(ClosureOutlivesSubjectTy::new(tcx, ty)))
|
Some(ClosureOutlivesSubject::Ty(ClosureOutlivesSubjectTy::bind(tcx, ty)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a universally quantified region that outlives the
|
/// Returns a universally quantified region that outlives the
|
||||||
|
@ -394,23 +394,26 @@ pub enum ClosureOutlivesSubject<'tcx> {
|
|||||||
|
|
||||||
/// Represents a `ty::Ty` for use in [`ClosureOutlivesSubject`].
|
/// Represents a `ty::Ty` for use in [`ClosureOutlivesSubject`].
|
||||||
///
|
///
|
||||||
/// This indirection is necessary because the type may include `ReVar` regions,
|
/// This abstraction is necessary because the type may include `ReVar` regions,
|
||||||
/// which is what we use internally within NLL code,
|
/// which is what we use internally within NLL code, and they can't be used in
|
||||||
/// and we can't use `ReVar`s in a query response.
|
/// a query response.
|
||||||
|
///
|
||||||
|
/// DO NOT implement `TypeVisitable` or `TypeFoldable` traits, because this
|
||||||
|
/// type is not recognized as a binder for late-bound region.
|
||||||
#[derive(Copy, Clone, Debug, TyEncodable, TyDecodable, HashStable)]
|
#[derive(Copy, Clone, Debug, TyEncodable, TyDecodable, HashStable)]
|
||||||
pub struct ClosureOutlivesSubjectTy<'tcx> {
|
pub struct ClosureOutlivesSubjectTy<'tcx> {
|
||||||
inner: Ty<'tcx>,
|
inner: Ty<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> ClosureOutlivesSubjectTy<'tcx> {
|
impl<'tcx> ClosureOutlivesSubjectTy<'tcx> {
|
||||||
// All regions of `ty` must be of kind `ReVar`
|
/// All regions of `ty` must be of kind `ReVar` and must represent
|
||||||
// and must point to an early-bound region in the closure's signature.
|
/// universal regions *external* to the closure.
|
||||||
pub fn new(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Self {
|
pub fn bind(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Self {
|
||||||
let inner = tcx.fold_regions(ty, |r, depth| match r.kind() {
|
let inner = tcx.fold_regions(ty, |r, depth| match r.kind() {
|
||||||
ty::ReVar(vid) => {
|
ty::ReVar(vid) => {
|
||||||
let br = ty::BoundRegion {
|
let br = ty::BoundRegion {
|
||||||
var: ty::BoundVar::new(vid.index()),
|
var: ty::BoundVar::new(vid.index()),
|
||||||
kind: ty::BrAnon(0u32, None),
|
kind: ty::BrAnon(vid.as_u32(), None),
|
||||||
};
|
};
|
||||||
tcx.mk_re_late_bound(depth, br)
|
tcx.mk_re_late_bound(depth, br)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user