impl<'a, 'tcx: 'a> Visitor<'tcx> for UnusedLabelVisitor<'a, 'tcx> {
fn visit_expr(&mut self, expr: &'tcx hir::Expr) {
match expr.node {
- hir::ExprBreak(Some(label), _) |
- hir::ExprAgain(Some(label)) => {
- self.labels.remove(&label.name.as_str());
+ hir::ExprBreak(destination, _) |
+ hir::ExprAgain(destination) => {
+ if let Some(label) = destination.ident {
+ self.labels.remove(&label.node.name.as_str());
+ }
},
hir::ExprLoop(_, Some(label), _) |
hir::ExprWhile(_, _, Some(label)) => {
match (&left.node, &right.node) {
(&ExprAddrOf(l_mut, ref le), &ExprAddrOf(r_mut, ref re)) => l_mut == r_mut && self.eq_expr(le, re),
- (&ExprAgain(li), &ExprAgain(ri)) => both(&li, &ri, |l, r| l.name.as_str() == r.name.as_str()),
+ (&ExprAgain(li), &ExprAgain(ri)) => both(&li.ident, &ri.ident, |l, r| l.node.name.as_str() == r.node.name.as_str()),
(&ExprAssign(ref ll, ref lr), &ExprAssign(ref rl, ref rr)) => self.eq_expr(ll, rl) && self.eq_expr(lr, rr),
(&ExprAssignOp(ref lo, ref ll, ref lr), &ExprAssignOp(ref ro, ref rl, ref rr)) => {
lo.node == ro.node && self.eq_expr(ll, rl) && self.eq_expr(lr, rr)
})
},
(&ExprBreak(li, ref le), &ExprBreak(ri, ref re)) => {
- both(&li, &ri, |l, r| l.name.as_str() == r.name.as_str()) && both(le, re, |l, r| self.eq_expr(l, r))
+ both(&li.ident, &ri.ident, |l, r| l.node.name.as_str() == r.node.name.as_str()) && both(le, re, |l, r| self.eq_expr(l, r))
},
(&ExprBox(ref l), &ExprBox(ref r)) => self.eq_expr(l, r),
(&ExprCall(ref l_fun, ref l_args), &ExprCall(ref r_fun, ref r_args)) => {
ExprAgain(i) => {
let c: fn(_) -> _ = ExprAgain;
c.hash(&mut self.s);
- if let Some(i) = i {
- self.hash_name(&i.name);
+ if let Some(i) = i.ident {
+ self.hash_name(&i.node.name);
}
},
ExprAssign(ref l, ref r) => {
ExprBreak(i, ref j) => {
let c: fn(_, _) -> _ = ExprBreak;
c.hash(&mut self.s);
- if let Some(i) = i {
- self.hash_name(&i.name);
+ if let Some(i) = i.ident {
+ self.hash_name(&i.node.name);
}
if let Some(ref j) = *j {
self.hash_expr(&*j);