1
Fork 0

thir: wrap hir id of vars into local var id

This commit is contained in:
Ding Xiang Fei 2022-06-08 20:23:07 +08:00
parent 14947924df
commit 6cad569a95
No known key found for this signature in database
GPG key ID: 3CD748647EEF6359
6 changed files with 53 additions and 38 deletions

View file

@ -191,6 +191,20 @@ pub enum StmtKind<'tcx> {
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
rustc_data_structures::static_assert_size!(Expr<'_>, 104); rustc_data_structures::static_assert_size!(Expr<'_>, 104);
#[derive(
Clone,
Debug,
Copy,
PartialEq,
Eq,
Hash,
HashStable,
TyEncodable,
TyDecodable,
TypeFoldable
)]
pub struct LocalVarId(pub hir::HirId);
/// A THIR expression. /// A THIR expression.
#[derive(Clone, Debug, HashStable)] #[derive(Clone, Debug, HashStable)]
pub struct Expr<'tcx> { pub struct Expr<'tcx> {
@ -332,7 +346,7 @@ pub enum ExprKind<'tcx> {
}, },
/// A local variable. /// A local variable.
VarRef { VarRef {
id: hir::HirId, id: LocalVarId,
}, },
/// Used to represent upvars mentioned in a closure/generator /// Used to represent upvars mentioned in a closure/generator
UpvarRef { UpvarRef {
@ -340,7 +354,7 @@ pub enum ExprKind<'tcx> {
closure_def_id: DefId, closure_def_id: DefId,
/// HirId of the root variable /// HirId of the root variable
var_hir_id: hir::HirId, var_hir_id: LocalVarId,
}, },
/// A borrow, e.g. `&arg`. /// A borrow, e.g. `&arg`.
Borrow { Borrow {
@ -596,7 +610,7 @@ pub enum PatKind<'tcx> {
mutability: Mutability, mutability: Mutability,
name: Symbol, name: Symbol,
mode: BindingMode, mode: BindingMode,
var: hir::HirId, var: LocalVarId,
ty: Ty<'tcx>, ty: Ty<'tcx>,
subpattern: Option<Pat<'tcx>>, subpattern: Option<Pat<'tcx>>,
/// Is this the leftmost occurrence of the binding, i.e., is `var` the /// Is this the leftmost occurrence of the binding, i.e., is `var` the

View file

@ -3,8 +3,7 @@
use crate::build::expr::category::Category; use crate::build::expr::category::Category;
use crate::build::ForGuard::{OutsideGuard, RefWithinGuard}; use crate::build::ForGuard::{OutsideGuard, RefWithinGuard};
use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_hir::def_id::DefId; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_hir::HirId;
use rustc_middle::hir::place::Projection as HirProjection; use rustc_middle::hir::place::Projection as HirProjection;
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind; use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
use rustc_middle::middle::region; use rustc_middle::middle::region;
@ -57,7 +56,7 @@ pub(crate) enum PlaceBase {
/// figure out that it is captured until all the `Field` projections are applied. /// figure out that it is captured until all the `Field` projections are applied.
Upvar { Upvar {
/// HirId of the upvar /// HirId of the upvar
var_hir_id: HirId, var_hir_id: LocalVarId,
/// DefId of the closure /// DefId of the closure
closure_def_id: DefId, closure_def_id: DefId,
/// The trait closure implements, `Fn`, `FnMut`, `FnOnce` /// The trait closure implements, `Fn`, `FnMut`, `FnOnce`
@ -151,12 +150,12 @@ fn is_ancestor_or_same_capture(
/// `ty::MinCaptureList` of the root variable `var_hir_id`. /// `ty::MinCaptureList` of the root variable `var_hir_id`.
fn compute_capture_idx<'tcx>( fn compute_capture_idx<'tcx>(
closure_min_captures: &ty::RootVariableMinCaptureList<'tcx>, closure_min_captures: &ty::RootVariableMinCaptureList<'tcx>,
var_hir_id: HirId, var_hir_id: LocalVarId,
root_var_idx: usize, root_var_idx: usize,
) -> usize { ) -> usize {
let mut res = 0; let mut res = 0;
for (var_id, capture_list) in closure_min_captures { for (var_id, capture_list) in closure_min_captures {
if *var_id == var_hir_id { if *var_id == var_hir_id.0 {
res += root_var_idx; res += root_var_idx;
break; break;
} else { } else {
@ -176,12 +175,12 @@ fn compute_capture_idx<'tcx>(
/// Returns None, when the ancestor is not found. /// Returns None, when the ancestor is not found.
fn find_capture_matching_projections<'a, 'tcx>( fn find_capture_matching_projections<'a, 'tcx>(
typeck_results: &'a ty::TypeckResults<'tcx>, typeck_results: &'a ty::TypeckResults<'tcx>,
var_hir_id: HirId, var_hir_id: LocalVarId,
closure_def_id: DefId, closure_def_id: DefId,
projections: &[PlaceElem<'tcx>], projections: &[PlaceElem<'tcx>],
) -> Option<(usize, &'a ty::CapturedPlace<'tcx>)> { ) -> Option<(usize, &'a ty::CapturedPlace<'tcx>)> {
let closure_min_captures = typeck_results.closure_min_captures.get(&closure_def_id)?; let closure_min_captures = typeck_results.closure_min_captures.get(&closure_def_id)?;
let root_variable_min_captures = closure_min_captures.get(&var_hir_id)?; let root_variable_min_captures = closure_min_captures.get(&var_hir_id.0)?;
let hir_projections = convert_to_hir_projections_and_truncate_for_capture(projections); let hir_projections = convert_to_hir_projections_and_truncate_for_capture(projections);
@ -500,8 +499,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
source_info, source_info,
), ),
ExprKind::UpvarRef { closure_def_id, var_hir_id } => { ExprKind::UpvarRef { closure_def_id, var_hir_id } => {
let upvar_id = ty::UpvarId::new(var_hir_id, closure_def_id.expect_local()); this.lower_captured_upvar(block, closure_def_id.expect_local(), var_hir_id)
this.lower_captured_upvar(block, upvar_id)
} }
ExprKind::VarRef { id } => { ExprKind::VarRef { id } => {
@ -627,11 +625,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
fn lower_captured_upvar( fn lower_captured_upvar(
&mut self, &mut self,
block: BasicBlock, block: BasicBlock,
upvar_id: ty::UpvarId, closure_expr_id: LocalDefId,
var_hir_id: LocalVarId,
) -> BlockAnd<PlaceBuilder<'tcx>> { ) -> BlockAnd<PlaceBuilder<'tcx>> {
let closure_ty = self let closure_ty =
.typeck_results self.typeck_results.node_type(self.tcx.hir().local_def_id_to_hir_id(closure_expr_id));
.node_type(self.tcx.hir().local_def_id_to_hir_id(upvar_id.closure_expr_id));
let closure_kind = if let ty::Closure(_, closure_substs) = closure_ty.kind() { let closure_kind = if let ty::Closure(_, closure_substs) = closure_ty.kind() {
self.infcx.closure_kind(closure_substs).unwrap() self.infcx.closure_kind(closure_substs).unwrap()
@ -641,8 +639,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
}; };
block.and(PlaceBuilder::from(PlaceBase::Upvar { block.and(PlaceBuilder::from(PlaceBase::Upvar {
var_hir_id: upvar_id.var_path.hir_id, var_hir_id,
closure_def_id: upvar_id.closure_expr_id.to_def_id(), closure_def_id: closure_expr_id.to_def_id(),
closure_kind, closure_kind,
})) }))
} }

View file

@ -14,7 +14,6 @@ use rustc_data_structures::{
fx::{FxHashSet, FxIndexMap, FxIndexSet}, fx::{FxHashSet, FxIndexMap, FxIndexSet},
stack::ensure_sufficient_stack, stack::ensure_sufficient_stack,
}; };
use rustc_hir::HirId;
use rustc_index::bit_set::BitSet; use rustc_index::bit_set::BitSet;
use rustc_middle::middle::region; use rustc_middle::middle::region;
use rustc_middle::mir::*; use rustc_middle::mir::*;
@ -690,7 +689,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
pub(crate) fn storage_live_binding( pub(crate) fn storage_live_binding(
&mut self, &mut self,
block: BasicBlock, block: BasicBlock,
var: HirId, var: LocalVarId,
span: Span, span: Span,
for_guard: ForGuard, for_guard: ForGuard,
schedule_drop: bool, schedule_drop: bool,
@ -700,7 +699,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
self.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(local_id) }); self.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(local_id) });
// Altough there is almost always scope for given variable in corner cases // Altough there is almost always scope for given variable in corner cases
// like #92893 we might get variable with no scope. // like #92893 we might get variable with no scope.
if let Some(region_scope) = self.region_scope_tree.var_scope(var.local_id) && schedule_drop{ if let Some(region_scope) = self.region_scope_tree.var_scope(var.0.local_id) && schedule_drop{
self.schedule_drop(span, region_scope, local_id, DropKind::Storage); self.schedule_drop(span, region_scope, local_id, DropKind::Storage);
} }
Place::from(local_id) Place::from(local_id)
@ -708,12 +707,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
pub(crate) fn schedule_drop_for_binding( pub(crate) fn schedule_drop_for_binding(
&mut self, &mut self,
var: HirId, var: LocalVarId,
span: Span, span: Span,
for_guard: ForGuard, for_guard: ForGuard,
) { ) {
let local_id = self.var_local_id(var, for_guard); let local_id = self.var_local_id(var, for_guard);
if let Some(region_scope) = self.region_scope_tree.var_scope(var.local_id) { if let Some(region_scope) = self.region_scope_tree.var_scope(var.0.local_id) {
self.schedule_drop(span, region_scope, local_id, DropKind::Value); self.schedule_drop(span, region_scope, local_id, DropKind::Value);
} }
} }
@ -730,7 +729,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
Mutability, Mutability,
Symbol, Symbol,
BindingMode, BindingMode,
HirId, LocalVarId,
Span, Span,
Ty<'tcx>, Ty<'tcx>,
UserTypeProjections, UserTypeProjections,
@ -917,7 +916,7 @@ fn traverse_candidate<'pat, 'tcx: 'pat, C, T, I>(
struct Binding<'tcx> { struct Binding<'tcx> {
span: Span, span: Span,
source: Place<'tcx>, source: Place<'tcx>,
var_id: HirId, var_id: LocalVarId,
binding_mode: BindingMode, binding_mode: BindingMode,
} }
@ -2184,7 +2183,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
mutability: Mutability, mutability: Mutability,
name: Symbol, name: Symbol,
mode: BindingMode, mode: BindingMode,
var_id: HirId, var_id: LocalVarId,
var_ty: Ty<'tcx>, var_ty: Ty<'tcx>,
user_ty: UserTypeProjections, user_ty: UserTypeProjections,
has_guard: ArmHasGuard, has_guard: ArmHasGuard,

View file

@ -4,11 +4,12 @@ use crate::build::scope::DropKind;
use crate::thir::constant::parse_float; use crate::thir::constant::parse_float;
use crate::thir::pattern::pat_from_hir; use crate::thir::pattern::pat_from_hir;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_data_structures::fx::FxHashMap;
use rustc_errors::ErrorGuaranteed; use rustc_errors::ErrorGuaranteed;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_hir::lang_items::LangItem; use rustc_hir::lang_items::LangItem;
use rustc_hir::{GeneratorKind, HirIdMap, Node}; use rustc_hir::{GeneratorKind, Node};
use rustc_index::vec::{Idx, IndexVec}; use rustc_index::vec::{Idx, IndexVec};
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt}; use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
use rustc_middle::hir::place::PlaceBase as HirPlaceBase; use rustc_middle::hir::place::PlaceBase as HirPlaceBase;
@ -16,7 +17,7 @@ use rustc_middle::middle::region;
use rustc_middle::mir::interpret::Allocation; use rustc_middle::mir::interpret::Allocation;
use rustc_middle::mir::interpret::{ConstValue, LitToConstError, LitToConstInput, Scalar}; use rustc_middle::mir::interpret::{ConstValue, LitToConstError, LitToConstInput, Scalar};
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::{BindingMode, Expr, ExprId, LintLevel, PatKind, Thir}; use rustc_middle::thir::{BindingMode, Expr, ExprId, LintLevel, LocalVarId, PatKind, Thir};
use rustc_middle::ty::subst::Subst; use rustc_middle::ty::subst::Subst;
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeckResults}; use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeckResults};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
@ -445,7 +446,7 @@ struct Builder<'a, 'tcx> {
/// Maps `HirId`s of variable bindings to the `Local`s created for them. /// Maps `HirId`s of variable bindings to the `Local`s created for them.
/// (A match binding can have two locals; the 2nd is for the arm's guard.) /// (A match binding can have two locals; the 2nd is for the arm's guard.)
var_indices: HirIdMap<LocalsForNode>, var_indices: FxHashMap<LocalVarId, LocalsForNode>,
local_decls: IndexVec<Local, LocalDecl<'tcx>>, local_decls: IndexVec<Local, LocalDecl<'tcx>>,
canonical_user_type_annotations: ty::CanonicalUserTypeAnnotations<'tcx>, canonical_user_type_annotations: ty::CanonicalUserTypeAnnotations<'tcx>,
upvar_mutbls: Vec<Mutability>, upvar_mutbls: Vec<Mutability>,
@ -455,11 +456,11 @@ struct Builder<'a, 'tcx> {
} }
impl<'a, 'tcx> Builder<'a, 'tcx> { impl<'a, 'tcx> Builder<'a, 'tcx> {
fn is_bound_var_in_guard(&self, id: hir::HirId) -> bool { fn is_bound_var_in_guard(&self, id: LocalVarId) -> bool {
self.guard_context.iter().any(|frame| frame.locals.iter().any(|local| local.id == id)) self.guard_context.iter().any(|frame| frame.locals.iter().any(|local| local.id == id))
} }
fn var_local_id(&self, id: hir::HirId, for_guard: ForGuard) -> Local { fn var_local_id(&self, id: LocalVarId, for_guard: ForGuard) -> Local {
self.var_indices[&id].local_id(for_guard) self.var_indices[&id].local_id(for_guard)
} }
} }
@ -543,11 +544,11 @@ enum LocalsForNode {
#[derive(Debug)] #[derive(Debug)]
struct GuardFrameLocal { struct GuardFrameLocal {
id: hir::HirId, id: LocalVarId,
} }
impl GuardFrameLocal { impl GuardFrameLocal {
fn new(id: hir::HirId, _binding_mode: BindingMode) -> Self { fn new(id: LocalVarId, _binding_mode: BindingMode) -> Self {
GuardFrameLocal { id } GuardFrameLocal { id }
} }
} }

View file

@ -903,9 +903,12 @@ impl<'tcx> Cx<'tcx> {
); );
if is_upvar { if is_upvar {
ExprKind::UpvarRef { closure_def_id: self.body_owner, var_hir_id } ExprKind::UpvarRef {
closure_def_id: self.body_owner,
var_hir_id: LocalVarId(var_hir_id),
}
} else { } else {
ExprKind::VarRef { id: var_hir_id } ExprKind::VarRef { id: LocalVarId(var_hir_id) }
} }
} }

View file

@ -19,7 +19,7 @@ use rustc_middle::mir::interpret::{get_slice_bytes, ConstValue};
use rustc_middle::mir::interpret::{ErrorHandled, LitToConstError, LitToConstInput}; use rustc_middle::mir::interpret::{ErrorHandled, LitToConstError, LitToConstInput};
use rustc_middle::mir::{self, UserTypeProjection}; use rustc_middle::mir::{self, UserTypeProjection};
use rustc_middle::mir::{BorrowKind, Field, Mutability}; use rustc_middle::mir::{BorrowKind, Field, Mutability};
use rustc_middle::thir::{Ascription, BindingMode, FieldPat, Pat, PatKind, PatRange}; use rustc_middle::thir::{Ascription, BindingMode, FieldPat, LocalVarId, Pat, PatKind, PatRange};
use rustc_middle::ty::subst::{GenericArg, SubstsRef}; use rustc_middle::ty::subst::{GenericArg, SubstsRef};
use rustc_middle::ty::CanonicalUserTypeAnnotation; use rustc_middle::ty::CanonicalUserTypeAnnotation;
use rustc_middle::ty::{self, AdtDef, ConstKind, DefIdTree, Region, Ty, TyCtxt, UserType}; use rustc_middle::ty::{self, AdtDef, ConstKind, DefIdTree, Region, Ty, TyCtxt, UserType};
@ -288,7 +288,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
mutability, mutability,
mode, mode,
name: ident.name, name: ident.name,
var: id, var: LocalVarId(id),
ty: var_ty, ty: var_ty,
subpattern: self.lower_opt_pattern(sub), subpattern: self.lower_opt_pattern(sub),
is_primary: id == pat.hir_id, is_primary: id == pat.hir_id,
@ -664,7 +664,7 @@ macro_rules! ClonePatternFoldableImpls {
} }
ClonePatternFoldableImpls! { <'tcx> ClonePatternFoldableImpls! { <'tcx>
Span, Field, Mutability, Symbol, hir::HirId, usize, ty::Const<'tcx>, Span, Field, Mutability, Symbol, LocalVarId, usize, ty::Const<'tcx>,
Region<'tcx>, Ty<'tcx>, BindingMode, AdtDef<'tcx>, Region<'tcx>, Ty<'tcx>, BindingMode, AdtDef<'tcx>,
SubstsRef<'tcx>, &'tcx GenericArg<'tcx>, UserType<'tcx>, SubstsRef<'tcx>, &'tcx GenericArg<'tcx>, UserType<'tcx>,
UserTypeProjection, CanonicalUserTypeAnnotation<'tcx> UserTypeProjection, CanonicalUserTypeAnnotation<'tcx>