1
Fork 0

Rollup merge of #110218 - nnethercote:rm-ToRegionVid, r=compiler-errors

Remove `ToRegionVid`

r? ```@compiler-errors```
This commit is contained in:
Matthias Krüger 2023-04-13 11:21:01 +02:00 committed by GitHub
commit 35c4ea59a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 55 additions and 241 deletions

View file

@ -1,6 +1,5 @@
#![deny(rustc::untranslatable_diagnostic)] #![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)] #![deny(rustc::diagnostic_outside_of_impl)]
use crate::nll::ToRegionVid;
use crate::path_utils::allow_two_phase_borrow; use crate::path_utils::allow_two_phase_borrow;
use crate::place_ext::PlaceExt; use crate::place_ext::PlaceExt;
use crate::BorrowIndex; use crate::BorrowIndex;
@ -204,7 +203,7 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherBorrows<'a, 'tcx> {
return; return;
} }
let region = region.to_region_vid(); let region = region.as_var();
let borrow = BorrowData { let borrow = BorrowData {
kind, kind,
@ -279,7 +278,7 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherBorrows<'a, 'tcx> {
let borrow_data = &self.location_map[&location]; let borrow_data = &self.location_map[&location];
assert_eq!(borrow_data.reserve_location, location); assert_eq!(borrow_data.reserve_location, location);
assert_eq!(borrow_data.kind, kind); assert_eq!(borrow_data.kind, kind);
assert_eq!(borrow_data.region, region.to_region_vid()); assert_eq!(borrow_data.region, region.as_var());
assert_eq!(borrow_data.borrowed_place, place); assert_eq!(borrow_data.borrowed_place, place);
} }

View file

@ -12,8 +12,8 @@ use rustc_middle::ty::visit::TypeVisitable;
use rustc_middle::ty::{self, RegionVid, Ty, TyCtxt}; use rustc_middle::ty::{self, RegionVid, Ty, TyCtxt};
use crate::{ use crate::{
borrow_set::BorrowSet, facts::AllFacts, location::LocationTable, nll::ToRegionVid, borrow_set::BorrowSet, facts::AllFacts, location::LocationTable, places_conflict,
places_conflict, region_infer::values::LivenessValues, region_infer::values::LivenessValues,
}; };
pub(super) fn generate_constraints<'tcx>( pub(super) fn generate_constraints<'tcx>(
@ -170,7 +170,7 @@ impl<'cx, 'tcx> ConstraintGeneration<'cx, 'tcx> {
debug!("add_regular_live_constraint(live_ty={:?}, location={:?})", live_ty, location); debug!("add_regular_live_constraint(live_ty={:?}, location={:?})", live_ty, location);
self.infcx.tcx.for_each_free_region(&live_ty, |live_region| { self.infcx.tcx.for_each_free_region(&live_ty, |live_region| {
let vid = live_region.to_region_vid(); let vid = live_region.as_var();
self.liveness_constraints.add_element(vid, location); self.liveness_constraints.add_element(vid, location);
}); });
} }

View file

@ -11,9 +11,7 @@ use rustc_mir_dataflow::{self, fmt::DebugWithContext, CallReturnPlaces, GenKill}
use rustc_mir_dataflow::{Analysis, Direction, Results}; use rustc_mir_dataflow::{Analysis, Direction, Results};
use std::fmt; use std::fmt;
use crate::{ use crate::{places_conflict, BorrowSet, PlaceConflictBias, PlaceExt, RegionInferenceContext};
places_conflict, BorrowSet, PlaceConflictBias, PlaceExt, RegionInferenceContext, ToRegionVid,
};
/// A tuple with named fields that can hold either the results or the transient state of the /// A tuple with named fields that can hold either the results or the transient state of the
/// dataflow analyses used by the borrow checker. /// dataflow analyses used by the borrow checker.
@ -242,7 +240,7 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> {
) -> Self { ) -> Self {
let mut prec = OutOfScopePrecomputer::new(body, nonlexical_regioncx); let mut prec = OutOfScopePrecomputer::new(body, nonlexical_regioncx);
for (borrow_index, borrow_data) in borrow_set.iter_enumerated() { for (borrow_index, borrow_data) in borrow_set.iter_enumerated() {
let borrow_region = borrow_data.region.to_region_vid(); let borrow_region = borrow_data.region;
let location = borrow_data.reserve_location; let location = borrow_data.reserve_location;
prec.precompute_borrows_out_of_scope(borrow_index, borrow_region, location); prec.precompute_borrows_out_of_scope(borrow_index, borrow_region, location);

View file

@ -6,7 +6,6 @@ use std::rc::Rc;
use crate::{ use crate::{
def_use::{self, DefUse}, def_use::{self, DefUse},
nll::ToRegionVid,
region_infer::{Cause, RegionInferenceContext}, region_infer::{Cause, RegionInferenceContext},
}; };
use rustc_data_structures::fx::FxIndexSet; use rustc_data_structures::fx::FxIndexSet;
@ -117,7 +116,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for DefUseVisitor<'cx, 'tcx> {
let mut found_it = false; let mut found_it = false;
self.tcx.for_each_free_region(&local_ty, |r| { self.tcx.for_each_free_region(&local_ty, |r| {
if r.to_region_vid() == self.region_vid { if r.as_var() == self.region_vid {
found_it = true; found_it = true;
} }
}); });

View file

@ -10,7 +10,7 @@ use rustc_middle::ty::{self, RegionVid, Ty};
use rustc_span::symbol::{kw, sym, Ident, Symbol}; use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{Span, DUMMY_SP}; use rustc_span::{Span, DUMMY_SP};
use crate::{nll::ToRegionVid, universal_regions::DefiningTy, MirBorrowckCtxt}; use crate::{universal_regions::DefiningTy, MirBorrowckCtxt};
/// A name for a particular region used in emitting diagnostics. This name could be a generated /// A name for a particular region used in emitting diagnostics. This name could be a generated
/// name like `'1`, a name used by the user like `'a`, or a name like `'static`. /// name like `'1`, a name used by the user like `'a`, or a name like `'static`.
@ -497,7 +497,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
// & // &
// - let's call the lifetime of this reference `'1` // - let's call the lifetime of this reference `'1`
(ty::Ref(region, referent_ty, _), hir::TyKind::Ref(_lifetime, referent_hir_ty)) => { (ty::Ref(region, referent_ty, _), hir::TyKind::Ref(_lifetime, referent_hir_ty)) => {
if region.to_region_vid() == needle_fr { if region.as_var() == needle_fr {
// Just grab the first character, the `&`. // Just grab the first character, the `&`.
let source_map = self.infcx.tcx.sess.source_map(); let source_map = self.infcx.tcx.sess.source_map();
let ampersand_span = source_map.start_point(hir_ty.span); let ampersand_span = source_map.start_point(hir_ty.span);
@ -598,7 +598,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
for (kind, hir_arg) in iter::zip(substs, args.args) { for (kind, hir_arg) in iter::zip(substs, args.args) {
match (kind.unpack(), hir_arg) { match (kind.unpack(), hir_arg) {
(GenericArgKind::Lifetime(r), hir::GenericArg::Lifetime(lt)) => { (GenericArgKind::Lifetime(r), hir::GenericArg::Lifetime(lt)) => {
if r.to_region_vid() == needle_fr { if r.as_var() == needle_fr {
return Some(lt); return Some(lt);
} }
} }
@ -666,7 +666,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
let return_ty = self.regioncx.universal_regions().unnormalized_output_ty; let return_ty = self.regioncx.universal_regions().unnormalized_output_ty;
debug!("give_name_if_anonymous_region_appears_in_output: return_ty = {:?}", return_ty); debug!("give_name_if_anonymous_region_appears_in_output: return_ty = {:?}", return_ty);
if !tcx.any_free_region_meets(&return_ty, |r| r.to_region_vid() == fr) { if !tcx.any_free_region_meets(&return_ty, |r| r.as_var() == fr) {
return None; return None;
} }
@ -803,7 +803,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
let tcx = self.infcx.tcx; let tcx = self.infcx.tcx;
if !tcx.any_free_region_meets(&yield_ty, |r| r.to_region_vid() == fr) { if !tcx.any_free_region_meets(&yield_ty, |r| r.as_var() == fr) {
return None; return None;
} }

View file

@ -1,8 +1,8 @@
#![deny(rustc::untranslatable_diagnostic)] #![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)] #![deny(rustc::diagnostic_outside_of_impl)]
use crate::region_infer::RegionInferenceContext;
use crate::Upvar; use crate::Upvar;
use crate::{nll::ToRegionVid, region_infer::RegionInferenceContext};
use rustc_index::vec::{Idx, IndexSlice}; use rustc_index::vec::{Idx, IndexSlice};
use rustc_middle::mir::{Body, Local}; use rustc_middle::mir::{Body, Local};
use rustc_middle::ty::{RegionVid, TyCtxt}; use rustc_middle::ty::{RegionVid, TyCtxt};
@ -46,7 +46,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
self.universal_regions().defining_ty.upvar_tys().position(|upvar_ty| { self.universal_regions().defining_ty.upvar_tys().position(|upvar_ty| {
debug!("get_upvar_index_for_region: upvar_ty={upvar_ty:?}"); debug!("get_upvar_index_for_region: upvar_ty={upvar_ty:?}");
tcx.any_free_region_meets(&upvar_ty, |r| { tcx.any_free_region_meets(&upvar_ty, |r| {
let r = r.to_region_vid(); let r = r.as_var();
debug!("get_upvar_index_for_region: r={r:?} fr={fr:?}"); debug!("get_upvar_index_for_region: r={r:?} fr={fr:?}");
r == fr r == fr
}) })
@ -96,7 +96,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
self.universal_regions().unnormalized_input_tys.iter().skip(implicit_inputs).position( self.universal_regions().unnormalized_input_tys.iter().skip(implicit_inputs).position(
|arg_ty| { |arg_ty| {
debug!("get_argument_index_for_region: arg_ty = {arg_ty:?}"); debug!("get_argument_index_for_region: arg_ty = {arg_ty:?}");
tcx.any_free_region_meets(arg_ty, |r| r.to_region_vid() == fr) tcx.any_free_region_meets(arg_ty, |r| r.as_var() == fr)
}, },
)?; )?;

View file

@ -94,7 +94,7 @@ pub mod consumers;
use borrow_set::{BorrowData, BorrowSet}; use borrow_set::{BorrowData, BorrowSet};
use dataflow::{BorrowIndex, BorrowckFlowState as Flows, BorrowckResults, Borrows}; use dataflow::{BorrowIndex, BorrowckFlowState as Flows, BorrowckResults, Borrows};
use nll::{PoloniusOutput, ToRegionVid}; use nll::PoloniusOutput;
use place_ext::PlaceExt; use place_ext::PlaceExt;
use places_conflict::{places_conflict, PlaceConflictBias}; use places_conflict::{places_conflict, PlaceConflictBias};
use region_infer::RegionInferenceContext; use region_infer::RegionInferenceContext;
@ -507,9 +507,7 @@ impl<'cx, 'tcx> BorrowckInferCtxt<'cx, 'tcx> {
F: Fn() -> RegionCtxt, F: Fn() -> RegionCtxt,
{ {
let next_region = self.infcx.next_region_var(origin); let next_region = self.infcx.next_region_var(origin);
let vid = next_region let vid = next_region.as_var();
.as_var()
.unwrap_or_else(|| bug!("expected RegionKind::RegionVar on {:?}", next_region));
if cfg!(debug_assertions) && !self.inside_canonicalization_ctxt() { if cfg!(debug_assertions) && !self.inside_canonicalization_ctxt() {
debug!("inserting vid {:?} with origin {:?} into var_to_origin", vid, origin); debug!("inserting vid {:?} with origin {:?} into var_to_origin", vid, origin);
@ -531,9 +529,7 @@ impl<'cx, 'tcx> BorrowckInferCtxt<'cx, 'tcx> {
F: Fn() -> RegionCtxt, F: Fn() -> RegionCtxt,
{ {
let next_region = self.infcx.next_nll_region_var(origin.clone()); let next_region = self.infcx.next_nll_region_var(origin.clone());
let vid = next_region let vid = next_region.as_var();
.as_var()
.unwrap_or_else(|| bug!("expected RegionKind::RegionVar on {:?}", next_region));
if cfg!(debug_assertions) && !self.inside_canonicalization_ctxt() { if cfg!(debug_assertions) && !self.inside_canonicalization_ctxt() {
debug!("inserting vid {:?} with origin {:?} into var_to_origin", vid, origin); debug!("inserting vid {:?} with origin {:?} into var_to_origin", vid, origin);

View file

@ -10,7 +10,7 @@ use rustc_middle::mir::{
BasicBlock, Body, ClosureOutlivesSubject, ClosureRegionRequirements, LocalKind, Location, BasicBlock, Body, ClosureOutlivesSubject, ClosureRegionRequirements, LocalKind, Location,
Promoted, Promoted,
}; };
use rustc_middle::ty::{self, OpaqueHiddenType, Region, RegionVid, TyCtxt}; use rustc_middle::ty::{self, OpaqueHiddenType, TyCtxt};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use std::env; use std::env;
use std::io; use std::io;
@ -444,27 +444,6 @@ fn for_each_region_constraint<'tcx>(
Ok(()) Ok(())
} }
/// Right now, we piggy back on the `ReVar` to store our NLL inference
/// regions. These are indexed with `RegionVid`. This method will
/// assert that the region is a `ReVar` and extract its internal index.
/// This is reasonable because in our MIR we replace all universal regions
/// with inference variables.
pub trait ToRegionVid {
fn to_region_vid(self) -> RegionVid;
}
impl<'tcx> ToRegionVid for Region<'tcx> {
fn to_region_vid(self) -> RegionVid {
if let ty::ReVar(vid) = *self { vid } else { bug!("region is not an ReVar: {:?}", self) }
}
}
impl ToRegionVid for RegionVid {
fn to_region_vid(self) -> RegionVid {
self
}
}
pub(crate) trait ConstraintDescription { pub(crate) trait ConstraintDescription {
fn description(&self) -> &'static str; fn description(&self) -> &'static str;
} }

View file

@ -27,7 +27,7 @@ use crate::{
}, },
diagnostics::{RegionErrorKind, RegionErrors, UniverseInfo}, diagnostics::{RegionErrorKind, RegionErrors, UniverseInfo},
member_constraints::{MemberConstraintSet, NllMemberConstraintIndex}, member_constraints::{MemberConstraintSet, NllMemberConstraintIndex},
nll::{PoloniusOutput, ToRegionVid}, nll::PoloniusOutput,
region_infer::reverse_sccs::ReverseSccGraph, region_infer::reverse_sccs::ReverseSccGraph,
region_infer::values::{ region_infer::values::{
LivenessValues, PlaceholderIndices, RegionElement, RegionValueElements, RegionValues, LivenessValues, PlaceholderIndices, RegionElement, RegionValueElements, RegionValues,
@ -593,14 +593,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
/// Returns `true` if the region `r` contains the point `p`. /// Returns `true` if the region `r` contains the point `p`.
/// ///
/// Panics if called before `solve()` executes, /// Panics if called before `solve()` executes,
pub(crate) fn region_contains(&self, r: impl ToRegionVid, p: impl ToElementIndex) -> bool { pub(crate) fn region_contains(&self, r: RegionVid, p: impl ToElementIndex) -> bool {
let scc = self.constraint_sccs.scc(r.to_region_vid()); let scc = self.constraint_sccs.scc(r);
self.scc_values.contains(scc, p) self.scc_values.contains(scc, p)
} }
/// Returns access to the value of `r` for debugging purposes. /// Returns access to the value of `r` for debugging purposes.
pub(crate) fn region_value_str(&self, r: RegionVid) -> String { pub(crate) fn region_value_str(&self, r: RegionVid) -> String {
let scc = self.constraint_sccs.scc(r.to_region_vid()); let scc = self.constraint_sccs.scc(r);
self.scc_values.region_value_str(scc) self.scc_values.region_value_str(scc)
} }
@ -608,24 +608,21 @@ impl<'tcx> RegionInferenceContext<'tcx> {
&'a self, &'a self,
r: RegionVid, r: RegionVid,
) -> impl Iterator<Item = ty::PlaceholderRegion> + 'a { ) -> impl Iterator<Item = ty::PlaceholderRegion> + 'a {
let scc = self.constraint_sccs.scc(r.to_region_vid()); let scc = self.constraint_sccs.scc(r);
self.scc_values.placeholders_contained_in(scc) self.scc_values.placeholders_contained_in(scc)
} }
/// Returns access to the value of `r` for debugging purposes. /// Returns access to the value of `r` for debugging purposes.
pub(crate) fn region_universe(&self, r: RegionVid) -> ty::UniverseIndex { pub(crate) fn region_universe(&self, r: RegionVid) -> ty::UniverseIndex {
let scc = self.constraint_sccs.scc(r.to_region_vid()); let scc = self.constraint_sccs.scc(r);
self.scc_universes[scc] self.scc_universes[scc]
} }
/// Once region solving has completed, this function will return /// Once region solving has completed, this function will return
/// the member constraints that were applied to the value of a given /// the member constraints that were applied to the value of a given
/// region `r`. See `AppliedMemberConstraint`. /// region `r`. See `AppliedMemberConstraint`.
pub(crate) fn applied_member_constraints( pub(crate) fn applied_member_constraints(&self, r: RegionVid) -> &[AppliedMemberConstraint] {
&self, let scc = self.constraint_sccs.scc(r);
r: impl ToRegionVid,
) -> &[AppliedMemberConstraint] {
let scc = self.constraint_sccs.scc(r.to_region_vid());
binary_search_util::binary_search_slice( binary_search_util::binary_search_slice(
&self.member_constraints_applied, &self.member_constraints_applied,
|applied| applied.member_region_scc, |applied| applied.member_region_scc,
@ -1133,7 +1130,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
let r_vid = self.to_region_vid(r); let r_vid = self.to_region_vid(r);
let r_scc = self.constraint_sccs.scc(r_vid); let r_scc = self.constraint_sccs.scc(r_vid);
// The challenge if this. We have some region variable `r` // The challenge is this. We have some region variable `r`
// whose value is a set of CFG points and universal // whose value is a set of CFG points and universal
// regions. We want to find if that set is *equivalent* to // regions. We want to find if that set is *equivalent* to
// any of the named regions found in the closure. // any of the named regions found in the closure.
@ -2234,7 +2231,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
r: RegionVid, r: RegionVid,
body: &Body<'_>, body: &Body<'_>,
) -> Option<Location> { ) -> Option<Location> {
let scc = self.constraint_sccs.scc(r.to_region_vid()); let scc = self.constraint_sccs.scc(r);
let locations = self.scc_values.locations_outlived_by(scc); let locations = self.scc_values.locations_outlived_by(scc);
for location in locations { for location in locations {
let bb = &body[location.block]; let bb = &body[location.block];

View file

@ -12,7 +12,6 @@ use rustc_span::{Span, DUMMY_SP};
use crate::{ use crate::{
constraints::OutlivesConstraint, constraints::OutlivesConstraint,
nll::ToRegionVid,
region_infer::TypeTest, region_infer::TypeTest,
type_check::{Locations, MirTypeckRegionConstraints}, type_check::{Locations, MirTypeckRegionConstraints},
universal_regions::UniversalRegions, universal_regions::UniversalRegions,
@ -198,7 +197,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
fn to_region_vid(&mut self, r: ty::Region<'tcx>) -> ty::RegionVid { fn to_region_vid(&mut self, r: ty::Region<'tcx>) -> ty::RegionVid {
if let ty::RePlaceholder(placeholder) = *r { if let ty::RePlaceholder(placeholder) = *r {
self.constraints.placeholder_region(self.infcx, placeholder).to_region_vid() self.constraints.placeholder_region(self.infcx, placeholder).as_var()
} else { } else {
self.universal_regions.to_region_vid(r) self.universal_regions.to_region_vid(r)
} }

View file

@ -11,7 +11,6 @@ use crate::{
constraints::OutlivesConstraintSet, constraints::OutlivesConstraintSet,
facts::{AllFacts, AllFactsExt}, facts::{AllFacts, AllFactsExt},
location::LocationTable, location::LocationTable,
nll::ToRegionVid,
region_infer::values::RegionValueElements, region_infer::values::RegionValueElements,
universal_regions::UniversalRegions, universal_regions::UniversalRegions,
}; };
@ -80,9 +79,7 @@ fn compute_relevant_live_locals<'tcx>(
) -> (Vec<Local>, Vec<Local>) { ) -> (Vec<Local>, Vec<Local>) {
let (boring_locals, relevant_live_locals): (Vec<_>, Vec<_>) = let (boring_locals, relevant_live_locals): (Vec<_>, Vec<_>) =
body.local_decls.iter_enumerated().partition_map(|(local, local_decl)| { body.local_decls.iter_enumerated().partition_map(|(local, local_decl)| {
if tcx.all_free_regions_meet(&local_decl.ty, |r| { if tcx.all_free_regions_meet(&local_decl.ty, |r| free_regions.contains(&r.as_var())) {
free_regions.contains(&r.to_region_vid())
}) {
Either::Left(local) Either::Left(local)
} else { } else {
Either::Right(local) Either::Right(local)

View file

@ -56,7 +56,6 @@ use crate::{
facts::AllFacts, facts::AllFacts,
location::LocationTable, location::LocationTable,
member_constraints::MemberConstraintSet, member_constraints::MemberConstraintSet,
nll::ToRegionVid,
path_utils, path_utils,
region_infer::values::{ region_infer::values::{
LivenessValues, PlaceholderIndex, PlaceholderIndices, RegionValueElements, LivenessValues, PlaceholderIndex, PlaceholderIndices, RegionValueElements,
@ -2419,7 +2418,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
if let Some(all_facts) = all_facts { if let Some(all_facts) = all_facts {
let _prof_timer = self.infcx.tcx.prof.generic_activity("polonius_fact_generation"); let _prof_timer = self.infcx.tcx.prof.generic_activity("polonius_fact_generation");
if let Some(borrow_index) = borrow_set.get_index_of(&location) { if let Some(borrow_index) = borrow_set.get_index_of(&location) {
let region_vid = borrow_region.to_region_vid(); let region_vid = borrow_region.as_var();
all_facts.loan_issued_at.push(( all_facts.loan_issued_at.push((
region_vid, region_vid,
borrow_index, borrow_index,
@ -2465,8 +2464,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
match base_ty.kind() { match base_ty.kind() {
ty::Ref(ref_region, _, mutbl) => { ty::Ref(ref_region, _, mutbl) => {
constraints.outlives_constraints.push(OutlivesConstraint { constraints.outlives_constraints.push(OutlivesConstraint {
sup: ref_region.to_region_vid(), sup: ref_region.as_var(),
sub: borrow_region.to_region_vid(), sub: borrow_region.as_var(),
locations: location.to_locations(), locations: location.to_locations(),
span: location.to_locations().span(body), span: location.to_locations().span(body),
category, category,

View file

@ -131,13 +131,9 @@ impl<'tcx> TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx>
ty::BoundRegionKind::BrEnv => BoundRegionInfo::Name(sym::env), ty::BoundRegionKind::BrEnv => BoundRegionInfo::Name(sym::env),
}; };
let reg_var =
reg.as_var().unwrap_or_else(|| bug!("expected region {:?} to be of kind ReVar", reg));
if cfg!(debug_assertions) && !self.type_checker.infcx.inside_canonicalization_ctxt() { if cfg!(debug_assertions) && !self.type_checker.infcx.inside_canonicalization_ctxt() {
let mut var_to_origin = self.type_checker.infcx.reg_var_to_origin.borrow_mut(); let mut var_to_origin = self.type_checker.infcx.reg_var_to_origin.borrow_mut();
debug!(?reg_var); var_to_origin.insert(reg.as_var(), RegionCtxt::Placeholder(reg_info));
var_to_origin.insert(reg_var, RegionCtxt::Placeholder(reg_info));
} }
reg reg
@ -150,12 +146,9 @@ impl<'tcx> TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx>
universe, universe,
); );
let reg_var =
reg.as_var().unwrap_or_else(|| bug!("expected region {:?} to be of kind ReVar", reg));
if cfg!(debug_assertions) && !self.type_checker.infcx.inside_canonicalization_ctxt() { if cfg!(debug_assertions) && !self.type_checker.infcx.inside_canonicalization_ctxt() {
let mut var_to_origin = self.type_checker.infcx.reg_var_to_origin.borrow_mut(); let mut var_to_origin = self.type_checker.infcx.reg_var_to_origin.borrow_mut();
var_to_origin.insert(reg_var, RegionCtxt::Existential(None)); var_to_origin.insert(reg.as_var(), RegionCtxt::Existential(None));
} }
reg reg

View file

@ -28,7 +28,6 @@ use rustc_span::symbol::{kw, sym};
use rustc_span::Symbol; use rustc_span::Symbol;
use std::iter; use std::iter;
use crate::nll::ToRegionVid;
use crate::renumber::{BoundRegionInfo, RegionCtxt}; use crate::renumber::{BoundRegionInfo, RegionCtxt};
use crate::BorrowckInferCtxt; use crate::BorrowckInferCtxt;
@ -406,7 +405,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
// Create the "global" region that is always free in all contexts: 'static. // Create the "global" region that is always free in all contexts: 'static.
let fr_static = let fr_static =
self.infcx.next_nll_region_var(FR, || RegionCtxt::Free(kw::Static)).to_region_vid(); self.infcx.next_nll_region_var(FR, || RegionCtxt::Free(kw::Static)).as_var();
// We've now added all the global regions. The next ones we // We've now added all the global regions. The next ones we
// add will be external. // add will be external.
@ -446,7 +445,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
}; };
debug!(?region_vid); debug!(?region_vid);
indices.insert_late_bound_region(r, region_vid.to_region_vid()); indices.insert_late_bound_region(r, region_vid.as_var());
} }
}, },
); );
@ -480,7 +479,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
}; };
debug!(?region_vid); debug!(?region_vid);
indices.insert_late_bound_region(r, region_vid.to_region_vid()); indices.insert_late_bound_region(r, region_vid.as_var());
} }
}); });
@ -499,7 +498,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
let reg_vid = self let reg_vid = self
.infcx .infcx
.next_nll_region_var(FR, || RegionCtxt::Free(Symbol::intern("c-variadic"))) .next_nll_region_var(FR, || RegionCtxt::Free(Symbol::intern("c-variadic")))
.to_region_vid(); .as_var();
let region = self.infcx.tcx.mk_re_var(reg_vid); let region = self.infcx.tcx.mk_re_var(reg_vid);
let va_list_ty = let va_list_ty =
@ -514,7 +513,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
let fr_fn_body = self let fr_fn_body = self
.infcx .infcx
.next_nll_region_var(FR, || RegionCtxt::Free(Symbol::intern("fn_body"))) .next_nll_region_var(FR, || RegionCtxt::Free(Symbol::intern("fn_body")))
.to_region_vid(); .as_var();
let num_universals = self.infcx.num_region_vars(); let num_universals = self.infcx.num_region_vars();
@ -635,7 +634,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
let global_mapping = iter::once((tcx.lifetimes.re_static, fr_static)); let global_mapping = iter::once((tcx.lifetimes.re_static, fr_static));
let subst_mapping = let subst_mapping =
iter::zip(identity_substs.regions(), fr_substs.regions().map(|r| r.to_region_vid())); iter::zip(identity_substs.regions(), fr_substs.regions().map(|r| r.as_var()));
UniversalRegionIndices { indices: global_mapping.chain(subst_mapping).collect(), fr_static } UniversalRegionIndices { indices: global_mapping.chain(subst_mapping).collect(), fr_static }
} }
@ -789,7 +788,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
self.next_nll_region_var(origin, || RegionCtxt::Bound(BoundRegionInfo::Name(name))) self.next_nll_region_var(origin, || RegionCtxt::Bound(BoundRegionInfo::Name(name)))
}; };
indices.insert_late_bound_region(liberated_region, region_vid.to_region_vid()); indices.insert_late_bound_region(liberated_region, region_vid.as_var());
debug!(?liberated_region, ?region_vid); debug!(?liberated_region, ?region_vid);
region_vid region_vid
}); });
@ -822,7 +821,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
}; };
debug!(?region_vid); debug!(?region_vid);
indices.insert_late_bound_region(r, region_vid.to_region_vid()); indices.insert_late_bound_region(r, region_vid.as_var());
} }
}); });
} }
@ -843,7 +842,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
}) })
}; };
indices.insert_late_bound_region(r, region_vid.to_region_vid()); indices.insert_late_bound_region(r, region_vid.as_var());
} }
}); });
} }
@ -861,7 +860,7 @@ impl<'tcx> UniversalRegionIndices<'tcx> {
} }
/// Converts `r` into a local inference variable: `r` can either /// Converts `r` into a local inference variable: `r` can either
/// by a `ReVar` (i.e., already a reference to an inference /// be a `ReVar` (i.e., already a reference to an inference
/// variable) or it can be `'static` or some early-bound /// variable) or it can be `'static` or some early-bound
/// region. This is useful when taking the results from /// region. This is useful when taking the results from
/// type-checking and trait-matching, which may sometimes /// type-checking and trait-matching, which may sometimes
@ -870,7 +869,7 @@ impl<'tcx> UniversalRegionIndices<'tcx> {
/// fully initialized. /// fully initialized.
pub fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid { pub fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid {
if let ty::ReVar(..) = *r { if let ty::ReVar(..) = *r {
r.to_region_vid() r.as_var()
} else if r.is_error() { } else if r.is_error() {
// We use the `'static` `RegionVid` because `ReError` doesn't actually exist in the // We use the `'static` `RegionVid` because `ReError` doesn't actually exist in the
// `UniversalRegionIndices`. This is fine because 1) it is a fallback only used if // `UniversalRegionIndices`. This is fine because 1) it is a fallback only used if

View file

@ -8,10 +8,7 @@ use rustc_middle::hir::nested_filter;
use rustc_middle::ty::print::with_forced_trimmed_paths; use rustc_middle::ty::print::with_forced_trimmed_paths;
use rustc_middle::ty::subst::InternalSubsts; use rustc_middle::ty::subst::InternalSubsts;
use rustc_middle::ty::util::IntTypeExt; use rustc_middle::ty::util::IntTypeExt;
use rustc_middle::ty::{ use rustc_middle::ty::{self, ImplTraitInTraitData, IsSuggestable, Ty, TyCtxt, TypeVisitableExt};
self, ImplTraitInTraitData, IsSuggestable, Ty, TyCtxt, TypeFolder, TypeSuperFoldable,
TypeVisitableExt,
};
use rustc_span::symbol::Ident; use rustc_span::symbol::Ident;
use rustc_span::{Span, DUMMY_SP}; use rustc_span::{Span, DUMMY_SP};
@ -874,28 +871,6 @@ fn infer_placeholder_type<'a>(
item_ident: Ident, item_ident: Ident,
kind: &'static str, kind: &'static str,
) -> Ty<'a> { ) -> Ty<'a> {
// Attempts to make the type nameable by turning FnDefs into FnPtrs.
struct MakeNameable<'tcx> {
tcx: TyCtxt<'tcx>,
}
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for MakeNameable<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> {
self.tcx
}
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
let ty = match *ty.kind() {
ty::FnDef(def_id, substs) => {
self.tcx.mk_fn_ptr(self.tcx.fn_sig(def_id).subst(self.tcx, substs))
}
_ => ty,
};
ty.super_fold_with(self)
}
}
let ty = tcx.diagnostic_only_typeck(def_id).node_type(body_id.hir_id); let ty = tcx.diagnostic_only_typeck(def_id).node_type(body_id.hir_id);
// If this came from a free `const` or `static mut?` item, // If this came from a free `const` or `static mut?` item,

View file

@ -12,9 +12,7 @@ use rustc_middle::ty::adjustment::{
Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability,
}; };
use rustc_middle::ty::print::with_no_trimmed_paths; use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_middle::ty::{ use rustc_middle::ty::{self, IsSuggestable, Ty, TyCtxt, TypeVisitableExt};
self, IsSuggestable, Ty, TyCtxt, TypeFolder, TypeSuperFoldable, TypeVisitableExt,
};
use rustc_session::errors::ExprParenthesesNeeded; use rustc_session::errors::ExprParenthesesNeeded;
use rustc_span::source_map::Spanned; use rustc_span::source_map::Spanned;
use rustc_span::symbol::{sym, Ident}; use rustc_span::symbol::{sym, Ident};
@ -965,21 +963,3 @@ fn is_builtin_binop<'tcx>(lhs: Ty<'tcx>, rhs: Ty<'tcx>, op: hir::BinOp) -> bool
} }
} }
} }
struct TypeParamEraser<'a, 'tcx>(&'a FnCtxt<'a, 'tcx>, Span);
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for TypeParamEraser<'_, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> {
self.0.tcx
}
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
match ty.kind() {
ty::Param(_) => self.0.next_ty_var(TypeVariableOrigin {
kind: TypeVariableOriginKind::MiscVariable,
span: self.1,
}),
_ => ty.super_fold_with(self),
}
}
}

