1
Fork 0

Rollup merge of #85605 - ptrojahn:closure_struct, r=matthewjasper

Replace Local::new(1) with CAPTURE_STRUCT_LOCAL
This commit is contained in:
Guillaume Gomez 2021-05-25 13:05:14 +02:00 committed by GitHub
commit ad72247833
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 20 additions and 19 deletions

View file

@ -1,7 +1,7 @@
use crate::hir::place::{ use crate::hir::place::{
Place as HirPlace, PlaceBase as HirPlaceBase, ProjectionKind as HirProjectionKind, Place as HirPlace, PlaceBase as HirPlaceBase, ProjectionKind as HirProjectionKind,
}; };
use crate::ty; use crate::{mir, ty};
use rustc_data_structures::fx::{FxHashMap, FxIndexMap}; use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
use rustc_hir as hir; use rustc_hir as hir;
@ -12,6 +12,10 @@ use super::{Ty, TyCtxt};
use self::BorrowKind::*; use self::BorrowKind::*;
// Captures are represented using fields inside a structure.
// This represents accessing self in the closure structure
pub const CAPTURE_STRUCT_LOCAL: mir::Local = mir::Local::from_u32(1);
#[derive( #[derive(
Clone, Clone,
Copy, Copy,

View file

@ -4,10 +4,9 @@ use rustc_errors::{Applicability, DiagnosticBuilder};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_hir::{AsyncGeneratorKind, GeneratorKind}; use rustc_hir::{AsyncGeneratorKind, GeneratorKind};
use rustc_index::vec::Idx;
use rustc_middle::mir::{ use rustc_middle::mir::{
self, AggregateKind, BindingForm, BorrowKind, ClearCrossCrate, ConstraintCategory, self, AggregateKind, BindingForm, BorrowKind, ClearCrossCrate, ConstraintCategory,
FakeReadCause, Local, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceRef, FakeReadCause, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceRef,
ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, VarBindingForm, ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, VarBindingForm,
}; };
use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TypeFoldable}; use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TypeFoldable};
@ -1274,7 +1273,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
bug!("temporary or return pointer with a name") bug!("temporary or return pointer with a name")
} }
LocalKind::Var => "local variable ", LocalKind::Var => "local variable ",
LocalKind::Arg if !self.upvars.is_empty() && local == Local::new(1) => { LocalKind::Arg
if !self.upvars.is_empty() && local == ty::CAPTURE_STRUCT_LOCAL =>
{
"variable captured by `move` " "variable captured by `move` "
} }
LocalKind::Arg => "function parameter ", LocalKind::Arg => "function parameter ",

View file

@ -1,6 +1,5 @@
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::Node; use rustc_hir::Node;
use rustc_index::vec::Idx;
use rustc_middle::hir::map::Map; use rustc_middle::hir::map::Map;
use rustc_middle::mir::{Mutability, Place, PlaceRef, ProjectionElem}; use rustc_middle::mir::{Mutability, Place, PlaceRef, ProjectionElem};
use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::ty::{self, Ty, TyCtxt};
@ -115,12 +114,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
} }
} }
PlaceRef { local: _, projection: [proj_base @ .., ProjectionElem::Deref] } => { PlaceRef { local: _, projection: [proj_base @ .., ProjectionElem::Deref] } => {
if the_place_err.local == Local::new(1) if the_place_err.local == ty::CAPTURE_STRUCT_LOCAL
&& proj_base.is_empty() && proj_base.is_empty()
&& !self.upvars.is_empty() && !self.upvars.is_empty()
{ {
item_msg = format!("`{}`", access_place_desc.unwrap()); item_msg = format!("`{}`", access_place_desc.unwrap());
debug_assert!(self.body.local_decls[Local::new(1)].ty.is_region_ptr()); debug_assert!(
self.body.local_decls[ty::CAPTURE_STRUCT_LOCAL].ty.is_region_ptr()
);
debug_assert!(is_closure_or_generator( debug_assert!(is_closure_or_generator(
Place::ty_from( Place::ty_from(
the_place_err.local, the_place_err.local,
@ -478,11 +479,9 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
} }
} }
PlaceRef { PlaceRef { local, projection: [ProjectionElem::Deref] }
local, if local == ty::CAPTURE_STRUCT_LOCAL && !self.upvars.is_empty() =>
projection: [ProjectionElem::Deref], {
// FIXME document what is this 1 magic number about
} if local == Local::new(1) && !self.upvars.is_empty() => {
self.expected_fn_found_fn_mut_call(&mut err, span, act); self.expected_fn_found_fn_mut_call(&mut err, span, act);
} }

View file

@ -209,9 +209,7 @@ fn to_upvars_resolved_place_builder<'a, 'tcx>(
match from_builder.base { match from_builder.base {
PlaceBase::Local(_) => Ok(from_builder), PlaceBase::Local(_) => Ok(from_builder),
PlaceBase::Upvar { var_hir_id, closure_def_id, closure_kind } => { PlaceBase::Upvar { var_hir_id, closure_def_id, closure_kind } => {
// Captures are represented using fields inside a structure. let mut upvar_resolved_place_builder = PlaceBuilder::from(ty::CAPTURE_STRUCT_LOCAL);
// This represents accessing self in the closure structure
let mut upvar_resolved_place_builder = PlaceBuilder::from(Local::new(1));
match closure_kind { match closure_kind {
ty::ClosureKind::Fn | ty::ClosureKind::FnMut => { ty::ClosureKind::Fn | ty::ClosureKind::FnMut => {
upvar_resolved_place_builder = upvar_resolved_place_builder.deref(); upvar_resolved_place_builder = upvar_resolved_place_builder.deref();

View file

@ -446,7 +446,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
} => { } => {
// Not in a closure // Not in a closure
debug_assert!( debug_assert!(
local == Local::new(1), local == ty::CAPTURE_STRUCT_LOCAL,
"Expected local to be Local(1), found {:?}", "Expected local to be Local(1), found {:?}",
local local
); );

View file

@ -953,9 +953,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// the given closure and use the necessary information to create upvar // the given closure and use the necessary information to create upvar
// debuginfo and to fill `self.upvar_mutbls`. // debuginfo and to fill `self.upvar_mutbls`.
if hir_typeck_results.closure_min_captures.get(&fn_def_id).is_some() { if hir_typeck_results.closure_min_captures.get(&fn_def_id).is_some() {
let closure_env_arg = Local::new(1);
let mut closure_env_projs = vec![]; let mut closure_env_projs = vec![];
let mut closure_ty = self.local_decls[closure_env_arg].ty; let mut closure_ty = self.local_decls[ty::CAPTURE_STRUCT_LOCAL].ty;
if let ty::Ref(_, ty, _) = closure_ty.kind() { if let ty::Ref(_, ty, _) = closure_ty.kind() {
closure_env_projs.push(ProjectionElem::Deref); closure_env_projs.push(ProjectionElem::Deref);
closure_ty = ty; closure_ty = ty;
@ -1001,7 +1000,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
name, name,
source_info: SourceInfo::outermost(tcx_hir.span(var_id)), source_info: SourceInfo::outermost(tcx_hir.span(var_id)),
value: VarDebugInfoContents::Place(Place { value: VarDebugInfoContents::Place(Place {
local: closure_env_arg, local: ty::CAPTURE_STRUCT_LOCAL,
projection: tcx.intern_place_elems(&projs), projection: tcx.intern_place_elems(&projs),
}), }),
}); });