Skip to content

Commit ed1bbbb

Browse files
committed
rustc: remove Res::Upvar.
1 parent 340b91e commit ed1bbbb

File tree

12 files changed

+61
-84
lines changed

12 files changed

+61
-84
lines changed

src/librustc/hir/def.rs

-4
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ pub enum Res<Id = hir::HirId> {
139139
// Value namespace
140140
SelfCtor(DefId /* impl */), // `DefId` refers to the impl
141141
Local(Id),
142-
Upvar(Id),
143142

144143
// Macro namespace
145144
NonMacroAttr(NonMacroAttrKind), // e.g., `#[inline]` or `#[rustfmt::skip]`
@@ -345,7 +344,6 @@ impl<Id> Res<Id> {
345344
Res::Def(_, id) => Some(id),
346345

347346
Res::Local(..) |
348-
Res::Upvar(..) |
349347
Res::PrimTy(..) |
350348
Res::SelfTy(..) |
351349
Res::SelfCtor(..) |
@@ -372,7 +370,6 @@ impl<Id> Res<Id> {
372370
Res::SelfCtor(..) => "self constructor",
373371
Res::PrimTy(..) => "builtin type",
374372
Res::Local(..) => "local variable",
375-
Res::Upvar(..) => "closure capture",
376373
Res::SelfTy(..) => "self type",
377374
Res::ToolMod => "tool module",
378375
Res::NonMacroAttr(attr_kind) => attr_kind.descr(),
@@ -395,7 +392,6 @@ impl<Id> Res<Id> {
395392
Res::SelfCtor(id) => Res::SelfCtor(id),
396393
Res::PrimTy(id) => Res::PrimTy(id),
397394
Res::Local(id) => Res::Local(map(id)),
398-
Res::Upvar(id) => Res::Upvar(map(id)),
399395
Res::SelfTy(a, b) => Res::SelfTy(a, b),
400396
Res::ToolMod => Res::ToolMod,
401397
Res::NonMacroAttr(attr_kind) => Res::NonMacroAttr(attr_kind),

src/librustc/hir/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,6 @@ impl Expr {
14091409
ExprKind::Path(QPath::Resolved(_, ref path)) => {
14101410
match path.res {
14111411
Res::Local(..)
1412-
| Res::Upvar(..)
14131412
| Res::Def(DefKind::Static, _)
14141413
| Res::Err => true,
14151414
_ => false,

src/librustc/middle/dead.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
7878
}
7979
_ if self.in_pat => {},
8080
Res::PrimTy(..) | Res::SelfTy(..) | Res::SelfCtor(..) |
81-
Res::Local(..) | Res::Upvar(..) => {}
81+
Res::Local(..) => {}
8282
Res::Def(DefKind::Ctor(CtorOf::Variant, ..), ctor_def_id) => {
8383
let variant_id = self.tcx.parent(ctor_def_id).unwrap();
8484
let enum_id = self.tcx.parent(variant_id).unwrap();

src/librustc/middle/expr_use_visitor.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -968,14 +968,9 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
968968
var_id: hir::HirId)
969969
-> mc::McResult<mc::cmt_<'tcx>> {
970970
// Create the cmt for the variable being borrowed, from the
971-
// caller's perspective
972-
let res = if self.mc.upvars.map_or(false, |upvars| upvars.contains_key(&var_id)) {
973-
Res::Upvar(var_id)
974-
} else {
975-
Res::Local(var_id)
976-
};
971+
// perspective of the creator (parent) of the closure.
977972
let var_ty = self.mc.node_ty(var_id)?;
978-
self.mc.cat_res(closure_hir_id, closure_span, var_ty, res)
973+
self.mc.cat_res(closure_hir_id, closure_span, var_ty, Res::Local(var_id))
979974
}
980975
}
981976

src/librustc/middle/liveness.rs

+22-11
Original file line numberDiff line numberDiff line change
@@ -474,8 +474,11 @@ fn visit_expr<'a, 'tcx>(ir: &mut IrMaps<'a, 'tcx>, expr: &'tcx Expr) {
474474
// live nodes required for uses or definitions of variables:
475475
hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) => {
476476
debug!("expr {}: path that leads to {:?}", expr.hir_id, path.res);
477-
if let Res::Local(..) = path.res {
478-
ir.add_live_node_for_node(expr.hir_id, ExprNode(expr.span));
477+
if let Res::Local(var_hir_id) = path.res {
478+
let upvars = ir.tcx.upvars(ir.body_owner);
479+
if !upvars.map_or(false, |upvars| upvars.contains_key(&var_hir_id)) {
480+
ir.add_live_node_for_node(expr.hir_id, ExprNode(expr.span));
481+
}
479482
}
480483
intravisit::walk_expr(ir, expr);
481484
}
@@ -1338,8 +1341,13 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
13381341
-> LiveNode {
13391342
match path.res {
13401343
Res::Local(hid) => {
1341-
let nid = self.ir.tcx.hir().hir_to_node_id(hid);
1342-
self.access_var(hir_id, nid, succ, acc, path.span)
1344+
let upvars = self.ir.tcx.upvars(self.ir.body_owner);
1345+
if !upvars.map_or(false, |upvars| upvars.contains_key(&hid)) {
1346+
let nid = self.ir.tcx.hir().hir_to_node_id(hid);
1347+
self.access_var(hir_id, nid, succ, acc, path.span)
1348+
} else {
1349+
succ
1350+
}
13431351
}
13441352
_ => succ
13451353
}
@@ -1531,13 +1539,16 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
15311539
match expr.node {
15321540
hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) => {
15331541
if let Res::Local(var_hid) = path.res {
1534-
// Assignment to an immutable variable or argument: only legal
1535-
// if there is no later assignment. If this local is actually
1536-
// mutable, then check for a reassignment to flag the mutability
1537-
// as being used.
1538-
let ln = self.live_node(expr.hir_id, expr.span);
1539-
let var = self.variable(var_hid, expr.span);
1540-
self.warn_about_dead_assign(expr.span, expr.hir_id, ln, var);
1542+
let upvars = self.ir.tcx.upvars(self.ir.body_owner);
1543+
if !upvars.map_or(false, |upvars| upvars.contains_key(&var_hid)) {
1544+
// Assignment to an immutable variable or argument: only legal
1545+
// if there is no later assignment. If this local is actually
1546+
// mutable, then check for a reassignment to flag the mutability
1547+
// as being used.
1548+
let ln = self.live_node(expr.hir_id, expr.span);
1549+
let var = self.variable(var_hid, expr.span);
1550+
self.warn_about_dead_assign(expr.span, expr.hir_id, ln, var);
1551+
}
15411552
}
15421553
}
15431554
_ => {

src/librustc/middle/mem_categorization.rs

+12-15
Original file line numberDiff line numberDiff line change
@@ -746,23 +746,20 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
746746
})
747747
}
748748

749-
Res::Upvar(var_id) => {
750-
assert!(self.upvars.map_or(false, |upvars| upvars.contains_key(&var_id)));
751-
let var_nid = self.tcx.hir().hir_to_node_id(var_id);
752-
self.cat_upvar(hir_id, span, var_nid)
753-
}
754-
755749
Res::Local(var_id) => {
756-
assert!(!self.upvars.map_or(false, |upvars| upvars.contains_key(&var_id)));
757750
let var_nid = self.tcx.hir().hir_to_node_id(var_id);
758-
Ok(cmt_ {
759-
hir_id,
760-
span,
761-
cat: Categorization::Local(var_id),
762-
mutbl: MutabilityCategory::from_local(self.tcx, self.tables, var_nid),
763-
ty: expr_ty,
764-
note: NoteNone
765-
})
751+
if self.upvars.map_or(false, |upvars| upvars.contains_key(&var_id)) {
752+
self.cat_upvar(hir_id, span, var_nid)
753+
} else {
754+
Ok(cmt_ {
755+
hir_id,
756+
span,
757+
cat: Categorization::Local(var_id),
758+
mutbl: MutabilityCategory::from_local(self.tcx, self.tables, var_nid),
759+
ty: expr_ty,
760+
note: NoteNone
761+
})
762+
}
766763
}
767764

768765
def => span_bug!(span, "unexpected definition in memory categorization: {:?}", def)

src/librustc/middle/reachable.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ReachableContext<'a, 'tcx> {
104104
};
105105

106106
match res {
107-
Some(Res::Local(hir_id)) | Some(Res::Upvar(hir_id, ..)) => {
107+
Some(Res::Local(hir_id)) => {
108108
self.reachable_symbols.insert(hir_id);
109109
}
110110
Some(res) => {

src/librustc_mir/hair/cx/expr.rs

+1-12
Original file line numberDiff line numberDiff line change
@@ -960,18 +960,7 @@ fn convert_path_expr<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
960960

961961
Res::Def(DefKind::Static, id) => ExprKind::StaticRef { id },
962962

963-
Res::Local(var_hir_id) => {
964-
assert!(!cx.tables().upvar_list.get(&cx.body_owner)
965-
.map_or(false, |upvars| upvars.contains_key(&var_hir_id)));
966-
967-
convert_var(cx, expr, var_hir_id)
968-
}
969-
Res::Upvar(var_hir_id) => {
970-
assert!(cx.tables().upvar_list.get(&cx.body_owner)
971-
.map_or(false, |upvars| upvars.contains_key(&var_hir_id)));
972-
973-
convert_var(cx, expr, var_hir_id)
974-
}
963+
Res::Local(var_hir_id) => convert_var(cx, expr, var_hir_id),
975964

976965
_ => span_bug!(expr.span, "res `{:?}` not yet implemented", res),
977966
}

src/librustc_resolve/lib.rs

+14-21
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,6 @@ impl<'a> PathSource<'a> {
612612
| Res::Def(DefKind::Const, _)
613613
| Res::Def(DefKind::Static, _)
614614
| Res::Local(..)
615-
| Res::Upvar(..)
616615
| Res::Def(DefKind::Fn, _)
617616
| Res::Def(DefKind::Method, _)
618617
| Res::Def(DefKind::AssocConst, _)
@@ -2204,7 +2203,7 @@ impl<'a> Resolver<'a> {
22042203
if let Some(res) = self.ribs[ns][i].bindings.get(&ident).cloned() {
22052204
// The ident resolves to a type parameter or local variable.
22062205
return Some(LexicalScopeBinding::Res(
2207-
self.adjust_local_res(ns, i, res, record_used, path_span)
2206+
self.validate_res_from_ribs(ns, i, res, record_used, path_span),
22082207
));
22092208
}
22102209

@@ -4006,14 +4005,16 @@ impl<'a> Resolver<'a> {
40064005
diag);
40074006
}
40084007

4009-
// Resolve a local definition, potentially adjusting for closures.
4010-
fn adjust_local_res(&mut self,
4011-
ns: Namespace,
4012-
rib_index: usize,
4013-
mut res: Res,
4014-
record_used: bool,
4015-
span: Span) -> Res {
4016-
debug!("adjust_local_res");
4008+
// Validate a local resolution (from ribs), potentially recording closure upvars.
4009+
fn validate_res_from_ribs(
4010+
&mut self,
4011+
ns: Namespace,
4012+
rib_index: usize,
4013+
res: Res,
4014+
record_used: bool,
4015+
span: Span,
4016+
) -> Res {
4017+
debug!("validate_res_from_ribs({:?})", res);
40174018
let ribs = &self.ribs[ns][rib_index + 1..];
40184019

40194020
// An invalid forward use of a type parameter from a previous default.
@@ -4035,9 +4036,6 @@ impl<'a> Resolver<'a> {
40354036
}
40364037

40374038
match res {
4038-
Res::Upvar(..) => {
4039-
span_bug!(span, "unexpected {:?} in bindings", res)
4040-
}
40414039
Res::Local(var_id) => {
40424040
use ResolutionError::*;
40434041
let mut res_err = None;
@@ -4049,14 +4047,9 @@ impl<'a> Resolver<'a> {
40494047
// Nothing to do. Continue.
40504048
}
40514049
ClosureRibKind(function_id) => {
4052-
res = Res::Upvar(var_id);
4053-
match self.upvars.entry(function_id).or_default().entry(var_id) {
4054-
indexmap::map::Entry::Occupied(_) => continue,
4055-
indexmap::map::Entry::Vacant(entry) => {
4056-
if record_used {
4057-
entry.insert(Upvar { span });
4058-
}
4059-
}
4050+
if record_used {
4051+
self.upvars.entry(function_id).or_default()
4052+
.entry(var_id).or_insert(Upvar { span });
40604053
}
40614054
}
40624055
ItemRibKind | FnItemRibKind | AssocItemRibKind => {

src/librustc_save_analysis/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
702702
let span = self.span_from_span(span);
703703

704704
match res {
705-
Res::Upvar(id, ..) | Res::Local(id) => {
705+
Res::Local(id) => {
706706
Some(Ref {
707707
kind: RefKind::Variable,
708708
span,

src/librustc_typeck/check/callee.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
350350

351351
let def_span = match def {
352352
Res::Err => None,
353-
Res::Local(id) | Res::Upvar(id, ..) => {
353+
Res::Local(id) => {
354354
Some(self.tcx.hir().span_by_hir_id(id))
355355
},
356356
_ => def

src/librustc_typeck/check/mod.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -5264,7 +5264,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
52645264
Err(ErrorReported) => return (tcx.types.err, res),
52655265
};
52665266
let path_segs = match res {
5267-
Res::Local(_) | Res::Upvar(..) => Vec::new(),
5267+
Res::Local(_) => vec![],
52685268
Res::Def(kind, def_id) =>
52695269
AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id),
52705270
_ => bug!("instantiate_value_path on {:?}", res),
@@ -5325,14 +5325,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
53255325
}
53265326
}));
53275327

5328-
match res {
5329-
Res::Local(hid) | Res::Upvar(hid, ..) => {
5330-
let ty = self.local_ty(span, hid).decl_ty;
5331-
let ty = self.normalize_associated_types_in(span, &ty);
5332-
self.write_ty(hir_id, ty);
5333-
return (ty, res);
5334-
}
5335-
_ => {}
5328+
if let Res::Local(hid) = res {
5329+
let ty = self.local_ty(span, hid).decl_ty;
5330+
let ty = self.normalize_associated_types_in(span, &ty);
5331+
self.write_ty(hir_id, ty);
5332+
return (ty, res);
53365333
}
53375334

53385335
if generics_has_err {

0 commit comments

Comments
 (0)