]> git.lizzy.rs Git - rust.git/commitdiff
Rustup to *1.10.0-nightly (9c6904ca1 2016-05-18)*
authormcarton <cartonmartin+git@gmail.com>
Thu, 19 May 2016 21:14:34 +0000 (23:14 +0200)
committermcarton <cartonmartin+git@gmail.com>
Mon, 23 May 2016 14:11:19 +0000 (16:11 +0200)
17 files changed:
README.md
src/blacklisted_name.rs
src/copies.rs
src/eta_reduction.rs
src/lib.rs
src/loops.rs
src/map_clone.rs
src/methods.rs
src/misc.rs
src/overflow_check_conditional.rs
src/shadow.rs
src/swap.rs
src/unsafe_removed_from_name.rs
src/unused_label.rs
src/utils/hir.rs
src/utils/mod.rs
tests/compile-fail/used_underscore_binding.rs

index 02b7365e890189cb127b609d38d98d71d6c8422a..6843afb4ede6ed99bf13907c89a83a8bba3187e8 100644 (file)
--- a/README.md
+++ b/README.md
@@ -161,7 +161,7 @@ name
 [unused_label](https://github.com/Manishearth/rust-clippy/wiki#unused_label)                                         | warn    | unused label
 [unused_lifetimes](https://github.com/Manishearth/rust-clippy/wiki#unused_lifetimes)                                 | warn    | unused lifetimes in function definitions
 [use_debug](https://github.com/Manishearth/rust-clippy/wiki#use_debug)                                               | allow   | use `Debug`-based formatting
-[used_underscore_binding](https://github.com/Manishearth/rust-clippy/wiki#used_underscore_binding)                   | warn    | using a binding which is prefixed with an underscore
+[used_underscore_binding](https://github.com/Manishearth/rust-clippy/wiki#used_underscore_binding)                   | allow   | using a binding which is prefixed with an underscore
 [useless_format](https://github.com/Manishearth/rust-clippy/wiki#useless_format)                                     | warn    | useless use of `format!`
 [useless_transmute](https://github.com/Manishearth/rust-clippy/wiki#useless_transmute)                               | warn    | transmutes that have the same to and from types
 [useless_vec](https://github.com/Manishearth/rust-clippy/wiki#useless_vec)                                           | warn    | useless `vec!`
index b515da000ee6b22a657962b3f73fa76dc9b736e8..5cb84f62651b29d042e6a306268fc5259a97a80e 100644 (file)
@@ -35,11 +35,11 @@ fn get_lints(&self) -> LintArray {
 impl LateLintPass for BlackListedName {
     fn check_pat(&mut self, cx: &LateContext, pat: &Pat) {
         if let PatKind::Ident(_, ref ident, _) = pat.node {
-            if self.blacklist.iter().any(|s| s == &*ident.node.name.as_str()) {
+            if self.blacklist.iter().any(|s| s == &*ident.node.as_str()) {
                 span_lint(cx,
                           BLACKLISTED_NAME,
                           pat.span,
-                          &format!("use of a blacklisted/placeholder name `{}`", ident.node.name));
+                          &format!("use of a blacklisted/placeholder name `{}`", ident.node));
             }
         }
     }
index aa9f243e8c7fc383374b2812b0ba95da1fd9e3af..4344ba461dd3bcc9f5ee361daa861f0ed9c67d1d 100644 (file)
@@ -193,7 +193,7 @@ fn bindings_impl<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, pat: &Pat, map: &mut Hash
                 }
             }
             PatKind::Ident(_, ref ident, ref as_pat) => {
-                if let Entry::Vacant(v) = map.entry(ident.node.name.as_str()) {
+                if let Entry::Vacant(v) = map.entry(ident.node.as_str()) {
                     v.insert(cx.tcx.pat_ty(pat));
                 }
                 if let Some(ref as_pat) = *as_pat {
index c9a9ef85ede9c8d1ecf850e68e2c6e62770750d6..f73b6cfed2d747b07fa53c143c86800714d01c19 100644 (file)
@@ -77,7 +77,7 @@ fn check_closure(cx: &LateContext, expr: &Expr) {
                                 // If it's a proper path, it can't be a local variable
                                 return;
                             }
-                            if p.segments[0].identifier != ident.node {
+                            if p.segments[0].name != ident.node {
                                 // The two idents should be the same
                                 return;
                             }
index d3940575659e07f522e4f0e375dc7b143f938d34..888abbc92c5e87b3b05b5e4fcf90a77fc6454928 100644 (file)
@@ -411,6 +411,7 @@ pub fn plugin_registrar(reg: &mut Registry) {
         methods::OPTION_UNWRAP_USED,
         methods::RESULT_UNWRAP_USED,
         methods::WRONG_PUB_SELF_CONVENTION,
+        misc::USED_UNDERSCORE_BINDING,
         mut_mut::MUT_MUT,
         mutex_atomic::MUTEX_INTEGER,
         non_expressive_names::SIMILAR_NAMES,
@@ -505,7 +506,6 @@ pub fn plugin_registrar(reg: &mut Registry) {
         misc::MODULO_ONE,
         misc::REDUNDANT_PATTERN,
         misc::TOPLEVEL_REF_ARG,
-        misc::USED_UNDERSCORE_BINDING,
         misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
         misc_early::REDUNDANT_CLOSURE_CALL,
         misc_early::UNNEEDED_FIELD_PATTERN,
index 2384c8453037b37276998b06b6a82a87df0ac9b9..061b8efaa64d5b11c2e50fcb7b6c1487740dfefa 100644 (file)
@@ -286,7 +286,7 @@ fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
                 if let Some(lhs_constructor) = path.segments.last() {
                     if method_name.node.as_str() == "next" &&
                        match_trait_method(cx, match_expr, &paths::ITERATOR) &&
-                       lhs_constructor.identifier.name.as_str() == "Some" &&
+                       lhs_constructor.name.as_str() == "Some" &&
                        !is_iterator_used_after_while_let(cx, iter_expr) {
                         let iterator = snippet(cx, method_args[0].span, "_");
                         let loop_var = snippet(cx, pat_args[0].span, "_");
@@ -333,7 +333,7 @@ fn check_for_loop_range(cx: &LateContext, pat: &Pat, arg: &Expr, body: &Expr, ex
         if let PatKind::Ident(_, ref ident, _) = pat.node {
             let mut visitor = VarVisitor {
                 cx: cx,
-                var: ident.node.name,
+                var: ident.node,
                 indexed: HashMap::new(),
                 nonindex: false,
             };
@@ -378,9 +378,9 @@ fn check_for_loop_range(cx: &LateContext, pat: &Pat, arg: &Expr, body: &Expr, ex
                               expr.span,
                               &format!("the loop variable `{}` is used to index `{}`. Consider using `for ({}, \
                                         item) in {}.iter().enumerate(){}{}` or similar iterators",
-                                       ident.node.name,
+                                       ident.node,
                                        indexed,
-                                       ident.node.name,
+                                       ident.node,
                                        indexed,
                                        take,
                                        skip));
@@ -396,7 +396,7 @@ fn check_for_loop_range(cx: &LateContext, pat: &Pat, arg: &Expr, body: &Expr, ex
                               expr.span,
                               &format!("the loop variable `{}` is only used to index `{}`. \
                                         Consider using `for item in {}` or similar iterators",
-                                       ident.node.name,
+                                       ident.node,
                                        indexed,
                                        repl));
                 }
@@ -412,7 +412,7 @@ fn is_len_call(expr: &Expr, var: &Name) -> bool {
         method.node.as_str() == "len",
         let ExprPath(_, ref path) = len_args[0].node,
         path.segments.len() == 1,
-        &path.segments[0].identifier.name == var
+        &path.segments[0].name == var
     ], {
         return true;
     }}
@@ -613,7 +613,7 @@ fn check_for_loop_over_map_kv(cx: &LateContext, pat: &Pat, arg: &Expr, body: &Ex
 fn pat_is_wild(pat: &PatKind, body: &Expr) -> bool {
     match *pat {
         PatKind::Wild => true,
-        PatKind::Ident(_, ident, None) if ident.node.name.as_str().starts_with('_') => {
+        PatKind::Ident(_, ident, None) if ident.node.as_str().starts_with('_') => {
             let mut visitor = UsedVisitor {
                 var: ident.node,
                 used: false,
@@ -626,14 +626,14 @@ fn pat_is_wild(pat: &PatKind, body: &Expr) -> bool {
 }
 
 struct UsedVisitor {
-    var: Ident, // var to look for
+    var: ast::Name, // var to look for
     used: bool, // has the var been used otherwise?
 }
 
 impl<'a> Visitor<'a> for UsedVisitor {
     fn visit_expr(&mut self, expr: &Expr) {
         if let ExprPath(None, ref path) = expr.node {
-            if path.segments.len() == 1 && path.segments[0].identifier == self.var {
+            if path.segments.len() == 1 && path.segments[0].name == self.var {
                 self.used = true;
                 return;
             }
@@ -653,7 +653,7 @@ struct VarVisitor<'v, 't: 'v> {
 impl<'v, 't> Visitor<'v> for VarVisitor<'v, 't> {
     fn visit_expr(&mut self, expr: &'v Expr) {
         if let ExprPath(None, ref path) = expr.node {
-            if path.segments.len() == 1 && path.segments[0].identifier.name == self.var {
+            if path.segments.len() == 1 && path.segments[0].name == self.var {
                 // we are referencing our variable! now check if it's as an index
                 if_let_chain! {
                     [
@@ -667,11 +667,11 @@ fn visit_expr(&mut self, expr: &'v Expr) {
                             match def.base_def {
                                 Def::Local(..) | Def::Upvar(..) => {
                                     let extent = self.cx.tcx.region_maps.var_scope(def.base_def.var_id());
-                                    self.indexed.insert(seqvar.segments[0].identifier.name, Some(extent));
+                                    self.indexed.insert(seqvar.segments[0].name, Some(extent));
                                     return;  // no need to walk further
                                 }
                                 Def::Static(..) | Def::Const(..) => {
-                                    self.indexed.insert(seqvar.segments[0].identifier.name, None);
+                                    self.indexed.insert(seqvar.segments[0].name, None);
                                     return;  // no need to walk further
                                 }
                                 _ => (),
@@ -885,7 +885,7 @@ fn visit_decl(&mut self, decl: &'v Decl) {
         if let DeclLocal(ref local) = decl.node {
             if local.pat.id == self.var_id {
                 if let PatKind::Ident(_, ref ident, _) = local.pat.node {
-                    self.name = Some(ident.node.name);
+                    self.name = Some(ident.node);
 
                     self.state = if let Some(ref init) = local.init {
                         if is_integer_literal(init, 0) {
index d015a165457a760472f18f3fb2403a413f9f8335..4ad232759cfac5f3b6a3fa73be084a4c1b16e4bd 100644 (file)
@@ -1,5 +1,6 @@
 use rustc::lint::*;
 use rustc::hir::*;
+use syntax::ast;
 use utils::{is_adjusted, match_path, match_trait_method, match_type, paths, snippet,
             span_help_and_lint, walk_ptrs_ty, walk_ptrs_ty_depth};
 
@@ -52,7 +53,7 @@ fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
                                     if clone_call.node.as_str() == "clone" &&
                                         clone_args.len() == 1 &&
                                         match_trait_method(cx, closure_expr, &paths::CLONE_TRAIT) &&
-                                        expr_eq_ident(&clone_args[0], arg_ident)
+                                        expr_eq_name(&clone_args[0], arg_ident)
                                     {
                                         span_help_and_lint(cx, MAP_CLONE, expr.span, &format!(
                                             "you seem to be using .map() to clone the contents of an {}, consider \
@@ -82,11 +83,11 @@ fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
     }
 }
 
-fn expr_eq_ident(expr: &Expr, id: Ident) -> bool {
+fn expr_eq_name(expr: &Expr, id: ast::Name) -> bool {
     match expr.node {
         ExprPath(None, ref path) => {
             let arg_segment = [PathSegment {
-                                   identifier: id,
+                                   name: id,
                                    parameters: PathParameters::none(),
                                }];
             !path.global && path.segments[..] == arg_segment
@@ -105,18 +106,18 @@ fn get_type_name(cx: &LateContext, expr: &Expr, arg: &Expr) -> Option<&'static s
     }
 }
 
-fn get_arg_name(pat: &Pat) -> Option<Ident> {
+fn get_arg_name(pat: &Pat) -> Option<ast::Name> {
     match pat.node {
-        PatKind::Ident(_, ident, None) => Some(ident.node),
+        PatKind::Ident(_, name, None) => Some(name.node),
         PatKind::Ref(ref subpat, _) => get_arg_name(subpat),
         _ => None,
     }
 }
 
-fn only_derefs(cx: &LateContext, expr: &Expr, id: Ident) -> bool {
+fn only_derefs(cx: &LateContext, expr: &Expr, id: ast::Name) -> bool {
     match expr.node {
         ExprUnary(UnDeref, ref subexpr) if !is_adjusted(cx, subexpr) => only_derefs(cx, subexpr, id),
-        _ => expr_eq_ident(expr, id),
+        _ => expr_eq_name(expr, id),
     }
 }
 
index ecbdb62f05ed467f7a97db76dc3515a0e4234273..14bc74d467f05d3b0e83d9b63a93a617c7b4980f 100644 (file)
@@ -473,7 +473,6 @@ fn check_unwrap_or_default(cx: &LateContext, name: &str, fun: &hir::Expr, self_e
                 let path: &str = &path.segments
                                       .last()
                                       .expect("A path must have at least one segment")
-                                      .identifier
                                       .name
                                       .as_str();
 
@@ -811,7 +810,7 @@ fn lint_chars_next(cx: &LateContext, expr: &hir::Expr, chain: &hir::Expr, other:
         let hir::ExprCall(ref fun, ref arg_char) = other.node,
         arg_char.len() == 1,
         let hir::ExprPath(None, ref path) = fun.node,
-        path.segments.len() == 1 && path.segments[0].identifier.name.as_str() == "Some"
+        path.segments.len() == 1 && path.segments[0].name.as_str() == "Some"
     ], {
         let self_ty = walk_ptrs_ty(cx.tcx.expr_ty_adjusted(&args[0][0]));
 
index 25747157c0f1677c816092fa899545cb0a42b66f..3ab7823e50d2c6568eed9daa9c250f304f90cbf9 100644 (file)
@@ -8,8 +8,10 @@
 use rustc_const_eval::eval_const_expr_partial;
 use syntax::codemap::{Span, Spanned, ExpnFormat};
 use syntax::ptr::P;
-use utils::{get_item_name, match_path, snippet, get_parent_expr, span_lint};
-use utils::{span_lint_and_then, walk_ptrs_ty, is_integer_literal, implements_trait};
+use utils::{
+    get_item_name, get_parent_expr, implements_trait, is_integer_literal, match_path, snippet,
+    span_lint, span_lint_and_then, walk_ptrs_ty
+};
 
 /// **What it does:** This lint checks for function arguments and let bindings denoted as `ref`.
 ///
@@ -118,7 +120,7 @@ fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
 
 fn check_nan(cx: &LateContext, path: &Path, span: Span) {
     path.segments.last().map(|seg| {
-        if seg.identifier.name.as_str() == "NAN" {
+        if seg.name.as_str() == "NAN" {
             span_lint(cx,
                       CMP_NAN,
                       span,
@@ -350,8 +352,8 @@ fn check_pat(&mut self, cx: &LateContext, pat: &Pat) {
                           REDUNDANT_PATTERN,
                           pat.span,
                           &format!("the `{} @ _` pattern can be written as just `{}`",
-                                   ident.node.name,
-                                   ident.node.name));
+                                   ident.node,
+                                   ident.node));
             }
         }
     }
@@ -363,7 +365,8 @@ fn check_pat(&mut self, cx: &LateContext, pat: &Pat) {
 /// **Why is this bad?** A single leading underscore is usually used to indicate that a binding
 /// will not be used. Using such a binding breaks this expectation.
 ///
-/// **Known problems:** None
+/// **Known problems:** The lint does not work properly with desugaring and macro, it has been
+/// allowed in the mean time.
 ///
 /// **Example**:
 /// ```
@@ -371,7 +374,7 @@ fn check_pat(&mut self, cx: &LateContext, pat: &Pat) {
 /// let y = _x + 1; // Here we are using `_x`, even though it has a leading underscore.
 ///                 // We should rename `_x` to `x`
 /// ```
-declare_lint!(pub USED_UNDERSCORE_BINDING, Warn,
+declare_lint!(pub USED_UNDERSCORE_BINDING, Allow,
               "using a binding which is prefixed with an underscore");
 
 #[derive(Copy, Clone)]
@@ -387,32 +390,42 @@ impl LateLintPass for UsedUnderscoreBinding {
     #[cfg_attr(rustfmt, rustfmt_skip)]
     fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
         if in_attributes_expansion(cx, expr) {
-    // Don't lint things expanded by #[derive(...)], etc
+            // Don't lint things expanded by #[derive(...)], etc
             return;
         }
-        let needs_lint = match expr.node {
+        let binding = match expr.node {
             ExprPath(_, ref path) => {
-                let ident = path.segments
+                let segment = path.segments
                                 .last()
                                 .expect("path should always have at least one segment")
-                                .identifier;
-                ident.name.as_str().starts_with('_') &&
-                !ident.name.as_str().starts_with("__") &&
-                ident.name != ident.unhygienic_name &&
-                is_used(cx, expr) // not in bang macro
+                                .name;
+                if segment.as_str().starts_with('_') &&
+                   !segment.as_str().starts_with("__") &&
+                   segment != segment.unhygienize() && // not in bang macro
+                   is_used(cx, expr) {
+                    Some(segment.as_str())
+                } else {
+                    None
+                }
             }
             ExprField(_, spanned) => {
                 let name = spanned.node.as_str();
-                name.starts_with('_') && !name.starts_with("__")
+                if name.starts_with('_') && !name.starts_with("__") {
+                    Some(name)
+                } else {
+                    None
+                }
             }
-            _ => false,
+            _ => None,
         };
-        if needs_lint {
-            span_lint(cx,
-                      USED_UNDERSCORE_BINDING,
-                      expr.span,
-                      "used binding which is prefixed with an underscore. A leading underscore signals that a \
-                       binding will not be used.");
+        if let Some(binding) = binding {
+            if binding != "_result" { // FIXME: #944
+                span_lint(cx,
+                          USED_UNDERSCORE_BINDING,
+                          expr.span,
+                          &format!("used binding `{}` which is prefixed with an underscore. A leading \
+                                    underscore signals that a binding will not be used.", binding));
+            }
         }
     }
 }
@@ -431,8 +444,8 @@ fn is_used(cx: &LateContext, expr: &Expr) -> bool {
     }
 }
 
-/// Test whether an expression is in a macro expansion (e.g. something generated by #[derive(...)]
-/// or the like)
+/// Test whether an expression is in a macro expansion (e.g. something generated by
+/// `#[derive(...)`] or the like).
 fn in_attributes_expansion(cx: &LateContext, expr: &Expr) -> bool {
     cx.sess().codemap().with_expn_info(expr.span.expn_id, |info_opt| {
         info_opt.map_or(false, |info| {
index 6a8ca368fc143ab57f9005802ba262715be2e139..34921bc2c041d5974cade51e7908a1562286ef23 100644 (file)
@@ -31,7 +31,7 @@ fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
         let Expr_::ExprPath(_,ref path1) = ident1.node,
         let Expr_::ExprPath(_, ref path2) = ident2.node,
         let Expr_::ExprPath(_, ref path3) = second.node,
-        (&path1.segments[0]).identifier == (&path3.segments[0]).identifier || (&path2.segments[0]).identifier == (&path3.segments[0]).identifier,
+        &path1.segments[0] == &path3.segments[0] || &path2.segments[0] == &path3.segments[0],
         cx.tcx.expr_ty(ident1).is_integral(),
         cx.tcx.expr_ty(ident2).is_integral()
         ], {
@@ -53,7 +53,7 @@ fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
         let Expr_::ExprPath(_,ref path1) = ident1.node,
         let Expr_::ExprPath(_, ref path2) = ident2.node,
         let Expr_::ExprPath(_, ref path3) = first.node,
-        (&path1.segments[0]).identifier == (&path3.segments[0]).identifier || (&path2.segments[0]).identifier == (&path3.segments[0]).identifier,
+        &path1.segments[0] == &path3.segments[0] || &path2.segments[0] == &path3.segments[0],
         cx.tcx.expr_ty(ident1).is_integral(),
         cx.tcx.expr_ty(ident2).is_integral()
         ], {
index 4639a9439651e89bd48a6be85441b21aca058ed1..cf7de04cb6fc07b9cf08acde9ec6d77a163a3b5e 100644 (file)
@@ -66,7 +66,7 @@ fn check_fn(cx: &LateContext, decl: &FnDecl, block: &Block) {
     let mut bindings = Vec::new();
     for arg in &decl.inputs {
         if let PatKind::Ident(_, ident, _) = arg.pat.node {
-            bindings.push((ident.node.unhygienic_name, ident.span))
+            bindings.push((ident.node.unhygienize(), ident.span))
         }
     }
     check_block(cx, block, &mut bindings);
@@ -120,7 +120,7 @@ fn check_pat(cx: &LateContext, pat: &Pat, init: &Option<&Expr>, span: Span, bind
     // TODO: match more stuff / destructuring
     match pat.node {
         PatKind::Ident(_, ref ident, ref inner) => {
-            let name = ident.node.unhygienic_name;
+            let name = ident.node.unhygienize();
             if is_binding(cx, pat) {
                 let mut new_binding = true;
                 for tup in bindings.iter_mut() {
@@ -326,7 +326,7 @@ fn is_self_shadow(name: Name, expr: &Expr) -> bool {
 }
 
 fn path_eq_name(name: Name, path: &Path) -> bool {
-    !path.global && path.segments.len() == 1 && path.segments[0].identifier.unhygienic_name == name
+    !path.global && path.segments.len() == 1 && path.segments[0].name.unhygienize() == name
 }
 
 struct ContainsSelf {
@@ -335,8 +335,8 @@ struct ContainsSelf {
 }
 
 impl<'v> Visitor<'v> for ContainsSelf {
-    fn visit_ident(&mut self, _: Span, ident: Ident) {
-        if self.name == ident.unhygienic_name {
+    fn visit_name(&mut self, _: Span, name: Name) {
+        if self.name == name.unhygienize() {
             self.result = true;
         }
     }
index 724915b9dd5cc4d820b08e6d580390bea2abe608..c5572181395a44bd7aaf19b808497975d8f24af1 100644 (file)
@@ -75,7 +75,7 @@ fn check_manual_swap(cx: &LateContext, block: &Block) {
             let ExprPath(None, ref rhs2) = rhs2.node,
             rhs2.segments.len() == 1,
 
-            tmp_name.node.name.as_str() == rhs2.segments[0].identifier.name.as_str(),
+            tmp_name.node.as_str() == rhs2.segments[0].name.as_str(),
             SpanlessEq::new(cx).ignore_fn().eq_expr(tmp_init, lhs1),
             SpanlessEq::new(cx).ignore_fn().eq_expr(rhs1, lhs2)
         ], {
index 404d6d936041c637bd1ac831325e9df4acc27cbe..3de6719c546ac44263bdf76d33c120e110ecd896 100644 (file)
@@ -41,7 +41,7 @@ fn check_item(&mut self, cx: &LateContext, item: &Item) {
                         path.segments
                             .last()
                             .expect("use paths cannot be empty")
-                            .identifier.name,
+                            .name,
                         *name,
                         cx, &item.span
                         );
index f6ff3c3d4b4effcfd9be2410fe25dbb073706802..d408f16a3711e6e41778dde593c95c48e9bdfafd 100644 (file)
@@ -65,10 +65,10 @@ impl<'v> Visitor<'v> for UnusedLabelVisitor {
     fn visit_expr(&mut self, expr: &hir::Expr) {
         match expr.node {
             hir::ExprBreak(Some(label)) | hir::ExprAgain(Some(label)) => {
-                self.labels.remove(&label.node.name.as_str());
+                self.labels.remove(&label.node.as_str());
             }
             hir::ExprLoop(_, Some(label)) | hir::ExprWhile(_, _, Some(label)) => {
-                self.labels.insert(label.name.as_str(), expr.span);
+                self.labels.insert(label.as_str(), expr.span);
             }
             _ => (),
         }
index fe4c6d309520fc90536966a30f20c1cb3cce0f99..0f0a7312ee4a7a101058274a8479208ad9542ea4 100644 (file)
@@ -68,7 +68,7 @@ pub fn eq_expr(&self, left: &Expr, right: &Expr) -> bool {
 
         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.node.name.as_str() == r.node.name.as_str()),
+            (&ExprAgain(li), &ExprAgain(ri)) => both(&li, &ri, |l, r| l.node.as_str() == r.node.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)
@@ -80,7 +80,7 @@ pub fn eq_expr(&self, left: &Expr, right: &Expr) -> bool {
                     l_op == r_op.node && self.eq_expr(ll, rl) && self.eq_expr(lr, rr)
                 })
             }
-            (&ExprBreak(li), &ExprBreak(ri)) => both(&li, &ri, |l, r| l.node.name.as_str() == r.node.name.as_str()),
+            (&ExprBreak(li), &ExprBreak(ri)) => both(&li, &ri, |l, r| l.node.as_str() == r.node.as_str()),
             (&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)) => {
                 !self.ignore_fn && self.eq_expr(l_fun, r_fun) && self.eq_exprs(l_args, r_args)
@@ -95,7 +95,7 @@ pub fn eq_expr(&self, left: &Expr, right: &Expr) -> bool {
             }
             (&ExprLit(ref l), &ExprLit(ref r)) => l.node == r.node,
             (&ExprLoop(ref lb, ref ll), &ExprLoop(ref rb, ref rl)) => {
-                self.eq_block(lb, rb) && both(ll, rl, |l, r| l.name.as_str() == r.name.as_str())
+                self.eq_block(lb, rb) && both(ll, rl, |l, r| l.as_str() == r.as_str())
             }
             (&ExprMatch(ref le, ref la, ref ls), &ExprMatch(ref re, ref ra, ref rs)) => {
                 ls == rs && self.eq_expr(le, re) &&
@@ -124,7 +124,7 @@ pub fn eq_expr(&self, left: &Expr, right: &Expr) -> bool {
             (&ExprUnary(l_op, ref le), &ExprUnary(r_op, ref re)) => l_op == r_op && self.eq_expr(le, re),
             (&ExprVec(ref l), &ExprVec(ref r)) => self.eq_exprs(l, r),
             (&ExprWhile(ref lc, ref lb, ref ll), &ExprWhile(ref rc, ref rb, ref rl)) => {
-                self.eq_expr(lc, rc) && self.eq_block(lb, rb) && both(ll, rl, |l, r| l.name.as_str() == r.name.as_str())
+                self.eq_expr(lc, rc) && self.eq_block(lb, rb) && both(ll, rl, |l, r| l.as_str() == r.as_str())
             }
             _ => false,
         }
@@ -146,7 +146,7 @@ pub fn eq_pat(&self, left: &Pat, right: &Pat) -> bool {
                 self.eq_path(lp, rp) && both(la, ra, |l, r| over(l, r, |l, r| self.eq_pat(l, r)))
             }
             (&PatKind::Ident(ref lb, ref li, ref lp), &PatKind::Ident(ref rb, ref ri, ref rp)) => {
-                lb == rb && li.node.name.as_str() == ri.node.name.as_str() && both(lp, rp, |l, r| self.eq_pat(l, r))
+                lb == rb && li.node.as_str() == ri.node.as_str() && both(lp, rp, |l, r| self.eq_pat(l, r))
             }
             (&PatKind::Lit(ref l), &PatKind::Lit(ref r)) => self.eq_expr(l, r),
             (&PatKind::QPath(ref ls, ref lp), &PatKind::QPath(ref rs, ref rp)) => {
@@ -172,7 +172,7 @@ fn eq_path(&self, left: &Path, right: &Path) -> bool {
         left.global == right.global &&
         over(&left.segments,
              &right.segments,
-             |l, r| l.identifier.name.as_str() == r.identifier.name.as_str() && l.parameters == r.parameters)
+             |l, r| l.name.as_str() == r.name.as_str() && l.parameters == r.parameters)
     }
 
     fn eq_qself(&self, left: &QSelf, right: &QSelf) -> bool {
@@ -281,7 +281,7 @@ pub fn hash_expr(&mut self, e: &Expr) {
                 let c: fn(_) -> _ = ExprAgain;
                 c.hash(&mut self.s);
                 if let Some(i) = i {
-                    self.hash_name(&i.node.name);
+                    self.hash_name(&i.node);
                 }
             }
             ExprAssign(ref l, ref r) => {
@@ -313,7 +313,7 @@ pub fn hash_expr(&mut self, e: &Expr) {
                 let c: fn(_) -> _ = ExprBreak;
                 c.hash(&mut self.s);
                 if let Some(i) = i {
-                    self.hash_name(&i.node.name);
+                    self.hash_name(&i.node);
                 }
             }
             ExprBox(ref e) => {
@@ -374,7 +374,7 @@ pub fn hash_expr(&mut self, e: &Expr) {
                 c.hash(&mut self.s);
                 self.hash_block(b);
                 if let Some(i) = *i {
-                    self.hash_name(&i.name);
+                    self.hash_name(&i);
                 }
             }
             ExprMatch(ref e, ref arms, ref s) => {
@@ -468,7 +468,7 @@ pub fn hash_expr(&mut self, e: &Expr) {
                 self.hash_expr(cond);
                 self.hash_block(b);
                 if let Some(l) = l {
-                    self.hash_name(&l.name);
+                    self.hash_name(&l);
                 }
             }
         }
@@ -487,7 +487,7 @@ pub fn hash_name(&mut self, n: &Name) {
     pub fn hash_path(&mut self, p: &Path) {
         p.global.hash(&mut self.s);
         for p in &p.segments {
-            self.hash_name(&p.identifier.name);
+            self.hash_name(&p.name);
         }
     }
 
index 10bfe56e925e3218b47ebcf07a45da8a9b534393..3ff6167620afa22b927e3892303314dd435a2396 100644 (file)
@@ -200,7 +200,7 @@ pub fn match_trait_method(cx: &LateContext, expr: &Expr, path: &[&str]) -> bool
 /// match_path(path, &["std", "rt", "begin_unwind"])
 /// ```
 pub fn match_path(path: &Path, segments: &[&str]) -> bool {
-    path.segments.iter().rev().zip(segments.iter().rev()).all(|(a, b)| a.identifier.name.as_str() == *b)
+    path.segments.iter().rev().zip(segments.iter().rev()).all(|(a, b)| a.name.as_str() == *b)
 }
 
 /// Match a `Path` against a slice of segment string literals, e.g.
index 6bf4324e623756a825ee48ca3b60d6fb504f58c0..c571906c53b8ceaaaf5cc8ad2afbda1030dcd187 100644 (file)
@@ -3,15 +3,16 @@
 #![deny(clippy)]
 
 #![allow(blacklisted_name)]
+#![deny(used_underscore_binding)]
 
 /// Test that we lint if we use a binding with a single leading underscore
 fn prefix_underscore(_foo: u32) -> u32 {
-    _foo + 1 //~ ERROR used binding which is prefixed with an underscore
+    _foo + 1 //~ ERROR used binding `_foo` which is prefixed with an underscore
 }
 
 /// Test that we lint even if the use is within a macro expansion
 fn in_macro(_foo: u32) {
-    println!("{}", _foo); //~ ERROR used binding which is prefixed with an underscore
+    println!("{}", _foo); //~ ERROR used binding `_foo` which is prefixed with an underscore
 }
 
 // Struct for testing use of fields prefixed with an underscore
@@ -22,7 +23,7 @@ struct StructFieldTest {
 /// Test that we lint the use of a struct field which is prefixed with an underscore
 fn in_struct_field() {
     let mut s = StructFieldTest { _underscore_field: 0 };
-    s._underscore_field += 1; //~ Error used binding which is prefixed with an underscore
+    s._underscore_field += 1; //~ Error used binding `_underscore_field` which is prefixed with an underscore
 }
 
 /// Test that we do not lint if the underscore is not a prefix