View file

@ -7,8 +7,8 @@ use crate::ty::subst::{GenericArg, InternalSubsts, SubstsRef};
use crate::ty::visit::ValidateBoundVars; use crate::ty::visit::ValidateBoundVars;
use crate::ty::InferTy::*; use crate::ty::InferTy::*;
use crate::ty::{ use crate::ty::{
self, AdtDef, Discr, FallibleTypeFolder, Term, Ty, TyCtxt, TypeFlags, TypeFoldable, self, AdtDef, Discr, Term, Ty, TyCtxt, TypeFlags, TypeSuperVisitable, TypeVisitable,
TypeSuperFoldable, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, TypeVisitableExt, TypeVisitor,
}; };
use crate::ty::{List, ParamEnv}; use crate::ty::{List, ParamEnv};
use hir::def::DefKind; use hir::def::DefKind;
@ -1156,81 +1156,6 @@ where
} }
} }
struct SkipBindersAt<'tcx> {
tcx: TyCtxt<'tcx>,
index: ty::DebruijnIndex,
}
impl<'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for SkipBindersAt<'tcx> {
type Error = ();
fn interner(&self) -> TyCtxt<'tcx> {
self.tcx
}
fn try_fold_binder<T>(&mut self, t: Binder<'tcx, T>) -> Result<Binder<'tcx, T>, Self::Error>
where
T: ty::TypeFoldable<TyCtxt<'tcx>>,
{
self.index.shift_in(1);
let value = t.try_map_bound(|t| t.try_fold_with(self));
self.index.shift_out(1);
value
}
fn try_fold_ty(&mut self, ty: Ty<'tcx>) -> Result<Ty<'tcx>, Self::Error> {
if !ty.has_escaping_bound_vars() {
Ok(ty)
} else if let ty::Bound(index, bv) = *ty.kind() {
if index == self.index {
Err(())
} else {
Ok(self.interner().mk_bound(index.shifted_out(1), bv))
}
} else {
ty.try_super_fold_with(self)
}
}
fn try_fold_region(&mut self, r: ty::Region<'tcx>) -> Result<ty::Region<'tcx>, Self::Error> {
if !r.has_escaping_bound_vars() {
Ok(r)
} else if let ty::ReLateBound(index, bv) = r.kind() {
if index == self.index {
Err(())
} else {
Ok(self.interner().mk_re_late_bound(index.shifted_out(1), bv))
}
} else {
r.try_super_fold_with(self)
}
}
fn try_fold_const(&mut self, ct: ty::Const<'tcx>) -> Result<ty::Const<'tcx>, Self::Error> {
if !ct.has_escaping_bound_vars() {
Ok(ct)
} else if let ty::ConstKind::Bound(index, bv) = ct.kind() {
if index == self.index {
Err(())
} else {
Ok(self.interner().mk_const(
ty::ConstKind::Bound(index.shifted_out(1), bv),
ct.ty().try_fold_with(self)?,
))
}
} else {
ct.try_super_fold_with(self)
}
}
fn try_fold_predicate(
&mut self,
p: ty::Predicate<'tcx>,
) -> Result<ty::Predicate<'tcx>, Self::Error> {
if !p.has_escaping_bound_vars() { Ok(p) } else { p.try_super_fold_with(self) }
}
}
/// Represents the projection of an associated type. /// Represents the projection of an associated type.
/// ///
/// For a projection, this would be `<Ty as Trait<...>>::N`. /// For a projection, this would be `<Ty as Trait<...>>::N`.
@ -1772,10 +1697,10 @@ impl<'tcx> Region<'tcx> {
matches!(self.kind(), ty::ReVar(_)) matches!(self.kind(), ty::ReVar(_))
} }
pub fn as_var(self) -> Option<RegionVid> { pub fn as_var(self) -> RegionVid {
match self.kind() { match self.kind() {
ty::ReVar(vid) => Some(vid), ty::ReVar(vid) => vid,
_ => None, _ => bug!("expected region {:?} to be of kind ReVar", self),
} }
} }
} }

