Skip to content

Commit a35cda9

Browse files
committed
uplift fold_regions to rustc_type_ir
1 parent 818add5 commit a35cda9

File tree

27 files changed

+127
-126
lines changed

27 files changed

+127
-126
lines changed

compiler/rustc_borrowck/src/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use rustc_infer::infer::{
3434
use rustc_middle::mir::tcx::PlaceTy;
3535
use rustc_middle::mir::*;
3636
use rustc_middle::query::Providers;
37+
use rustc_middle::ty::fold::fold_regions;
3738
use rustc_middle::ty::{self, ParamEnv, RegionVid, TyCtxt, TypingMode};
3839
use rustc_middle::{bug, span_bug};
3940
use rustc_mir_dataflow::impls::{
@@ -502,7 +503,7 @@ impl<'tcx> BorrowckInferCtxt<'tcx> {
502503
for data in tcx.typeck(def_id).concrete_opaque_types.iter().map(|(k, v)| (*k, *v)) {
503504
// HIR typeck did not infer the regions of the opaque, so we instantiate
504505
// them with fresh inference variables.
505-
let (key, hidden_ty) = tcx.fold_regions(data, |_, _| {
506+
let (key, hidden_ty) = fold_regions(tcx, data, |_, _| {
506507
self.next_nll_region_var_in_universe(
507508
NllRegionVariableOrigin::Existential { from_forall: false },
508509
ty::UniverseIndex::ROOT,

compiler/rustc_borrowck/src/region_infer/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use rustc_middle::mir::{
1818
TerminatorKind,
1919
};
2020
use rustc_middle::traits::{ObligationCause, ObligationCauseCode};
21+
use rustc_middle::ty::fold::fold_regions;
2122
use rustc_middle::ty::{self, RegionVid, Ty, TyCtxt, TypeFoldable, UniverseIndex};
2223
use rustc_mir_dataflow::points::DenseLocationMap;
2324
use rustc_span::Span;
@@ -1100,7 +1101,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
11001101
let ty = ty.fold_with(&mut OpaqueFolder { tcx });
11011102
let mut failed = false;
11021103

1103-
let ty = tcx.fold_regions(ty, |r, _depth| {
1104+
let ty = fold_regions(tcx, ty, |r, _depth| {
11041105
let r_vid = self.to_region_vid(r);
11051106
let r_scc = self.constraint_sccs.scc(r_vid);
11061107

@@ -1273,7 +1274,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
12731274
where
12741275
T: TypeFoldable<TyCtxt<'tcx>>,
12751276
{
1276-
tcx.fold_regions(value, |r, _db| {
1277+
fold_regions(tcx, value, |r, _db| {
12771278
let vid = self.to_region_vid(r);
12781279
let scc = self.constraint_sccs.scc(vid);
12791280
let repr = self.scc_representative(scc);

compiler/rustc_borrowck/src/region_infer/opaque_types.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use rustc_errors::ErrorGuaranteed;
33
use rustc_hir::def_id::LocalDefId;
44
use rustc_infer::infer::{InferCtxt, NllRegionVariableOrigin, TyCtxtInferExt as _};
55
use rustc_macros::extension;
6+
use rustc_middle::ty::fold::fold_regions;
67
use rustc_middle::ty::visit::TypeVisitableExt;
78
use rustc_middle::ty::{
89
self, GenericArgKind, GenericArgs, OpaqueHiddenType, OpaqueTypeKey, Ty, TyCtxt, TypeFoldable,
@@ -117,7 +118,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
117118
});
118119
debug!(?opaque_type_key, ?arg_regions);
119120

120-
let concrete_type = infcx.tcx.fold_regions(concrete_type, |region, _| {
121+
let concrete_type = fold_regions(infcx.tcx, concrete_type, |region, _| {
121122
arg_regions
122123
.iter()
123124
.find(|&&(arg_vid, _)| self.eval_equal(region.as_var(), arg_vid))
@@ -204,7 +205,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
204205
where
205206
T: TypeFoldable<TyCtxt<'tcx>>,
206207
{
207-
tcx.fold_regions(ty, |region, _| match *region {
208+
fold_regions(tcx, ty, |region, _| match *region {
208209
ty::ReVar(vid) => {
209210
let scc = self.constraint_sccs.scc(vid);
210211

@@ -442,7 +443,7 @@ impl<'tcx> LazyOpaqueTyEnv<'tcx> {
442443
let outlives_env = OutlivesEnvironment::with_bounds(param_env, implied_bounds);
443444

444445
let mut seen = vec![tcx.lifetimes.re_static];
445-
let canonical_args = tcx.fold_regions(args, |r1, _| {
446+
let canonical_args = fold_regions(tcx, args, |r1, _| {
446447
if r1.is_error() {
447448
r1
448449
} else if let Some(&r2) = seen.iter().find(|&&r2| {

compiler/rustc_borrowck/src/renumber.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use rustc_index::IndexSlice;
22
use rustc_infer::infer::NllRegionVariableOrigin;
33
use rustc_middle::mir::visit::{MutVisitor, TyContext};
44
use rustc_middle::mir::{Body, ConstOperand, Location, Promoted};
5+
use rustc_middle::ty::fold::fold_regions;
56
use rustc_middle::ty::{self, GenericArgsRef, Ty, TyCtxt, TypeFoldable};
67
use rustc_span::Symbol;
78
use tracing::{debug, instrument};
@@ -68,7 +69,7 @@ impl<'a, 'tcx> RegionRenumberer<'a, 'tcx> {
6869
F: Fn() -> RegionCtxt,
6970
{
7071
let origin = NllRegionVariableOrigin::Existential { from_forall: false };
71-
self.infcx.tcx.fold_regions(value, |_region, _depth| {
72+
fold_regions(self.infcx.tcx, value, |_region, _depth| {
7273
self.infcx.next_nll_region_var(origin, || region_ctxt_fn())
7374
})
7475
}

compiler/rustc_borrowck/src/type_check/constraint_conversion.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rustc_middle::bug;
88
use rustc_middle::mir::{ClosureOutlivesSubject, ClosureRegionRequirements, ConstraintCategory};
99
use rustc_middle::traits::ObligationCause;
1010
use rustc_middle::traits::query::NoSolution;
11+
use rustc_middle::ty::fold::fold_regions;
1112
use rustc_middle::ty::{self, GenericArgKind, Ty, TyCtxt, TypeFoldable, TypeVisitableExt};
1213
use rustc_span::Span;
1314
use rustc_trait_selection::traits::ScrubbedTraitError;
@@ -216,7 +217,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
216217
/// are dealt with during trait solving.
217218
fn replace_placeholders_with_nll<T: TypeFoldable<TyCtxt<'tcx>>>(&mut self, value: T) -> T {
218219
if value.has_placeholders() {
219-
self.tcx.fold_regions(value, |r, _| match *r {
220+
fold_regions(self.tcx, value, |r, _| match *r {
220221
ty::RePlaceholder(placeholder) => {
221222
self.constraints.placeholder_region(self.infcx, placeholder)
222223
}

compiler/rustc_borrowck/src/type_check/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use rustc_middle::mir::*;
2626
use rustc_middle::traits::query::NoSolution;
2727
use rustc_middle::ty::adjustment::PointerCoercion;
2828
use rustc_middle::ty::cast::CastTy;
29+
use rustc_middle::ty::fold::fold_regions;
2930
use rustc_middle::ty::visit::TypeVisitableExt;
3031
use rustc_middle::ty::{
3132
self, Binder, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, CoroutineArgsExt,
@@ -213,7 +214,7 @@ pub(crate) fn type_check<'a, 'tcx>(
213214

214215
// Convert all regions to nll vars.
215216
let (opaque_type_key, hidden_type) =
216-
infcx.tcx.fold_regions((opaque_type_key, hidden_type), |region, _| {
217+
fold_regions(infcx.tcx, (opaque_type_key, hidden_type), |region, _| {
217218
match region.kind() {
218219
ty::ReVar(_) => region,
219220
ty::RePlaceholder(placeholder) => {
@@ -2071,7 +2072,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
20712072
);
20722073

20732074
let is_implicit_coercion = coercion_source == CoercionSource::Implicit;
2074-
let unsize_to = tcx.fold_regions(ty, |r, _| {
2075+
let unsize_to = fold_regions(tcx, ty, |r, _| {
20752076
if let ty::ReVar(_) = r.kind() { tcx.lifetimes.re_erased } else { r }
20762077
});
20772078
self.prove_trait_ref(

compiler/rustc_borrowck/src/universal_regions.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use rustc_hir::lang_items::LangItem;
2626
use rustc_index::IndexVec;
2727
use rustc_infer::infer::NllRegionVariableOrigin;
2828
use rustc_macros::extension;
29-
use rustc_middle::ty::fold::TypeFoldable;
29+
use rustc_middle::ty::fold::{TypeFoldable, fold_regions};
3030
use rustc_middle::ty::print::with_no_trimmed_paths;
3131
use rustc_middle::ty::{
3232
self, GenericArgs, GenericArgsRef, InlineConstArgs, InlineConstArgsParts, RegionVid, Ty,
@@ -824,7 +824,7 @@ impl<'tcx> BorrowckInferCtxt<'tcx> {
824824
where
825825
T: TypeFoldable<TyCtxt<'tcx>>,
826826
{
827-
self.infcx.tcx.fold_regions(value, |region, _depth| {
827+
fold_regions(self.infcx.tcx, value, |region, _depth| {
828828
let name = region.get_name_or_anon();
829829
debug!(?region, ?name);
830830

@@ -906,7 +906,7 @@ impl<'tcx> UniversalRegionIndices<'tcx> {
906906
where
907907
T: TypeFoldable<TyCtxt<'tcx>>,
908908
{
909-
tcx.fold_regions(value, |region, _| ty::Region::new_var(tcx, self.to_region_vid(region)))
909+
fold_regions(tcx, value, |region, _| ty::Region::new_var(tcx, self.to_region_vid(region)))
910910
}
911911
}
912912

compiler/rustc_hir_analysis/src/check/check.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use rustc_middle::middle::resolve_bound_vars::ResolvedArg;
1717
use rustc_middle::middle::stability::EvalResult;
1818
use rustc_middle::span_bug;
1919
use rustc_middle::ty::error::TypeErrorToStringExt;
20-
use rustc_middle::ty::fold::BottomUpFolder;
20+
use rustc_middle::ty::fold::{BottomUpFolder, fold_regions};
2121
use rustc_middle::ty::layout::{LayoutError, MAX_SIMD_LANES};
2222
use rustc_middle::ty::util::{Discr, InspectCoroutineFields, IntTypeExt};
2323
use rustc_middle::ty::{
@@ -350,7 +350,7 @@ fn check_opaque_meets_bounds<'tcx>(
350350
// FIXME: Consider wrapping the hidden type in an existential `Binder` and instantiating it
351351
// here rather than using ReErased.
352352
let hidden_ty = tcx.type_of(def_id.to_def_id()).instantiate(tcx, args);
353-
let hidden_ty = tcx.fold_regions(hidden_ty, |re, _dbi| match re.kind() {
353+
let hidden_ty = fold_regions(tcx, hidden_ty, |re, _dbi| match re.kind() {
354354
ty::ReErased => infcx.next_region_var(RegionVariableOrigin::MiscVariable(span)),
355355
_ => re,
356356
});

compiler/rustc_hir_analysis/src/collect.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
3434
use rustc_infer::traits::ObligationCause;
3535
use rustc_middle::hir::nested_filter;
3636
use rustc_middle::query::Providers;
37+
use rustc_middle::ty::fold::fold_regions;
3738
use rustc_middle::ty::util::{Discr, IntTypeExt};
3839
use rustc_middle::ty::{self, AdtKind, Const, IsSuggestable, Ty, TyCtxt, TypingMode};
3940
use rustc_middle::{bug, span_bug};
@@ -1415,7 +1416,7 @@ fn infer_return_ty_for_fn_sig<'tcx>(
14151416
GenericParamKind::Lifetime { .. } => true,
14161417
_ => false,
14171418
});
1418-
let fn_sig = tcx.fold_regions(fn_sig, |r, _| match *r {
1419+
let fn_sig = fold_regions(tcx, fn_sig, |r, _| match *r {
14191420
ty::ReErased => {
14201421
if has_region_params {
14211422
ty::Region::new_error_with_message(

compiler/rustc_hir_analysis/src/collect/type_of.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use rustc_hir as hir;
55
use rustc_hir::HirId;
66
use rustc_hir::def_id::{DefId, LocalDefId};
77
use rustc_middle::query::plumbing::CyclePlaceholder;
8+
use rustc_middle::ty::fold::fold_regions;
89
use rustc_middle::ty::print::with_forced_trimmed_paths;
910
use rustc_middle::ty::util::IntTypeExt;
1011
use rustc_middle::ty::{self, Article, IsSuggestable, Ty, TyCtxt, TypeVisitableExt};
@@ -113,7 +114,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
113114
// so no need for ConstArg.
114115
Node::Ty(&hir::Ty { kind: TyKind::Typeof(ref e), span, .. }) if e.hir_id == hir_id => {
115116
let ty = tcx.typeck(def_id).node_type(tcx.local_def_id_to_hir_id(def_id));
116-
let ty = tcx.fold_regions(ty, |r, _| {
117+
let ty = fold_regions(tcx, ty, |r, _| {
117118
if r.is_erased() { ty::Region::new_error_misc(tcx) } else { r }
118119
});
119120
let (ty, opt_sugg) = if let Some(ty) = ty.make_suggestable(tcx, false, None) {

compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
3737
use rustc_infer::traits::ObligationCause;
3838
use rustc_middle::middle::stability::AllowUnstable;
3939
use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput};
40+
use rustc_middle::ty::fold::fold_regions;
4041
use rustc_middle::ty::print::PrintPolyTraitRefExt as _;
4142
use rustc_middle::ty::{
4243
self, Const, GenericArgKind, GenericArgsRef, GenericParamDefKind, ParamEnv, Ty, TyCtxt,
@@ -1569,7 +1570,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
15691570
infcx.fresh_args_for_item(DUMMY_SP, impl_def_id),
15701571
);
15711572

1572-
let value = tcx.fold_regions(qself_ty, |_, _| tcx.lifetimes.re_erased);
1573+
let value = fold_regions(tcx, qself_ty, |_, _| tcx.lifetimes.re_erased);
15731574
// FIXME: Don't bother dealing with non-lifetime binders here...
15741575
if value.has_escaping_bound_vars() {
15751576
return false;

compiler/rustc_hir_analysis/src/hir_wf_check.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use rustc_infer::infer::TyCtxtInferExt;
55
use rustc_infer::traits::{ObligationCause, WellFormedLoc};
66
use rustc_middle::bug;
77
use rustc_middle::query::Providers;
8+
use rustc_middle::ty::fold::fold_regions;
89
use rustc_middle::ty::{self, TyCtxt, TypingMode};
910
use rustc_span::def_id::LocalDefId;
1011
use rustc_trait_selection::traits::{self, ObligationCtxt};
@@ -75,7 +76,7 @@ fn diagnostic_hir_wf_check<'tcx>(
7576
// This visitor can walk into binders, resulting in the `tcx_ty` to
7677
// potentially reference escaping bound variables. We simply erase
7778
// those here.
78-
let tcx_ty = self.tcx.fold_regions(tcx_ty, |r, _| {
79+
let tcx_ty = fold_regions(self.tcx, tcx_ty, |r, _| {
7980
if r.is_bound() { self.tcx.lifetimes.re_erased } else { r }
8081
});
8182
let cause = traits::ObligationCause::new(

compiler/rustc_hir_typeck/src/writeback.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,7 @@ impl<'cx, 'tcx> Resolver<'cx, 'tcx> {
827827
// no reason to keep regions around. They will be repopulated during MIR
828828
// borrowck, and specifically region constraints will be populated during
829829
// MIR typeck which is run on the new body.
830-
value = tcx.fold_regions(value, |_, _| tcx.lifetimes.re_erased);
830+
value = tcx.erase_regions(value);
831831

832832
// Normalize consts in writeback, because GCE doesn't normalize eagerly.
833833
if tcx.features().generic_const_exprs() {

compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc_data_structures::graph::implementation::{
99
use rustc_data_structures::intern::Interned;
1010
use rustc_data_structures::unord::UnordSet;
1111
use rustc_index::{IndexSlice, IndexVec};
12-
use rustc_middle::ty::fold::TypeFoldable;
12+
use rustc_middle::ty::fold::{TypeFoldable, fold_regions};
1313
use rustc_middle::ty::{
1414
self, ReBound, ReEarlyParam, ReErased, ReError, ReLateParam, RePlaceholder, ReStatic, ReVar,
1515
Region, RegionVid, Ty, TyCtxt,
@@ -974,7 +974,7 @@ impl<'tcx> LexicalRegionResolutions<'tcx> {
974974
where
975975
T: TypeFoldable<TyCtxt<'tcx>>,
976976
{
977-
tcx.fold_regions(value, |r, _db| self.resolve_region(tcx, r))
977+
fold_regions(tcx, value, |r, _db| self.resolve_region(tcx, r))
978978
}
979979

980980
fn value(&self, rid: RegionVid) -> &VarValue<'tcx> {

compiler/rustc_infer/src/infer/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use rustc_middle::traits::select;
3333
pub use rustc_middle::ty::IntVarValue;
3434
use rustc_middle::ty::error::{ExpectedFound, TypeError};
3535
use rustc_middle::ty::fold::{
36-
BoundVarReplacerDelegate, TypeFoldable, TypeFolder, TypeSuperFoldable,
36+
BoundVarReplacerDelegate, TypeFoldable, TypeFolder, TypeSuperFoldable, fold_regions,
3737
};
3838
use rustc_middle::ty::visit::TypeVisitableExt;
3939
use rustc_middle::ty::{
@@ -1171,7 +1171,7 @@ impl<'tcx> InferCtxt<'tcx> {
11711171
}
11721172
if value.has_infer_regions() {
11731173
let guar = self.dcx().delayed_bug(format!("`{value:?}` is not fully resolved"));
1174-
Ok(self.tcx.fold_regions(value, |re, _| {
1174+
Ok(fold_regions(self.tcx, value, |re, _| {
11751175
if re.is_var() { ty::Region::new_error(self.tcx, guar) } else { re }
11761176
}))
11771177
} else {

compiler/rustc_middle/src/mir/query.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use smallvec::SmallVec;
1717

1818
use super::{ConstValue, SourceInfo};
1919
use crate::mir;
20+
use crate::ty::fold::fold_regions;
2021
use crate::ty::{self, CoroutineArgsExt, OpaqueHiddenType, Ty, TyCtxt};
2122

2223
rustc_index::newtype_index! {
@@ -315,7 +316,7 @@ impl<'tcx> ClosureOutlivesSubjectTy<'tcx> {
315316
/// All regions of `ty` must be of kind `ReVar` and must represent
316317
/// universal regions *external* to the closure.
317318
pub fn bind(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Self {
318-
let inner = tcx.fold_regions(ty, |r, depth| match r.kind() {
319+
let inner = fold_regions(tcx, ty, |r, depth| match r.kind() {
319320
ty::ReVar(vid) => {
320321
let br = ty::BoundRegion {
321322
var: ty::BoundVar::new(vid.index()),
@@ -334,7 +335,7 @@ impl<'tcx> ClosureOutlivesSubjectTy<'tcx> {
334335
tcx: TyCtxt<'tcx>,
335336
mut map: impl FnMut(ty::RegionVid) -> ty::Region<'tcx>,
336337
) -> Ty<'tcx> {
337-
tcx.fold_regions(self.inner, |r, depth| match r.kind() {
338+
fold_regions(tcx, self.inner, |r, depth| match r.kind() {
338339
ty::ReBound(debruijn, br) => {
339340
debug_assert_eq!(debruijn, depth);
340341
map(ty::RegionVid::new(br.var.index()))

compiler/rustc_middle/src/ty/context.rs

-8
Original file line numberDiff line numberDiff line change
@@ -632,14 +632,6 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
632632
fn opaque_types_defined_by(self, defining_anchor: LocalDefId) -> Self::DefiningOpaqueTypes {
633633
self.opaque_types_defined_by(defining_anchor)
634634
}
635-
636-
fn fold_regions<T: TypeFoldable<TyCtxt<'tcx>>>(
637-
self,
638-
value: T,
639-
f: impl FnMut(ty::Region<'tcx>, ty::DebruijnIndex) -> ty::Region<'tcx>,
640-
) -> T {
641-
self.fold_regions(value, f)
642-
}
643635
}
644636

645637
macro_rules! bidirectional_lang_item_map {

0 commit comments

Comments
 (0)