rename bound region instantiation
- `erase_late_bound_regions` -> `instantiate_bound_regions_with_erased` - `replace_late_bound_regions_X` -> `instantiate_bound_regions_X`
This commit is contained in:
parent
41cfb20abb
commit
40b154e53c
35 changed files with 78 additions and 69 deletions
|
@ -1578,8 +1578,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let sig = args.as_closure().sig();
|
let sig = args.as_closure().sig();
|
||||||
let tupled_params =
|
let tupled_params = tcx.instantiate_bound_regions_with_erased(
|
||||||
tcx.erase_late_bound_regions(sig.inputs().iter().next().unwrap().map_bound(|&b| b));
|
sig.inputs().iter().next().unwrap().map_bound(|&b| b),
|
||||||
|
);
|
||||||
let ty::Tuple(params) = tupled_params.kind() else { return };
|
let ty::Tuple(params) = tupled_params.kind() else { return };
|
||||||
|
|
||||||
// Find the first argument with a matching type, get its name
|
// Find the first argument with a matching type, get its name
|
||||||
|
|
|
@ -1387,7 +1387,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let (sig, map) = tcx.replace_late_bound_regions(sig, |br| {
|
let (sig, map) = tcx.instantiate_bound_regions(sig, |br| {
|
||||||
use crate::renumber::RegionCtxt;
|
use crate::renumber::RegionCtxt;
|
||||||
|
|
||||||
let region_ctxt_fn = || {
|
let region_ctxt_fn = || {
|
||||||
|
|
|
@ -738,13 +738,13 @@ trait InferCtxtExt<'tcx> {
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>;
|
T: TypeFoldable<TyCtxt<'tcx>>;
|
||||||
|
|
||||||
fn replace_late_bound_regions_with_nll_infer_vars_in_recursive_scope(
|
fn instantiate_bound_regions_with_nll_infer_vars_in_recursive_scope(
|
||||||
&self,
|
&self,
|
||||||
mir_def_id: LocalDefId,
|
mir_def_id: LocalDefId,
|
||||||
indices: &mut UniversalRegionIndices<'tcx>,
|
indices: &mut UniversalRegionIndices<'tcx>,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn replace_late_bound_regions_with_nll_infer_vars_in_item(
|
fn instantiate_bound_regions_with_nll_infer_vars_in_item(
|
||||||
&self,
|
&self,
|
||||||
mir_def_id: LocalDefId,
|
mir_def_id: LocalDefId,
|
||||||
indices: &mut UniversalRegionIndices<'tcx>,
|
indices: &mut UniversalRegionIndices<'tcx>,
|
||||||
|
@ -780,7 +780,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
let (value, _map) = self.tcx.replace_late_bound_regions(value, |br| {
|
let (value, _map) = self.tcx.instantiate_bound_regions(value, |br| {
|
||||||
debug!(?br);
|
debug!(?br);
|
||||||
let liberated_region =
|
let liberated_region =
|
||||||
ty::Region::new_late_param(self.tcx, all_outlive_scope.to_def_id(), br.kind);
|
ty::Region::new_late_param(self.tcx, all_outlive_scope.to_def_id(), br.kind);
|
||||||
|
@ -810,7 +810,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
|
||||||
/// set of late-bound regions and checks for any that we have not yet seen, adding them to the
|
/// set of late-bound regions and checks for any that we have not yet seen, adding them to the
|
||||||
/// inputs vector.
|
/// inputs vector.
|
||||||
#[instrument(skip(self, indices))]
|
#[instrument(skip(self, indices))]
|
||||||
fn replace_late_bound_regions_with_nll_infer_vars_in_recursive_scope(
|
fn instantiate_bound_regions_with_nll_infer_vars_in_recursive_scope(
|
||||||
&self,
|
&self,
|
||||||
mir_def_id: LocalDefId,
|
mir_def_id: LocalDefId,
|
||||||
indices: &mut UniversalRegionIndices<'tcx>,
|
indices: &mut UniversalRegionIndices<'tcx>,
|
||||||
|
@ -830,7 +830,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(skip(self, indices))]
|
#[instrument(skip(self, indices))]
|
||||||
fn replace_late_bound_regions_with_nll_infer_vars_in_item(
|
fn instantiate_bound_regions_with_nll_infer_vars_in_item(
|
||||||
&self,
|
&self,
|
||||||
mir_def_id: LocalDefId,
|
mir_def_id: LocalDefId,
|
||||||
indices: &mut UniversalRegionIndices<'tcx>,
|
indices: &mut UniversalRegionIndices<'tcx>,
|
||||||
|
|
|
@ -249,7 +249,7 @@ fn push_debuginfo_type_name<'tcx>(
|
||||||
.projection_bounds()
|
.projection_bounds()
|
||||||
.map(|bound| {
|
.map(|bound| {
|
||||||
let ExistentialProjection { def_id: item_def_id, term, .. } =
|
let ExistentialProjection { def_id: item_def_id, term, .. } =
|
||||||
tcx.erase_late_bound_regions(bound);
|
tcx.instantiate_bound_regions_with_erased(bound);
|
||||||
// FIXME(associated_const_equality): allow for consts here
|
// FIXME(associated_const_equality): allow for consts here
|
||||||
(item_def_id, term.ty().unwrap())
|
(item_def_id, term.ty().unwrap())
|
||||||
})
|
})
|
||||||
|
|
|
@ -440,7 +440,7 @@ impl<'tcx> AstConv<'tcx> for ItemCtxt<'tcx> {
|
||||||
second: format!(
|
second: format!(
|
||||||
"{}::",
|
"{}::",
|
||||||
// Replace the existing lifetimes with a new named lifetime.
|
// Replace the existing lifetimes with a new named lifetime.
|
||||||
self.tcx.replace_late_bound_regions_uncached(
|
self.tcx.instantiate_bound_regions_uncached(
|
||||||
poly_trait_ref,
|
poly_trait_ref,
|
||||||
|_| {
|
|_| {
|
||||||
ty::Region::new_early_param(self.tcx, ty::EarlyParamRegion {
|
ty::Region::new_early_param(self.tcx, ty::EarlyParamRegion {
|
||||||
|
|
|
@ -846,7 +846,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let bound_vars = self.tcx.late_bound_vars(hir_ty.hir_id.owner.into());
|
let bound_vars = self.tcx.late_bound_vars(hir_ty.hir_id.owner.into());
|
||||||
let ty = Binder::bind_with_vars(ty, bound_vars);
|
let ty = Binder::bind_with_vars(ty, bound_vars);
|
||||||
let ty = self.normalize(hir_ty.span, ty);
|
let ty = self.normalize(hir_ty.span, ty);
|
||||||
let ty = self.tcx.erase_late_bound_regions(ty);
|
let ty = self.tcx.instantiate_bound_regions_with_erased(ty);
|
||||||
if self.can_coerce(expected, ty) {
|
if self.can_coerce(expected, ty) {
|
||||||
err.subdiagnostic(errors::ExpectedReturnTypeLabel::Other {
|
err.subdiagnostic(errors::ExpectedReturnTypeLabel::Other {
|
||||||
span: hir_ty.span,
|
span: hir_ty.span,
|
||||||
|
@ -1023,7 +1023,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
if let hir::FnRetTy::Return(ty) = fn_decl.output {
|
if let hir::FnRetTy::Return(ty) = fn_decl.output {
|
||||||
let ty = self.astconv().ast_ty_to_ty(ty);
|
let ty = self.astconv().ast_ty_to_ty(ty);
|
||||||
let bound_vars = self.tcx.late_bound_vars(fn_id);
|
let bound_vars = self.tcx.late_bound_vars(fn_id);
|
||||||
let ty = self.tcx.erase_late_bound_regions(Binder::bind_with_vars(ty, bound_vars));
|
let ty = self
|
||||||
|
.tcx
|
||||||
|
.instantiate_bound_regions_with_erased(Binder::bind_with_vars(ty, bound_vars));
|
||||||
let ty = match self.tcx.asyncness(fn_id.owner) {
|
let ty = match self.tcx.asyncness(fn_id.owner) {
|
||||||
ty::Asyncness::Yes => self.get_impl_future_output_ty(ty).unwrap_or_else(|| {
|
ty::Asyncness::Yes => self.get_impl_future_output_ty(ty).unwrap_or_else(|| {
|
||||||
span_bug!(fn_decl.output.span(), "failed to get output type of async function")
|
span_bug!(fn_decl.output.span(), "failed to get output type of async function")
|
||||||
|
|
|
@ -809,7 +809,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let new_trait_ref = this.erase_late_bound_regions(new_trait_ref);
|
let new_trait_ref = this.instantiate_bound_regions_with_erased(new_trait_ref);
|
||||||
|
|
||||||
let (xform_self_ty, xform_ret_ty) =
|
let (xform_self_ty, xform_ret_ty) =
|
||||||
this.xform_self_ty(item, new_trait_ref.self_ty(), new_trait_ref.args);
|
this.xform_self_ty(item, new_trait_ref.self_ty(), new_trait_ref.args);
|
||||||
|
@ -1885,7 +1885,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
fn_sig.instantiate(self.tcx, args)
|
fn_sig.instantiate(self.tcx, args)
|
||||||
};
|
};
|
||||||
|
|
||||||
self.erase_late_bound_regions(xform_fn_sig)
|
self.instantiate_bound_regions_with_erased(xform_fn_sig)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the type of an impl and generate substitutions with inference vars.
|
/// Gets the type of an impl and generate substitutions with inference vars.
|
||||||
|
@ -1897,7 +1897,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Replaces late-bound-regions bound by `value` with `'static` using
|
/// Replaces late-bound-regions bound by `value` with `'static` using
|
||||||
/// `ty::erase_late_bound_regions`.
|
/// `ty::instantiate_bound_regions_with_erased`.
|
||||||
///
|
///
|
||||||
/// This is only a reasonable thing to do during the *probe* phase, not the *confirm* phase, of
|
/// This is only a reasonable thing to do during the *probe* phase, not the *confirm* phase, of
|
||||||
/// method matching. It is reasonable during the probe phase because we don't consider region
|
/// method matching. It is reasonable during the probe phase because we don't consider region
|
||||||
|
@ -1914,11 +1914,11 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
/// region got replaced with the same variable, which requires a bit more coordination
|
/// region got replaced with the same variable, which requires a bit more coordination
|
||||||
/// and/or tracking the substitution and
|
/// and/or tracking the substitution and
|
||||||
/// so forth.
|
/// so forth.
|
||||||
fn erase_late_bound_regions<T>(&self, value: ty::Binder<'tcx, T>) -> T
|
fn instantiate_bound_regions_with_erased<T>(&self, value: ty::Binder<'tcx, T>) -> T
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
self.tcx.erase_late_bound_regions(value)
|
self.tcx.instantiate_bound_regions_with_erased(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Determine if the given associated item type is relevant in the current context.
|
/// Determine if the given associated item type is relevant in the current context.
|
||||||
|
|
|
@ -1454,7 +1454,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
.filter_map(|item| {
|
.filter_map(|item| {
|
||||||
// Only assoc fns that return `Self`, `Option<Self>` or `Result<Self, _>`.
|
// Only assoc fns that return `Self`, `Option<Self>` or `Result<Self, _>`.
|
||||||
let ret_ty = self.tcx.fn_sig(item.def_id).skip_binder().output();
|
let ret_ty = self.tcx.fn_sig(item.def_id).skip_binder().output();
|
||||||
let ret_ty = self.tcx.erase_late_bound_regions(ret_ty);
|
let ret_ty = self.tcx.instantiate_bound_regions_with_erased(ret_ty);
|
||||||
let ty::Adt(def, args) = ret_ty.kind() else {
|
let ty::Adt(def, args) = ret_ty.kind() else {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
|
@ -341,8 +341,8 @@ fn structurally_same_type_impl<'tcx>(
|
||||||
|
|
||||||
// We don't compare regions, but leaving bound regions around ICEs, so
|
// We don't compare regions, but leaving bound regions around ICEs, so
|
||||||
// we erase them.
|
// we erase them.
|
||||||
let a_sig = tcx.erase_late_bound_regions(a_poly_sig);
|
let a_sig = tcx.instantiate_bound_regions_with_erased(a_poly_sig);
|
||||||
let b_sig = tcx.erase_late_bound_regions(b_poly_sig);
|
let b_sig = tcx.instantiate_bound_regions_with_erased(b_poly_sig);
|
||||||
|
|
||||||
(a_sig.abi, a_sig.unsafety, a_sig.c_variadic)
|
(a_sig.abi, a_sig.unsafety, a_sig.c_variadic)
|
||||||
== (b_sig.abi, b_sig.unsafety, b_sig.c_variadic)
|
== (b_sig.abi, b_sig.unsafety, b_sig.c_variadic)
|
||||||
|
|
|
@ -1234,7 +1234,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let sig = tcx.erase_late_bound_regions(sig);
|
let sig = tcx.instantiate_bound_regions_with_erased(sig);
|
||||||
for arg in sig.inputs() {
|
for arg in sig.inputs() {
|
||||||
match self.check_type_for_ffi(cache, *arg) {
|
match self.check_type_for_ffi(cache, *arg) {
|
||||||
FfiSafe => {}
|
FfiSafe => {}
|
||||||
|
@ -1391,7 +1391,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||||
/// types that have external ABIs, as these still need checked.
|
/// types that have external ABIs, as these still need checked.
|
||||||
fn check_fn(&mut self, def_id: LocalDefId, decl: &'tcx hir::FnDecl<'_>) {
|
fn check_fn(&mut self, def_id: LocalDefId, decl: &'tcx hir::FnDecl<'_>) {
|
||||||
let sig = self.cx.tcx.fn_sig(def_id).instantiate_identity();
|
let sig = self.cx.tcx.fn_sig(def_id).instantiate_identity();
|
||||||
let sig = self.cx.tcx.erase_late_bound_regions(sig);
|
let sig = self.cx.tcx.instantiate_bound_regions_with_erased(sig);
|
||||||
|
|
||||||
for (input_ty, input_hir) in iter::zip(sig.inputs(), decl.inputs) {
|
for (input_ty, input_hir) in iter::zip(sig.inputs(), decl.inputs) {
|
||||||
for (fn_ptr_ty, span) in self.find_fn_ptr_ty_with_external_abi(input_hir, *input_ty) {
|
for (fn_ptr_ty, span) in self.find_fn_ptr_ty_with_external_abi(input_hir, *input_ty) {
|
||||||
|
@ -1409,7 +1409,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||||
/// Check if a function's argument types and result type are "ffi-safe".
|
/// Check if a function's argument types and result type are "ffi-safe".
|
||||||
fn check_foreign_fn(&mut self, def_id: LocalDefId, decl: &'tcx hir::FnDecl<'_>) {
|
fn check_foreign_fn(&mut self, def_id: LocalDefId, decl: &'tcx hir::FnDecl<'_>) {
|
||||||
let sig = self.cx.tcx.fn_sig(def_id).instantiate_identity();
|
let sig = self.cx.tcx.fn_sig(def_id).instantiate_identity();
|
||||||
let sig = self.cx.tcx.erase_late_bound_regions(sig);
|
let sig = self.cx.tcx.instantiate_bound_regions_with_erased(sig);
|
||||||
|
|
||||||
for (input_ty, input_hir) in iter::zip(sig.inputs(), decl.inputs) {
|
for (input_ty, input_hir) in iter::zip(sig.inputs(), decl.inputs) {
|
||||||
self.check_type_for_ffi_and_report_errors(input_hir.span, *input_ty, false, false);
|
self.check_type_for_ffi_and_report_errors(input_hir.span, *input_ty, false, false);
|
||||||
|
|
|
@ -470,7 +470,7 @@ impl<'tcx> Collector<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn i686_arg_list_size(&self, item: DefId) -> usize {
|
fn i686_arg_list_size(&self, item: DefId) -> usize {
|
||||||
let argument_types: &List<Ty<'_>> = self.tcx.erase_late_bound_regions(
|
let argument_types: &List<Ty<'_>> = self.tcx.instantiate_bound_regions_with_erased(
|
||||||
self.tcx
|
self.tcx
|
||||||
.type_of(item)
|
.type_of(item)
|
||||||
.instantiate_identity()
|
.instantiate_identity()
|
||||||
|
|
|
@ -250,7 +250,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
///
|
///
|
||||||
/// This method only replaces late bound regions. Any types or
|
/// This method only replaces late bound regions. Any types or
|
||||||
/// constants bound by `value` will cause an ICE.
|
/// constants bound by `value` will cause an ICE.
|
||||||
pub fn replace_late_bound_regions<T, F>(
|
pub fn instantiate_bound_regions<T, F>(
|
||||||
self,
|
self,
|
||||||
value: Binder<'tcx, T>,
|
value: Binder<'tcx, T>,
|
||||||
mut fld_r: F,
|
mut fld_r: F,
|
||||||
|
@ -261,11 +261,11 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
{
|
{
|
||||||
let mut region_map = BTreeMap::new();
|
let mut region_map = BTreeMap::new();
|
||||||
let real_fld_r = |br: ty::BoundRegion| *region_map.entry(br).or_insert_with(|| fld_r(br));
|
let real_fld_r = |br: ty::BoundRegion| *region_map.entry(br).or_insert_with(|| fld_r(br));
|
||||||
let value = self.replace_late_bound_regions_uncached(value, real_fld_r);
|
let value = self.instantiate_bound_regions_uncached(value, real_fld_r);
|
||||||
(value, region_map)
|
(value, region_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn replace_late_bound_regions_uncached<T, F>(
|
pub fn instantiate_bound_regions_uncached<T, F>(
|
||||||
self,
|
self,
|
||||||
value: Binder<'tcx, T>,
|
value: Binder<'tcx, T>,
|
||||||
mut replace_regions: F,
|
mut replace_regions: F,
|
||||||
|
@ -325,7 +325,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
self.replace_late_bound_regions_uncached(value, |br| {
|
self.instantiate_bound_regions_uncached(value, |br| {
|
||||||
ty::Region::new_late_param(self, all_outlive_scope, br.kind)
|
ty::Region::new_late_param(self, all_outlive_scope, br.kind)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -361,11 +361,11 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
|
|
||||||
/// Replaces any late-bound regions bound in `value` with `'erased`. Useful in codegen but also
|
/// Replaces any late-bound regions bound in `value` with `'erased`. Useful in codegen but also
|
||||||
/// method lookup and a few other places where precise region relationships are not required.
|
/// method lookup and a few other places where precise region relationships are not required.
|
||||||
pub fn erase_late_bound_regions<T>(self, value: Binder<'tcx, T>) -> T
|
pub fn instantiate_bound_regions_with_erased<T>(self, value: Binder<'tcx, T>) -> T
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
self.replace_late_bound_regions(value, |_| self.lifetimes.re_erased).0
|
self.instantiate_bound_regions(value, |_| self.lifetimes.re_erased).0
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Anonymize all bound variables in `value`, this is mostly used to improve caching.
|
/// Anonymize all bound variables in `value`, this is mostly used to improve caching.
|
||||||
|
|
|
@ -97,6 +97,10 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
/// N.B., currently, higher-ranked type bounds inhibit
|
/// N.B., currently, higher-ranked type bounds inhibit
|
||||||
/// normalization. Therefore, each time we erase them in
|
/// normalization. Therefore, each time we erase them in
|
||||||
/// codegen, we need to normalize the contents.
|
/// codegen, we need to normalize the contents.
|
||||||
|
// FIXME(@lcnr): This method should not be necessary, we now normalize
|
||||||
|
// inside of binders. We should be able to only use
|
||||||
|
// `tcx.instantiate_bound_regions_with_erased`. Same for the `try_X`
|
||||||
|
// variant.
|
||||||
#[tracing::instrument(level = "debug", skip(self, param_env))]
|
#[tracing::instrument(level = "debug", skip(self, param_env))]
|
||||||
pub fn normalize_erasing_late_bound_regions<T>(
|
pub fn normalize_erasing_late_bound_regions<T>(
|
||||||
self,
|
self,
|
||||||
|
@ -106,7 +110,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
let value = self.erase_late_bound_regions(value);
|
let value = self.instantiate_bound_regions_with_erased(value);
|
||||||
self.normalize_erasing_regions(param_env, value)
|
self.normalize_erasing_regions(param_env, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +130,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
let value = self.erase_late_bound_regions(value);
|
let value = self.instantiate_bound_regions_with_erased(value);
|
||||||
self.try_normalize_erasing_regions(param_env, value)
|
self.try_normalize_erasing_regions(param_env, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1036,7 +1036,7 @@ impl<'tcx, T> Binder<'tcx, T> {
|
||||||
/// risky thing to do because it's easy to get confused about
|
/// risky thing to do because it's easy to get confused about
|
||||||
/// De Bruijn indices and the like. It is usually better to
|
/// De Bruijn indices and the like. It is usually better to
|
||||||
/// discharge the binder using `no_bound_vars` or
|
/// discharge the binder using `no_bound_vars` or
|
||||||
/// `replace_late_bound_regions` or something like
|
/// `instantiate_bound_regions` or something like
|
||||||
/// that. `skip_binder` is only valid when you are either
|
/// that. `skip_binder` is only valid when you are either
|
||||||
/// extracting data that has nothing to do with bound vars, you
|
/// extracting data that has nothing to do with bound vars, you
|
||||||
/// are doing some sort of test that does not involve bound
|
/// are doing some sort of test that does not involve bound
|
||||||
|
|
|
@ -135,7 +135,7 @@ impl<'tcx> Cx<'tcx> {
|
||||||
let env_region = ty::Region::new_bound(self.tcx, ty::INNERMOST, br);
|
let env_region = ty::Region::new_bound(self.tcx, ty::INNERMOST, br);
|
||||||
let closure_env_ty =
|
let closure_env_ty =
|
||||||
self.tcx.closure_env_ty(closure_def_id, closure_args, env_region).unwrap();
|
self.tcx.closure_env_ty(closure_def_id, closure_args, env_region).unwrap();
|
||||||
let liberated_closure_env_ty = self.tcx.erase_late_bound_regions(
|
let liberated_closure_env_ty = self.tcx.instantiate_bound_regions_with_erased(
|
||||||
ty::Binder::bind_with_vars(closure_env_ty, bound_vars),
|
ty::Binder::bind_with_vars(closure_env_ty, bound_vars),
|
||||||
);
|
);
|
||||||
let env_param = Param {
|
let env_param = Param {
|
||||||
|
|
|
@ -179,7 +179,7 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option<Ty<'tcx>>)
|
||||||
GenericArgs::identity_for_item(tcx, def_id)
|
GenericArgs::identity_for_item(tcx, def_id)
|
||||||
};
|
};
|
||||||
let sig = tcx.fn_sig(def_id).instantiate(tcx, args);
|
let sig = tcx.fn_sig(def_id).instantiate(tcx, args);
|
||||||
let sig = tcx.erase_late_bound_regions(sig);
|
let sig = tcx.instantiate_bound_regions_with_erased(sig);
|
||||||
let span = tcx.def_span(def_id);
|
let span = tcx.def_span(def_id);
|
||||||
|
|
||||||
let source_info = SourceInfo::outermost(span);
|
let source_info = SourceInfo::outermost(span);
|
||||||
|
@ -416,7 +416,7 @@ impl<'tcx> CloneShimBuilder<'tcx> {
|
||||||
// otherwise going to be TySelf and we can't index
|
// otherwise going to be TySelf and we can't index
|
||||||
// or access fields of a Place of type TySelf.
|
// or access fields of a Place of type TySelf.
|
||||||
let sig = tcx.fn_sig(def_id).instantiate(tcx, &[self_ty.into()]);
|
let sig = tcx.fn_sig(def_id).instantiate(tcx, &[self_ty.into()]);
|
||||||
let sig = tcx.erase_late_bound_regions(sig);
|
let sig = tcx.instantiate_bound_regions_with_erased(sig);
|
||||||
let span = tcx.def_span(def_id);
|
let span = tcx.def_span(def_id);
|
||||||
|
|
||||||
CloneShimBuilder {
|
CloneShimBuilder {
|
||||||
|
@ -654,7 +654,7 @@ fn build_call_shim<'tcx>(
|
||||||
// to substitute into the signature of the shim. It is not necessary for users of this
|
// to substitute into the signature of the shim. It is not necessary for users of this
|
||||||
// MIR body to perform further substitutions (see `InstanceDef::has_polymorphic_mir_body`).
|
// MIR body to perform further substitutions (see `InstanceDef::has_polymorphic_mir_body`).
|
||||||
let (sig_args, untuple_args) = if let ty::InstanceDef::FnPtrShim(_, ty) = instance {
|
let (sig_args, untuple_args) = if let ty::InstanceDef::FnPtrShim(_, ty) = instance {
|
||||||
let sig = tcx.erase_late_bound_regions(ty.fn_sig(tcx));
|
let sig = tcx.instantiate_bound_regions_with_erased(ty.fn_sig(tcx));
|
||||||
|
|
||||||
let untuple_args = sig.inputs();
|
let untuple_args = sig.inputs();
|
||||||
|
|
||||||
|
@ -668,7 +668,7 @@ fn build_call_shim<'tcx>(
|
||||||
|
|
||||||
let def_id = instance.def_id();
|
let def_id = instance.def_id();
|
||||||
let sig = tcx.fn_sig(def_id);
|
let sig = tcx.fn_sig(def_id);
|
||||||
let sig = sig.map_bound(|sig| tcx.erase_late_bound_regions(sig));
|
let sig = sig.map_bound(|sig| tcx.instantiate_bound_regions_with_erased(sig));
|
||||||
|
|
||||||
assert_eq!(sig_args.is_some(), !instance.has_polymorphic_mir_body());
|
assert_eq!(sig_args.is_some(), !instance.has_polymorphic_mir_body());
|
||||||
let mut sig = if let Some(sig_args) = sig_args {
|
let mut sig = if let Some(sig_args) = sig_args {
|
||||||
|
|
|
@ -739,9 +739,9 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
real_trait_pred = parent_trait_pred;
|
real_trait_pred = parent_trait_pred;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We `erase_late_bound_regions` here because `make_subregion` does not handle
|
// We `instantiate_bound_regions_with_erased` here because `make_subregion` does not handle
|
||||||
// `ReBound`, and we don't particularly care about the regions.
|
// `ReBound`, and we don't particularly care about the regions.
|
||||||
let real_ty = self.tcx.erase_late_bound_regions(real_trait_pred.self_ty());
|
let real_ty = self.tcx.instantiate_bound_regions_with_erased(real_trait_pred.self_ty());
|
||||||
if !self.can_eq(obligation.param_env, real_ty, arg_ty) {
|
if !self.can_eq(obligation.param_env, real_ty, arg_ty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -2287,8 +2287,8 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
// represent regions that are part of the suspended
|
// represent regions that are part of the suspended
|
||||||
// coroutine frame. Bound regions are preserved by
|
// coroutine frame. Bound regions are preserved by
|
||||||
// `erase_regions` and so we must also call
|
// `erase_regions` and so we must also call
|
||||||
// `erase_late_bound_regions`.
|
// `instantiate_bound_regions_with_erased`.
|
||||||
let ty_erased = self.tcx.erase_late_bound_regions(ty);
|
let ty_erased = self.tcx.instantiate_bound_regions_with_erased(ty);
|
||||||
let ty_erased = self.tcx.erase_regions(ty_erased);
|
let ty_erased = self.tcx.erase_regions(ty_erased);
|
||||||
let eq = ty_erased == target_ty_erased;
|
let eq = ty_erased == target_ty_erased;
|
||||||
debug!(?ty_erased, ?target_ty_erased, ?eq);
|
debug!(?ty_erased, ?target_ty_erased, ?eq);
|
||||||
|
@ -3374,7 +3374,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
let self_ty = self.resolve_vars_if_possible(trait_pred.self_ty());
|
let self_ty = self.resolve_vars_if_possible(trait_pred.self_ty());
|
||||||
let impls_future = self.type_implements_trait(
|
let impls_future = self.type_implements_trait(
|
||||||
future_trait,
|
future_trait,
|
||||||
[self.tcx.erase_late_bound_regions(self_ty)],
|
[self.tcx.instantiate_bound_regions_with_erased(self_ty)],
|
||||||
obligation.param_env,
|
obligation.param_env,
|
||||||
);
|
);
|
||||||
if !impls_future.must_apply_modulo_regions() {
|
if !impls_future.must_apply_modulo_regions() {
|
||||||
|
|
|
@ -2750,7 +2750,8 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
use rustc_transmute::Answer;
|
use rustc_transmute::Answer;
|
||||||
|
|
||||||
// Erase regions because layout code doesn't particularly care about regions.
|
// Erase regions because layout code doesn't particularly care about regions.
|
||||||
let trait_ref = self.tcx.erase_regions(self.tcx.erase_late_bound_regions(trait_ref));
|
let trait_ref =
|
||||||
|
self.tcx.erase_regions(self.tcx.instantiate_bound_regions_with_erased(trait_ref));
|
||||||
|
|
||||||
let src_and_dst = rustc_transmute::Types {
|
let src_and_dst = rustc_transmute::Types {
|
||||||
dst: trait_ref.args.type_at(0),
|
dst: trait_ref.args.type_at(0),
|
||||||
|
|
|
@ -1051,7 +1051,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
) {
|
) {
|
||||||
// The regions of a type don't affect the size of the type
|
// The regions of a type don't affect the size of the type
|
||||||
let tcx = self.tcx();
|
let tcx = self.tcx();
|
||||||
let self_ty = tcx.erase_late_bound_regions(obligation.predicate.self_ty());
|
let self_ty = tcx.instantiate_bound_regions_with_erased(obligation.predicate.self_ty());
|
||||||
// We should erase regions from both the param-env and type, since both
|
// We should erase regions from both the param-env and type, since both
|
||||||
// may have infer regions. Specifically, after canonicalizing and instantiating,
|
// may have infer regions. Specifically, after canonicalizing and instantiating,
|
||||||
// early bound regions turn into region vars in both the new and old solver.
|
// early bound regions turn into region vars in both the new and old solver.
|
||||||
|
|
|
@ -327,8 +327,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
// care about other regions. Erasing late-bound regions is equivalent
|
// care about other regions. Erasing late-bound regions is equivalent
|
||||||
// to instantiating the binder with placeholders then erasing those
|
// to instantiating the binder with placeholders then erasing those
|
||||||
// placeholder regions.
|
// placeholder regions.
|
||||||
let predicate =
|
let predicate = self
|
||||||
self.tcx().erase_regions(self.tcx().erase_late_bound_regions(obligation.predicate));
|
.tcx()
|
||||||
|
.erase_regions(self.tcx().instantiate_bound_regions_with_erased(obligation.predicate));
|
||||||
|
|
||||||
let Some(assume) = rustc_transmute::Assume::from_const(
|
let Some(assume) = rustc_transmute::Assume::from_const(
|
||||||
self.infcx.tcx,
|
self.infcx.tcx,
|
||||||
|
|
|
@ -771,7 +771,7 @@ impl TyCoercionStability {
|
||||||
DefinedTy::Mir(ty) => Self::for_mir_ty(
|
DefinedTy::Mir(ty) => Self::for_mir_ty(
|
||||||
cx.tcx,
|
cx.tcx,
|
||||||
ty.param_env,
|
ty.param_env,
|
||||||
cx.tcx.erase_late_bound_regions(ty.value),
|
cx.tcx.instantiate_bound_regions_with_erased(ty.value),
|
||||||
for_return,
|
for_return,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ fn result_err_ty<'tcx>(
|
||||||
&& let hir::FnRetTy::Return(hir_ty) = decl.output
|
&& let hir::FnRetTy::Return(hir_ty) = decl.output
|
||||||
&& let ty = cx
|
&& let ty = cx
|
||||||
.tcx
|
.tcx
|
||||||
.erase_late_bound_regions(cx.tcx.fn_sig(id).instantiate_identity().output())
|
.instantiate_bound_regions_with_erased(cx.tcx.fn_sig(id).instantiate_identity().output())
|
||||||
&& is_type_diagnostic_item(cx, ty, sym::Result)
|
&& is_type_diagnostic_item(cx, ty, sym::Result)
|
||||||
&& let ty::Adt(_, args) = ty.kind()
|
&& let ty::Adt(_, args) = ty.kind()
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,7 +71,7 @@ fn check_sig(cx: &LateContext<'_>, name: &str, sig: &FnSig<'_>, fn_id: LocalDefI
|
||||||
if sig.decl.implicit_self.has_implicit_self() {
|
if sig.decl.implicit_self.has_implicit_self() {
|
||||||
let ret_ty = cx
|
let ret_ty = cx
|
||||||
.tcx
|
.tcx
|
||||||
.erase_late_bound_regions(cx.tcx.fn_sig(fn_id).instantiate_identity().output());
|
.instantiate_bound_regions_with_erased(cx.tcx.fn_sig(fn_id).instantiate_identity().output());
|
||||||
let ret_ty = cx
|
let ret_ty = cx
|
||||||
.tcx
|
.tcx
|
||||||
.try_normalize_erasing_regions(cx.param_env, ret_ty)
|
.try_normalize_erasing_regions(cx.param_env, ret_ty)
|
||||||
|
|
|
@ -63,7 +63,7 @@ fn is_map_to_option(cx: &LateContext<'_>, map_arg: &Expr<'_>) -> bool {
|
||||||
ty::Closure(_, args) => args.as_closure().sig(),
|
ty::Closure(_, args) => args.as_closure().sig(),
|
||||||
_ => map_closure_ty.fn_sig(cx.tcx),
|
_ => map_closure_ty.fn_sig(cx.tcx),
|
||||||
};
|
};
|
||||||
let map_closure_return_ty = cx.tcx.erase_late_bound_regions(map_closure_sig.output());
|
let map_closure_return_ty = cx.tcx.instantiate_bound_regions_with_erased(map_closure_sig.output());
|
||||||
is_type_diagnostic_item(cx, map_closure_return_ty, sym::Option)
|
is_type_diagnostic_item(cx, map_closure_return_ty, sym::Option)
|
||||||
},
|
},
|
||||||
_ => false,
|
_ => false,
|
||||||
|
|
|
@ -3897,7 +3897,7 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
|
||||||
let implements_trait = matches!(item.kind, hir::ItemKind::Impl(hir::Impl { of_trait: Some(_), .. }));
|
let implements_trait = matches!(item.kind, hir::ItemKind::Impl(hir::Impl { of_trait: Some(_), .. }));
|
||||||
if let hir::ImplItemKind::Fn(ref sig, id) = impl_item.kind {
|
if let hir::ImplItemKind::Fn(ref sig, id) = impl_item.kind {
|
||||||
let method_sig = cx.tcx.fn_sig(impl_item.owner_id).instantiate_identity();
|
let method_sig = cx.tcx.fn_sig(impl_item.owner_id).instantiate_identity();
|
||||||
let method_sig = cx.tcx.erase_late_bound_regions(method_sig);
|
let method_sig = cx.tcx.instantiate_bound_regions_with_erased(method_sig);
|
||||||
let first_arg_ty_opt = method_sig.inputs().iter().next().copied();
|
let first_arg_ty_opt = method_sig.inputs().iter().next().copied();
|
||||||
// if this impl block implements a trait, lint in trait definition instead
|
// if this impl block implements a trait, lint in trait definition instead
|
||||||
if !implements_trait && cx.effective_visibilities.is_exported(impl_item.owner_id.def_id) {
|
if !implements_trait && cx.effective_visibilities.is_exported(impl_item.owner_id.def_id) {
|
||||||
|
|
|
@ -225,7 +225,7 @@ fn is_contains_sig(cx: &LateContext<'_>, call_id: HirId, iter_expr: &Expr<'_>) -
|
||||||
&& let sig = cx.tcx.fn_sig(id).instantiate_identity()
|
&& let sig = cx.tcx.fn_sig(id).instantiate_identity()
|
||||||
&& sig.skip_binder().output().is_bool()
|
&& sig.skip_binder().output().is_bool()
|
||||||
&& let [_, search_ty] = *sig.skip_binder().inputs()
|
&& let [_, search_ty] = *sig.skip_binder().inputs()
|
||||||
&& let ty::Ref(_, search_ty, Mutability::Not) = *cx.tcx.erase_late_bound_regions(sig.rebind(search_ty)).kind()
|
&& let ty::Ref(_, search_ty, Mutability::Not) = *cx.tcx.instantiate_bound_regions_with_erased(sig.rebind(search_ty)).kind()
|
||||||
&& let Some(iter_trait) = cx.tcx.get_diagnostic_item(sym::Iterator)
|
&& let Some(iter_trait) = cx.tcx.get_diagnostic_item(sym::Iterator)
|
||||||
&& let Some(iter_item) = cx.tcx.associated_items(iter_trait).find_by_name_and_kind(
|
&& let Some(iter_item) = cx.tcx.associated_items(iter_trait).find_by_name_and_kind(
|
||||||
cx.tcx,
|
cx.tcx,
|
||||||
|
|
|
@ -165,7 +165,7 @@ impl<'a, 'tcx> Visitor<'tcx> for DivergenceVisitor<'a, 'tcx> {
|
||||||
match typ.kind() {
|
match typ.kind() {
|
||||||
ty::FnDef(..) | ty::FnPtr(_) => {
|
ty::FnDef(..) | ty::FnPtr(_) => {
|
||||||
let sig = typ.fn_sig(self.cx.tcx);
|
let sig = typ.fn_sig(self.cx.tcx);
|
||||||
if self.cx.tcx.erase_late_bound_regions(sig).output().kind() == &ty::Never {
|
if self.cx.tcx.instantiate_bound_regions_with_erased(sig).output().kind() == &ty::Never {
|
||||||
self.report_diverging_sub_expr(e);
|
self.report_diverging_sub_expr(e);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -143,7 +143,7 @@ impl MutableKeyType {
|
||||||
for (hir_ty, ty) in iter::zip(decl.inputs, fn_sig.inputs().skip_binder()) {
|
for (hir_ty, ty) in iter::zip(decl.inputs, fn_sig.inputs().skip_binder()) {
|
||||||
self.check_ty_(cx, hir_ty.span, *ty);
|
self.check_ty_(cx, hir_ty.span, *ty);
|
||||||
}
|
}
|
||||||
self.check_ty_(cx, decl.output.span(), cx.tcx.erase_late_bound_regions(fn_sig.output()));
|
self.check_ty_(cx, decl.output.span(), cx.tcx.instantiate_bound_regions_with_erased(fn_sig.output()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// We want to lint 1. sets or maps with 2. not immutable key types and 3. no unerased
|
// We want to lint 1. sets or maps with 2. not immutable key types and 3. no unerased
|
||||||
|
|
|
@ -177,7 +177,7 @@ impl<'tcx> PassByRefOrValue {
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
let ty = cx.tcx.erase_late_bound_regions(fn_sig.rebind(ty));
|
let ty = cx.tcx.instantiate_bound_regions_with_erased(fn_sig.rebind(ty));
|
||||||
if is_copy(cx, ty)
|
if is_copy(cx, ty)
|
||||||
&& let Some(size) = cx.layout_of(ty).ok().map(|l| l.size.bytes())
|
&& let Some(size) = cx.layout_of(ty).ok().map(|l| l.size.bytes())
|
||||||
&& size <= self.ref_min_size
|
&& size <= self.ref_min_size
|
||||||
|
@ -225,7 +225,7 @@ impl<'tcx> PassByRefOrValue {
|
||||||
_ => continue,
|
_ => continue,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let ty = cx.tcx.erase_late_bound_regions(ty);
|
let ty = cx.tcx.instantiate_bound_regions_with_erased(ty);
|
||||||
|
|
||||||
if is_copy(cx, ty)
|
if is_copy(cx, ty)
|
||||||
&& !is_self_ty(input)
|
&& !is_self_ty(input)
|
||||||
|
|
|
@ -712,7 +712,7 @@ fn matches_preds<'tcx>(
|
||||||
preds: &'tcx [ty::PolyExistentialPredicate<'tcx>],
|
preds: &'tcx [ty::PolyExistentialPredicate<'tcx>],
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let infcx = cx.tcx.infer_ctxt().build();
|
let infcx = cx.tcx.infer_ctxt().build();
|
||||||
preds.iter().all(|&p| match cx.tcx.erase_late_bound_regions(p) {
|
preds.iter().all(|&p| match cx.tcx.instantiate_bound_regions_with_erased(p) {
|
||||||
ExistentialPredicate::Trait(p) => infcx
|
ExistentialPredicate::Trait(p) => infcx
|
||||||
.type_implements_trait(p.def_id, [ty.into()].into_iter().chain(p.args.iter()), cx.param_env)
|
.type_implements_trait(p.def_id, [ty.into()].into_iter().chain(p.args.iter()), cx.param_env)
|
||||||
.must_apply_modulo_regions(),
|
.must_apply_modulo_regions(),
|
||||||
|
|
|
@ -44,7 +44,7 @@ fn get_trait_predicates_for_trait_id<'tcx>(
|
||||||
let mut preds = Vec::new();
|
let mut preds = Vec::new();
|
||||||
for (pred, _) in generics.predicates {
|
for (pred, _) in generics.predicates {
|
||||||
if let ClauseKind::Trait(poly_trait_pred) = pred.kind().skip_binder()
|
if let ClauseKind::Trait(poly_trait_pred) = pred.kind().skip_binder()
|
||||||
&& let trait_pred = cx.tcx.erase_late_bound_regions(pred.kind().rebind(poly_trait_pred))
|
&& let trait_pred = cx.tcx.instantiate_bound_regions_with_erased(pred.kind().rebind(poly_trait_pred))
|
||||||
&& let Some(trait_def_id) = trait_id
|
&& let Some(trait_def_id) = trait_id
|
||||||
&& trait_def_id == trait_pred.trait_ref.def_id
|
&& trait_def_id == trait_pred.trait_ref.def_id
|
||||||
{
|
{
|
||||||
|
@ -61,7 +61,7 @@ fn get_projection_pred<'tcx>(
|
||||||
) -> Option<ProjectionPredicate<'tcx>> {
|
) -> Option<ProjectionPredicate<'tcx>> {
|
||||||
generics.predicates.iter().find_map(|(proj_pred, _)| {
|
generics.predicates.iter().find_map(|(proj_pred, _)| {
|
||||||
if let ClauseKind::Projection(pred) = proj_pred.kind().skip_binder() {
|
if let ClauseKind::Projection(pred) = proj_pred.kind().skip_binder() {
|
||||||
let projection_pred = cx.tcx.erase_late_bound_regions(proj_pred.kind().rebind(pred));
|
let projection_pred = cx.tcx.instantiate_bound_regions_with_erased(proj_pred.kind().rebind(pred));
|
||||||
if projection_pred.projection_ty.args == trait_pred.trait_ref.args {
|
if projection_pred.projection_ty.args == trait_pred.trait_ref.args {
|
||||||
return Some(projection_pred);
|
return Some(projection_pred);
|
||||||
}
|
}
|
||||||
|
@ -79,10 +79,10 @@ fn get_args_to_check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> Ve
|
||||||
let ord_preds = get_trait_predicates_for_trait_id(cx, generics, cx.tcx.get_diagnostic_item(sym::Ord));
|
let ord_preds = get_trait_predicates_for_trait_id(cx, generics, cx.tcx.get_diagnostic_item(sym::Ord));
|
||||||
let partial_ord_preds =
|
let partial_ord_preds =
|
||||||
get_trait_predicates_for_trait_id(cx, generics, cx.tcx.lang_items().partial_ord_trait());
|
get_trait_predicates_for_trait_id(cx, generics, cx.tcx.lang_items().partial_ord_trait());
|
||||||
// Trying to call erase_late_bound_regions on fn_sig.inputs() gives the following error
|
// Trying to call instantiate_bound_regions_with_erased on fn_sig.inputs() gives the following error
|
||||||
// The trait `rustc::ty::TypeFoldable<'_>` is not implemented for
|
// The trait `rustc::ty::TypeFoldable<'_>` is not implemented for
|
||||||
// `&[rustc_middle::ty::Ty<'_>]`
|
// `&[rustc_middle::ty::Ty<'_>]`
|
||||||
let inputs_output = cx.tcx.erase_late_bound_regions(fn_sig.inputs_and_output());
|
let inputs_output = cx.tcx.instantiate_bound_regions_with_erased(fn_sig.inputs_and_output());
|
||||||
inputs_output
|
inputs_output
|
||||||
.iter()
|
.iter()
|
||||||
.rev()
|
.rev()
|
||||||
|
@ -116,7 +116,7 @@ fn check_arg<'tcx>(cx: &LateContext<'tcx>, arg: &'tcx Expr<'tcx>) -> Option<(Spa
|
||||||
if let ExprKind::Closure(&Closure { body, fn_decl_span, .. }) = arg.kind
|
if let ExprKind::Closure(&Closure { body, fn_decl_span, .. }) = arg.kind
|
||||||
&& let ty::Closure(_def_id, args) = &cx.typeck_results().node_type(arg.hir_id).kind()
|
&& let ty::Closure(_def_id, args) = &cx.typeck_results().node_type(arg.hir_id).kind()
|
||||||
&& let ret_ty = args.as_closure().sig().output()
|
&& let ret_ty = args.as_closure().sig().output()
|
||||||
&& let ty = cx.tcx.erase_late_bound_regions(ret_ty)
|
&& let ty = cx.tcx.instantiate_bound_regions_with_erased(ret_ty)
|
||||||
&& ty.is_unit()
|
&& ty.is_unit()
|
||||||
{
|
{
|
||||||
let body = cx.tcx.hir().body(body);
|
let body = cx.tcx.hir().body(body);
|
||||||
|
|
|
@ -71,7 +71,7 @@ impl UnnecessaryBoxReturns {
|
||||||
|
|
||||||
let return_ty = cx
|
let return_ty = cx
|
||||||
.tcx
|
.tcx
|
||||||
.erase_late_bound_regions(cx.tcx.fn_sig(def_id).skip_binder())
|
.instantiate_bound_regions_with_erased(cx.tcx.fn_sig(def_id).skip_binder())
|
||||||
.output();
|
.output();
|
||||||
|
|
||||||
if !return_ty.is_box() {
|
if !return_ty.is_box() {
|
||||||
|
|
|
@ -159,7 +159,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
|
||||||
.trait_item_def_id
|
.trait_item_def_id
|
||||||
.expect("impl method matches a trait method");
|
.expect("impl method matches a trait method");
|
||||||
let trait_method_sig = cx.tcx.fn_sig(trait_method).instantiate_identity();
|
let trait_method_sig = cx.tcx.fn_sig(trait_method).instantiate_identity();
|
||||||
let trait_method_sig = cx.tcx.erase_late_bound_regions(trait_method_sig);
|
let trait_method_sig = cx.tcx.instantiate_bound_regions_with_erased(trait_method_sig);
|
||||||
|
|
||||||
// `impl_inputs_outputs` is an iterator over the types (`hir::Ty`) declared in the
|
// `impl_inputs_outputs` is an iterator over the types (`hir::Ty`) declared in the
|
||||||
// implementation of the trait.
|
// implementation of the trait.
|
||||||
|
|
|
@ -1667,13 +1667,13 @@ pub fn is_direct_expn_of(span: Span, name: &str) -> Option<Span> {
|
||||||
/// Convenience function to get the return type of a function.
|
/// Convenience function to get the return type of a function.
|
||||||
pub fn return_ty<'tcx>(cx: &LateContext<'tcx>, fn_def_id: hir::OwnerId) -> Ty<'tcx> {
|
pub fn return_ty<'tcx>(cx: &LateContext<'tcx>, fn_def_id: hir::OwnerId) -> Ty<'tcx> {
|
||||||
let ret_ty = cx.tcx.fn_sig(fn_def_id).instantiate_identity().output();
|
let ret_ty = cx.tcx.fn_sig(fn_def_id).instantiate_identity().output();
|
||||||
cx.tcx.erase_late_bound_regions(ret_ty)
|
cx.tcx.instantiate_bound_regions_with_erased(ret_ty)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convenience function to get the nth argument type of a function.
|
/// Convenience function to get the nth argument type of a function.
|
||||||
pub fn nth_arg<'tcx>(cx: &LateContext<'tcx>, fn_def_id: hir::OwnerId, nth: usize) -> Ty<'tcx> {
|
pub fn nth_arg<'tcx>(cx: &LateContext<'tcx>, fn_def_id: hir::OwnerId, nth: usize) -> Ty<'tcx> {
|
||||||
let arg = cx.tcx.fn_sig(fn_def_id).instantiate_identity().input(nth);
|
let arg = cx.tcx.fn_sig(fn_def_id).instantiate_identity().input(nth);
|
||||||
cx.tcx.erase_late_bound_regions(arg)
|
cx.tcx.instantiate_bound_regions_with_erased(arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks if an expression is constructing a tuple-like enum variant or struct
|
/// Checks if an expression is constructing a tuple-like enum variant or struct
|
||||||
|
|
|
@ -1169,7 +1169,7 @@ pub fn make_normalized_projection<'tcx>(
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
false,
|
false,
|
||||||
"args contain late-bound region at index `{i}` which can't be normalized.\n\
|
"args contain late-bound region at index `{i}` which can't be normalized.\n\
|
||||||
use `TyCtxt::erase_late_bound_regions`\n\
|
use `TyCtxt::instantiate_bound_regions_with_erased`\n\
|
||||||
note: arg is `{arg:#?}`",
|
note: arg is `{arg:#?}`",
|
||||||
);
|
);
|
||||||
return None;
|
return None;
|
||||||
|
@ -1247,7 +1247,7 @@ pub fn make_normalized_projection_with_regions<'tcx>(
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
false,
|
false,
|
||||||
"args contain late-bound region at index `{i}` which can't be normalized.\n\
|
"args contain late-bound region at index `{i}` which can't be normalized.\n\
|
||||||
use `TyCtxt::erase_late_bound_regions`\n\
|
use `TyCtxt::instantiate_bound_regions_with_erased`\n\
|
||||||
note: arg is `{arg:#?}`",
|
note: arg is `{arg:#?}`",
|
||||||
);
|
);
|
||||||
return None;
|
return None;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue