span,
"explicit lifetimes given in parameter types where they could be elided");
}
- report_extra_lifetimes(cx, decl, &generics);
+ report_extra_lifetimes(cx, decl, &generics, slf);
}
fn could_use_elision(cx: &LateContext, func: &FnDecl, slf: Option<&ExplicitSelf>, named_lts: &[LifetimeDef]) -> bool {
}
}
-fn report_extra_lifetimes(cx: &LateContext, func: &FnDecl, generics: &Generics) {
+fn report_extra_lifetimes(cx: &LateContext, func: &FnDecl,
+ generics: &Generics, slf: Option<&ExplicitSelf>) {
let hs = generics.lifetimes
.iter()
.map(|lt| (lt.lifetime.name, lt.lifetime.span))
.collect();
let mut checker = LifetimeChecker(hs);
+
walk_generics(&mut checker, generics);
walk_fn_decl(&mut checker, func);
+
+ if let Some(slf) = slf {
+ match slf.node {
+ SelfRegion(Some(ref lt), _, _) => checker.visit_lifetime(lt),
+ SelfExplicit(ref t, _) => walk_ty(&mut checker, t),
+ _ => {}
+ }
+ }
+
for (_, v) in checker.0 {
span_lint(cx, UNUSED_LIFETIMES, v, "this lifetime isn't used in the function definition");
}
#![feature(plugin)]
#![plugin(clippy)]
-#![deny(needless_lifetimes)]
-#![allow(dead_code, unused_lifetimes)]
+#![deny(needless_lifetimes, unused_lifetimes)]
+#![allow(dead_code)]
fn distinct_lifetimes<'a, 'b>(_x: &'a u8, _y: &'b u8, _z: u8) { }
//~^ERROR explicit lifetimes given