about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-09-04 15:01:06 +0000
committerbors <bors@rust-lang.org>2019-09-04 15:01:06 +0000
commit98a25241ccce71a6009e8ee18ad0bb12c16b95f9 (patch)
treeb23162891dc8e9c44b57ef59b246690b7023b9db
parent9d2772207ebe378fece31bfdcff4f50eff24c19d (diff)
parent9a5b9962283ed432cf98c8aff9db3104c18209a8 (diff)
downloadrust-98a25241ccce71a6009e8ee18ad0bb12c16b95f9.tar.gz
rust-98a25241ccce71a6009e8ee18ad0bb12c16b95f9.zip
Auto merge of #4487 - JohnTitor:deref-addrof-external-macro, r=flip1995
Don't check across macro boundary in `deref_addrof`

Fixes #4289

changelog: Allow `deref_addrof` in macros
-rw-r--r--clippy_lints/src/reference.rs3
-rw-r--r--tests/ui/deref_addrof_macro.rs10
2 files changed, 12 insertions, 1 deletions
diff --git a/clippy_lints/src/reference.rs b/clippy_lints/src/reference.rs
index 35e214faae8..54582c6015c 100644
--- a/clippy_lints/src/reference.rs
+++ b/clippy_lints/src/reference.rs
@@ -1,4 +1,4 @@
-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};
@@ -38,6 +38,7 @@ impl EarlyLintPass for DerefAddrOf {
         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 !in_macro(addrof_target.span);
             then {
                 let mut applicability = Applicability::MachineApplicable;
                 span_lint_and_sugg(
diff --git a/tests/ui/deref_addrof_macro.rs b/tests/ui/deref_addrof_macro.rs
new file mode 100644
index 00000000000..dcebd6c6e29
--- /dev/null
+++ b/tests/ui/deref_addrof_macro.rs
@@ -0,0 +1,10 @@
+macro_rules! m {
+    ($($x:tt),*) => { &[$(($x, stringify!(x)),)*] };
+}
+
+#[warn(clippy::deref_addrof)]
+fn f() -> [(i32, &'static str); 3] {
+    *m![1, 2, 3] // should be fine
+}
+
+fn main() {}