]> git.lizzy.rs Git - rust.git/blobdiff - clippy_lints/src/reference.rs
Auto merge of #4809 - iankronquist:patch-1, r=flip1995
[rust.git] / clippy_lints / src / reference.rs
index 2ee00a2f103470f7d92f8d926ae3ac53ad08b02f..c575ef67f2a9f5f3847b23bb72a1dcd3999a8aca 100644 (file)
@@ -1,8 +1,8 @@
-use crate::utils::{snippet_with_applicability, span_lint_and_sugg};
+use crate::utils::{in_macro, snippet_with_applicability, span_lint_and_sugg};
 use if_chain::if_chain;
-use rustc::lint::{EarlyContext, EarlyLintPass, LintArray, LintPass};
-use rustc::{declare_lint_pass, declare_tool_lint};
 use rustc_errors::Applicability;
+use rustc_lint::{EarlyContext, EarlyLintPass};
+use rustc_session::{declare_lint_pass, declare_tool_lint};
 use syntax::ast::{Expr, ExprKind, UnOp};
 
 declare_clippy_lint! {
@@ -15,7 +15,7 @@
     /// the suggested fix for `x = **&&y` is `x = *&y`, which is still incorrect.
     ///
     /// **Example:**
-    /// ```rust
+    /// ```rust,ignore
     /// let a = f(*&mut b);
     /// let c = *&d;
     /// ```
@@ -27,7 +27,7 @@
 declare_lint_pass!(DerefAddrOf => [DEREF_ADDROF]);
 
 fn without_parens(mut e: &Expr) -> &Expr {
-    while let ExprKind::Paren(ref child_e) = e.node {
+    while let ExprKind::Paren(ref child_e) = e.kind {
         e = child_e;
     }
     e
@@ -36,8 +36,9 @@ fn without_parens(mut e: &Expr) -> &Expr {
 impl EarlyLintPass for DerefAddrOf {
     fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &Expr) {
         if_chain! {
-            if let ExprKind::Unary(UnOp::Deref, ref deref_target) = e.node;
-            if let ExprKind::AddrOf(_, ref addrof_target) = without_parens(deref_target).node;
+            if let ExprKind::Unary(UnOp::Deref, ref deref_target) = e.kind;
+            if let ExprKind::AddrOf(_, _, ref addrof_target) = without_parens(deref_target).kind;
+            if !in_macro(addrof_target.span);
             then {
                 let mut applicability = Applicability::MachineApplicable;
                 span_lint_and_sugg(
@@ -64,8 +65,8 @@ fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &Expr) {
     /// **Example:**
     /// ```rust
     /// struct Point(u32, u32);
-    /// let point = Foo(30, 20);
-    /// let x = (&point).x;
+    /// let point = Point(30, 20);
+    /// let x = (&point).0;
     /// ```
     pub REF_IN_DEREF,
     complexity,
@@ -77,9 +78,9 @@ fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &Expr) {
 impl EarlyLintPass for RefInDeref {
     fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &Expr) {
         if_chain! {
-            if let ExprKind::Field(ref object, _) = e.node;
-            if let ExprKind::Paren(ref parened) = object.node;
-            if let ExprKind::AddrOf(_, ref inner) = parened.node;
+            if let ExprKind::Field(ref object, _) = e.kind;
+            if let ExprKind::Paren(ref parened) = object.kind;
+            if let ExprKind::AddrOf(_, _, ref inner) = parened.kind;
             then {
                 let mut applicability = Applicability::MachineApplicable;
                 span_lint_and_sugg(