Rollup merge of #94006 - pierwill:upvar-field, r=nikomatsakis
Use a `Field` in `ConstraintCategory::ClosureUpvar`
As part of #90317, we do not want `HirId` to implement `Ord`, `PartialOrd`. This line of code has made that difficult
1b27144afc/compiler/rustc_borrowck/src/region_infer/mod.rs (L2184)
since it sorts a [`ConstraintCategory::ClosureUpvar(HirId)`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.ConstraintCategory.html#variant.ClosureUpvar).
This PR makes that variant take a [`Field`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Field.html) instead.
r? `@nikomatsakis`
This commit is contained in:
commit
c28940e49d
@ -5,6 +5,7 @@
|
||||
error_reporting::nice_region_error::NiceRegionError,
|
||||
error_reporting::unexpected_hidden_region_diagnostic, NllRegionVariableOrigin,
|
||||
};
|
||||
use rustc_middle::hir::place::PlaceBase;
|
||||
use rustc_middle::mir::{ConstraintCategory, ReturnConstraint};
|
||||
use rustc_middle::ty::subst::{InternalSubsts, Subst};
|
||||
use rustc_middle::ty::{self, RegionVid, Ty};
|
||||
@ -421,18 +422,27 @@ fn report_fnmut_error(
|
||||
|
||||
diag.span_label(*span, message);
|
||||
|
||||
// FIXME(project-rfc-2229#48): This should store a captured_place not a hir id
|
||||
if let ReturnConstraint::ClosureUpvar(upvar) = kind {
|
||||
if let ReturnConstraint::ClosureUpvar(upvar_field) = kind {
|
||||
let def_id = match self.regioncx.universal_regions().defining_ty {
|
||||
DefiningTy::Closure(def_id, _) => def_id,
|
||||
ty => bug!("unexpected DefiningTy {:?}", ty),
|
||||
};
|
||||
|
||||
let upvar_def_span = self.infcx.tcx.hir().span(upvar);
|
||||
let upvar_span = self.infcx.tcx.upvars_mentioned(def_id).unwrap()[&upvar].span;
|
||||
let captured_place = &self.upvars[upvar_field.index()].place;
|
||||
let defined_hir = match captured_place.place.base {
|
||||
PlaceBase::Local(hirid) => Some(hirid),
|
||||
PlaceBase::Upvar(upvar) => Some(upvar.var_path.hir_id),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
if defined_hir.is_some() {
|
||||
let upvars_map = self.infcx.tcx.upvars_mentioned(def_id).unwrap();
|
||||
let upvar_def_span = self.infcx.tcx.hir().span(defined_hir.unwrap());
|
||||
let upvar_span = upvars_map.get(&defined_hir.unwrap()).unwrap().span;
|
||||
diag.span_label(upvar_def_span, "variable defined here");
|
||||
diag.span_label(upvar_span, "variable captured here");
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(fr_span) = self.give_region_a_name(*outlived_fr).unwrap().span() {
|
||||
diag.span_label(fr_span, "inferred to be a `FnMut` closure");
|
||||
|
@ -2530,9 +2530,7 @@ fn add_reborrow_constraint(
|
||||
body,
|
||||
);
|
||||
let category = if let Some(field) = field {
|
||||
let var_hir_id = self.borrowck_context.upvars[field.index()].place.get_root_variable();
|
||||
// FIXME(project-rfc-2229#8): Use Place for better diagnostics
|
||||
ConstraintCategory::ClosureUpvar(var_hir_id)
|
||||
ConstraintCategory::ClosureUpvar(field)
|
||||
} else {
|
||||
ConstraintCategory::Boring
|
||||
};
|
||||
|
@ -341,7 +341,7 @@ pub enum ConstraintCategory {
|
||||
/// like `Foo { field: my_val }`)
|
||||
Usage,
|
||||
OpaqueType,
|
||||
ClosureUpvar(hir::HirId),
|
||||
ClosureUpvar(Field),
|
||||
|
||||
/// A constraint from a user-written predicate
|
||||
/// with the provided span, written on the item
|
||||
@ -363,7 +363,7 @@ pub enum ConstraintCategory {
|
||||
#[derive(TyEncodable, TyDecodable, HashStable)]
|
||||
pub enum ReturnConstraint {
|
||||
Normal,
|
||||
ClosureUpvar(hir::HirId),
|
||||
ClosureUpvar(Field),
|
||||
}
|
||||
|
||||
/// The subject of a `ClosureOutlivesRequirement` -- that is, the thing
|
||||
|
Loading…
Reference in New Issue
Block a user