View file

@ -9,7 +9,6 @@ use crate::infer::InferCtxt;
use crate::traits::project::ProjectAndUnifyResult; use crate::traits::project::ProjectAndUnifyResult;
use rustc_infer::infer::DefineOpaqueTypes; use rustc_infer::infer::DefineOpaqueTypes;
use rustc_middle::mir::interpret::ErrorHandled; use rustc_middle::mir::interpret::ErrorHandled;
use rustc_middle::ty::fold::{TypeFolder, TypeSuperFoldable};
use rustc_middle::ty::visit::TypeVisitableExt; use rustc_middle::ty::visit::TypeVisitableExt;
use rustc_middle::ty::{ImplPolarity, Region, RegionVid}; use rustc_middle::ty::{ImplPolarity, Region, RegionVid};
@ -851,23 +850,3 @@ impl<'tcx> AutoTraitFinder<'tcx> {
infcx.freshen(p) infcx.freshen(p)
} }
} }
/// Replaces all ReVars in a type with ty::Region's, using the provided map
pub struct RegionReplacer<'a, 'tcx> {
vid_to_region: &'a FxHashMap<ty::RegionVid, ty::Region<'tcx>>,
tcx: TyCtxt<'tcx>,
}
impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for RegionReplacer<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> {
self.tcx
}
fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
(match *r {
ty::ReVar(vid) => self.vid_to_region.get(&vid).cloned(),
_ => None,
})
.unwrap_or_else(|| r.super_fold_with(self))
}
}