-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Use a Field
in ConstraintCategory::ClosureUpvar
#94006
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,7 @@ use rustc_infer::infer::{ | |
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,17 +422,26 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { | |
|
||
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; | ||
diag.span_label(upvar_def_span, "variable defined here"); | ||
diag.span_label(upvar_span, "variable captured here"); | ||
let captured_place = &self.upvars[upvar_field.index()].place; | ||
let defined_hir = match captured_place.place.base { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. to some extent that comment here to this now, because the thing we've captured is really a full place, not just the base of the place |
||
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() { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2530,9 +2530,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { | |
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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we keep this comment? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. no |
||
ConstraintCategory::ClosureUpvar(var_hir_id) | ||
ConstraintCategory::ClosureUpvar(field) | ||
} else { | ||
ConstraintCategory::Boring | ||
}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we keep this comment?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no, I think it is addressed by using the field actually