diff --git a/Cargo.toml b/Cargo.toml
index 802e7733985..36457023d92 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -49,6 +49,7 @@ lazy_static = "1.0"
 serde_derive = "1.0"
 clippy-mini-macro-test = { version = "0.2", path = "mini-macro" }
 serde = "1.0"
+derive-new = "0.5"
 
 [features]
 debugging = []
diff --git a/clippy_lints/src/redundant_field_names.rs b/clippy_lints/src/redundant_field_names.rs
index 6775129f9df..a63447575ef 100644
--- a/clippy_lints/src/redundant_field_names.rs
+++ b/clippy_lints/src/redundant_field_names.rs
@@ -1,6 +1,6 @@
 use rustc::lint::*;
 use rustc::hir::*;
-use utils::{is_range_expression, match_var, span_lint_and_sugg};
+use utils::{in_macro, is_range_expression, match_var, span_lint_and_sugg};
 
 /// **What it does:** Checks for fields in struct literals where shorthands
 /// could be used.
@@ -36,10 +36,10 @@ impl LintPass for RedundantFieldNames {
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RedundantFieldNames {
     fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
-        // Do not care about range expressions.
-        // They could have redundant field name when desugared to structs.
-        // e.g. `start..end` is desugared to `Range { start: start, end: end }`
-        if is_range_expression(expr.span) {
+        // Ignore all macros including range expressions.
+        // They can have redundant field names when expanded.
+        // e.g. range expression `start..end` is desugared to `Range { start: start, end: end }`
+        if in_macro(expr.span) || is_range_expression(expr.span) {
             return;
         }
 
diff --git a/tests/ui/redundant_field_names.rs b/tests/ui/redundant_field_names.rs
index cb49283010b..98b6e16c450 100644
--- a/tests/ui/redundant_field_names.rs
+++ b/tests/ui/redundant_field_names.rs
@@ -2,6 +2,9 @@
 #![allow(unused_variables)]
 #![feature(inclusive_range, inclusive_range_syntax)]
 
+#[macro_use]
+extern crate derive_new;
+
 use std::ops::{Range, RangeFrom, RangeTo, RangeInclusive, RangeToInclusive};
 
 mod foo {
@@ -16,6 +19,11 @@ struct Person {
     foo: u8,
 }
 
+#[derive(new)]
+pub struct S {
+    v: String,
+}
+
 fn main() {
     let gender: u8 = 42;
     let age = 0;
diff --git a/tests/ui/redundant_field_names.stderr b/tests/ui/redundant_field_names.stderr
index 40315c6ffac..91db8a5f0d1 100644
--- a/tests/ui/redundant_field_names.stderr
+++ b/tests/ui/redundant_field_names.stderr
@@ -1,57 +1,57 @@
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:26:9
+  --> $DIR/redundant_field_names.rs:34:9
    |
-26 |         gender: gender,
+34 |         gender: gender,
    |         ^^^^^^^^^^^^^^ help: replace it with: `gender`
    |
    = note: `-D redundant-field-names` implied by `-D warnings`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:27:9
+  --> $DIR/redundant_field_names.rs:35:9
    |
-27 |         age: age,
+35 |         age: age,
    |         ^^^^^^^^ help: replace it with: `age`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:45:25
+  --> $DIR/redundant_field_names.rs:53:25
    |
-45 |     let _ = RangeFrom { start: start };
+53 |     let _ = RangeFrom { start: start };
    |                         ^^^^^^^^^^^^ help: replace it with: `start`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:46:23
+  --> $DIR/redundant_field_names.rs:54:23
    |
-46 |     let _ = RangeTo { end: end };
+54 |     let _ = RangeTo { end: end };
    |                       ^^^^^^^^ help: replace it with: `end`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:47:21
+  --> $DIR/redundant_field_names.rs:55:21
    |
-47 |     let _ = Range { start: start, end: end };
+55 |     let _ = Range { start: start, end: end };
    |                     ^^^^^^^^^^^^ help: replace it with: `start`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:47:35
+  --> $DIR/redundant_field_names.rs:55:35
    |
-47 |     let _ = Range { start: start, end: end };
+55 |     let _ = Range { start: start, end: end };
    |                                   ^^^^^^^^ help: replace it with: `end`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:48:30
+  --> $DIR/redundant_field_names.rs:56:30
    |
-48 |     let _ = RangeInclusive { start: start, end: end };
+56 |     let _ = RangeInclusive { start: start, end: end };
    |                              ^^^^^^^^^^^^ help: replace it with: `start`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:48:44
+  --> $DIR/redundant_field_names.rs:56:44
    |
-48 |     let _ = RangeInclusive { start: start, end: end };
+56 |     let _ = RangeInclusive { start: start, end: end };
    |                                            ^^^^^^^^ help: replace it with: `end`
 
 error: redundant field names in struct initialization
-  --> $DIR/redundant_field_names.rs:49:32
+  --> $DIR/redundant_field_names.rs:57:32
    |
-49 |     let _ = RangeToInclusive { end: end };
+57 |     let _ = RangeToInclusive { end: end };
    |                                ^^^^^^^^ help: replace it with: `end`
 
 error: aborting due to 9 previous errors