diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 109edffcde3..0606ecb9bbc 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -233,7 +233,13 @@ declare_lint! { declare_lint! { pub SINGLE_USE_LIFETIME, Allow, - "detects single use lifetimes" + "detects lifetime parameters that are only used once" +} + +declare_lint! { + pub UNUSED_LIFETIME, + Allow, + "detects lifetime parameters that are never used" } declare_lint! { @@ -318,6 +324,7 @@ impl LintPass for HardwiredLints { UNUSED_UNSAFE, UNUSED_MUT, SINGLE_USE_LIFETIME, + UNUSED_LIFETIME, TYVAR_BEHIND_RAW_POINTER, ELIDED_LIFETIME_IN_PATH, BARE_TRAIT_OBJECT, diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index eaabc333e5d..49a88323653 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -1358,7 +1358,25 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { Some(LifetimeUseSet::Many) => { debug!("Not one use lifetime"); } - None => {} + None => { + let node_id = self.tcx.hir.as_local_node_id(*def_id).unwrap(); + if let hir::map::NodeLifetime(hir_lifetime) = self.tcx.hir.get(node_id) { + let span = hir_lifetime.span; + let id = hir_lifetime.id; + + self.tcx + .struct_span_lint_node( + lint::builtin::UNUSED_LIFETIME, + id, + span, + &format!( + "lifetime parameter `{}` never used", + hir_lifetime.name.name() + ), + ) + .emit(); + } + } } } } diff --git a/src/test/ui/single-use-lifetime/zero-uses-in-fn.rs b/src/test/ui/single-use-lifetime/zero-uses-in-fn.rs new file mode 100644 index 00000000000..b71b189833a --- /dev/null +++ b/src/test/ui/single-use-lifetime/zero-uses-in-fn.rs @@ -0,0 +1,19 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we DO warn when lifetime name is not used at all. + +#![deny(unused_lifetime)] +#![allow(dead_code)] +#![allow(unused_variables)] + +fn d<'a>() { } //~ ERROR `'a` never used + +fn main() { } diff --git a/src/test/ui/single-use-lifetime/zero-uses-in-fn.stderr b/src/test/ui/single-use-lifetime/zero-uses-in-fn.stderr new file mode 100644 index 00000000000..f1cdc6e495a --- /dev/null +++ b/src/test/ui/single-use-lifetime/zero-uses-in-fn.stderr @@ -0,0 +1,14 @@ +error: lifetime parameter `'a` never used + --> $DIR/zero-uses-in-fn.rs:17:6 + | +LL | fn d<'a>() { } //~ ERROR `'a` never used + | ^^ + | +note: lint level defined here + --> $DIR/zero-uses-in-fn.rs:13:9 + | +LL | #![deny(unused_lifetime)] + | ^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/single-use-lifetime/zero-uses-in-impl.rs b/src/test/ui/single-use-lifetime/zero-uses-in-impl.rs new file mode 100644 index 00000000000..6a09727015f --- /dev/null +++ b/src/test/ui/single-use-lifetime/zero-uses-in-impl.rs @@ -0,0 +1,21 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we DO warn when lifetime name is not used at all. + +#![deny(unused_lifetime)] +#![allow(dead_code)] +#![allow(unused_variables)] + +struct Foo { } + +impl<'a> Foo { } //~ ERROR `'a` never used + +fn main() { } diff --git a/src/test/ui/single-use-lifetime/zero-uses-in-impl.stderr b/src/test/ui/single-use-lifetime/zero-uses-in-impl.stderr new file mode 100644 index 00000000000..d2dd26e68a2 --- /dev/null +++ b/src/test/ui/single-use-lifetime/zero-uses-in-impl.stderr @@ -0,0 +1,14 @@ +error: lifetime parameter `'a` never used + --> $DIR/zero-uses-in-impl.rs:19:6 + | +LL | impl<'a> Foo { } //~ ERROR `'a` never used + | ^^ + | +note: lint level defined here + --> $DIR/zero-uses-in-impl.rs:13:9 + | +LL | #![deny(unused_lifetime)] + | ^^^^^^^^^^^^^^^ + +error: aborting due to previous error +