return;
}
- if let Some(captures) = maps.tcx.typeck(local_def_id).closure_min_captures.get(&def_id) {
- for &var_hir_id in captures.keys() {
+ if let Some(upvars) = maps.tcx.upvars_mentioned(def_id) {
+ for &var_hir_id in upvars.keys() {
let var_name = maps.tcx.hir().name(var_hir_id);
maps.add_variable(Upvar(var_hir_id, var_name));
}
// breaks or continues)
self.add_live_node_for_node(expr.hir_id, ExprNode(expr.span));
- // Make a live_node for each captured variable, with the span
+ // Make a live_node for each mentioned variable, with the span
// being the location that the variable is used. This results
// in better error messages than just pointing at the closure
// construction site.
let mut call_caps = Vec::new();
let closure_def_id = self.tcx.hir().local_def_id(expr.hir_id);
- if let Some(captures) = self
- .tcx
- .typeck(closure_def_id)
- .closure_min_captures
- .get(&closure_def_id.to_def_id())
- {
- // If closure_min_captures is Some, upvars_mentioned must also be Some
- let upvars = self.tcx.upvars_mentioned(closure_def_id).unwrap();
- call_caps.extend(captures.keys().map(|var_id| {
+ if let Some(upvars) = self.tcx.upvars_mentioned(closure_def_id) {
+ call_caps.extend(upvars.keys().map(|var_id| {
let upvar = upvars[var_id];
let upvar_ln = self.add_live_node(UpvarNode(upvar.span));
CaptureInfo { ln: upvar_ln, var_hid: *var_id }
ir: &'a mut IrMaps<'tcx>,
typeck_results: &'a ty::TypeckResults<'tcx>,
param_env: ty::ParamEnv<'tcx>,
- upvars: Option<&'tcx FxIndexMap<hir::HirId, hir::Upvar>>,
closure_min_captures: Option<&'tcx RootVariableMinCaptureList<'tcx>>,
successors: IndexVec<LiveNode, Option<LiveNode>>,
rwu_table: rwu_table::RWUTable,
fn new(ir: &'a mut IrMaps<'tcx>, body_owner: LocalDefId) -> Liveness<'a, 'tcx> {
let typeck_results = ir.tcx.typeck(body_owner);
let param_env = ir.tcx.param_env(body_owner);
- let upvars = ir.tcx.upvars_mentioned(body_owner);
let closure_min_captures = typeck_results.closure_min_captures.get(&body_owner.to_def_id());
let closure_ln = ir.add_live_node(ClosureNode);
let exit_ln = ir.add_live_node(ExitNode);
ir,
typeck_results,
param_env,
- upvars,
closure_min_captures,
successors: IndexVec::from_elem_n(None, num_live_nodes),
rwu_table: rwu_table::RWUTable::new(num_live_nodes, num_vars),
acc: u32,
) -> LiveNode {
match path.res {
- Res::Local(hid) => {
- let in_upvars = self.upvars.map_or(false, |u| u.contains_key(&hid));
- let in_captures = self.closure_min_captures.map_or(false, |c| c.contains_key(&hid));
-
- match (in_upvars, in_captures) {
- (false, _) | (true, true) => self.access_var(hir_id, hid, succ, acc, path.span),
- (true, false) => {
- // This case is possible when with RFC-2229, a wild pattern
- // is used within a closure.
- // eg: `let _ = x`. The closure doesn't capture x here,
- // even though it's mentioned in the closure.
- succ
- }
- }
- }
+ Res::Local(hid) => self.access_var(hir_id, hid, succ, acc, path.span),
_ => succ,
}
}
LL | let (_, t2) = t;
| ^^ help: if this is intentional, prefix it with an underscore: `_t2`
-warning: unused variable: `t`
- --> $DIR/destructure_patterns.rs:45:9
- |
-LL | let t = (String::from("Hello"), String::from("World"));
- | ^ help: if this is intentional, prefix it with an underscore: `_t`
-
warning: unused variable: `x`
- --> $DIR/destructure_patterns.rs:91:21
+ --> $DIR/destructure_patterns.rs:88:21
|
LL | let Point { x, y } = p;
| ^ help: try ignoring the field: `x: _`
-warning: unused variable: `x`
- --> $DIR/destructure_patterns.rs:83:9
- |
-LL | let x = 0;
- | ^ help: if this is intentional, prefix it with an underscore: `_x`
-
-warning: unused variable: `tup`
- --> $DIR/destructure_patterns.rs:85:9
- |
-LL | let tup = (1, 2);
- | ^^^ help: if this is intentional, prefix it with an underscore: `_tup`
-
-warning: 8 warnings emitted
+warning: 5 warnings emitted