about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-06-15 17:45:04 +0200
committerGitHub <noreply@github.com>2019-06-15 17:45:04 +0200
commiteb188f1317feddbf4227d53a5f31fadff3852f03 (patch)
treec4c793e3641c4e5de63fbbed658f68048c790e9b
parentbe09427b116098d9dec63694e51cbddac7f958e5 (diff)
parent17653dd3da53c2b1114dcb36b85c7d6512c6cc5f (diff)
downloadrust-eb188f1317feddbf4227d53a5f31fadff3852f03.tar.gz
rust-eb188f1317feddbf4227d53a5f31fadff3852f03.zip
Rollup merge of #61824 - rust-lang:single_derive, r=eddyb
in which we decline to lint single-use lifetimes in `derive`d impls

Resolves #53738.

r? @eddyb
-rw-r--r--src/librustc/middle/resolve_lifetime.rs11
-rw-r--r--src/test/ui/single-use-lifetime/one-use-in-struct.rs7
2 files changed, 18 insertions, 0 deletions
diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs
index 8bc3158bd3c..48d2a477a9a 100644
--- a/src/librustc/middle/resolve_lifetime.rs
+++ b/src/librustc/middle/resolve_lifetime.rs
@@ -1586,6 +1586,17 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
                             continue;
                         }
 
+                        if let Some(parent_def_id) = self.tcx.parent(def_id) {
+                            if let Some(parent_hir_id) = self.tcx.hir()
+                                .as_local_hir_id(parent_def_id) {
+                                    // lifetimes in `derive` expansions don't count (Issue #53738)
+                                    if self.tcx.hir().attrs_by_hir_id(parent_hir_id).iter()
+                                        .any(|attr| attr.check_name(sym::automatically_derived)) {
+                                            continue;
+                                        }
+                                }
+                        }
+
                         let mut err = self.tcx.struct_span_lint_hir(
                             lint::builtin::SINGLE_USE_LIFETIMES,
                             id,
diff --git a/src/test/ui/single-use-lifetime/one-use-in-struct.rs b/src/test/ui/single-use-lifetime/one-use-in-struct.rs
index e0328c9d94a..6c4d2a4a7ad 100644
--- a/src/test/ui/single-use-lifetime/one-use-in-struct.rs
+++ b/src/test/ui/single-use-lifetime/one-use-in-struct.rs
@@ -18,4 +18,11 @@ enum Bar<'f> {
 
 trait Baz<'f> { }
 
+// `Derive`d impls shouldn't trigger a warning, either (Issue #53738).
+
+#[derive(Debug)]
+struct Quux<'a> {
+    priors: &'a u32,
+}
+
 fn main() { }