summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack M. Davis <code@zackmdavis.net>2019-06-13 23:16:47 -0700
committerZack M. Davis <code@zackmdavis.net>2019-06-14 00:07:27 -0700
commit17653dd3da53c2b1114dcb36b85c7d6512c6cc5f (patch)
tree905517b62d8fdc0818fb5c413d4ea965502076c9
parentcdd743755adef8eb27410a9f4e480d3cf74abeaf (diff)
downloadrust-single_derive.tar.gz
in which we decline to lint single-use lifetimes in `derive`d implssingle_derive
Resolves #53738.
-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 edd5cb4541a..1d88f254972 100644
--- a/src/librustc/middle/resolve_lifetime.rs
+++ b/src/librustc/middle/resolve_lifetime.rs
@@ -1591,6 +1591,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() { }