impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Lifetimes {
fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx Item) {
if let ItemKind::Fn(ref decl, _, ref generics, id) = item.node {
- check_fn_inner(cx, decl, Some(id), generics, item.span);
+ check_fn_inner(cx, decl, Some(id), generics, item.span, true);
}
}
fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx ImplItem) {
if let ImplItemKind::Method(ref sig, id) = item.node {
- if trait_ref_of_method(cx, item.hir_id).is_none() {
- check_fn_inner(cx, &sig.decl, Some(id), &item.generics, item.span);
- }
+ let report_extra_lifetimes = trait_ref_of_method(cx, item.hir_id).is_none();
+ check_fn_inner(
+ cx,
+ &sig.decl,
+ Some(id),
+ &item.generics,
+ item.span,
+ report_extra_lifetimes,
+ );
}
}
TraitMethod::Required(_) => None,
TraitMethod::Provided(id) => Some(id),
};
- check_fn_inner(cx, &sig.decl, body, &item.generics, item.span);
+ check_fn_inner(cx, &sig.decl, body, &item.generics, item.span, true);
}
}
}
body: Option<BodyId>,
generics: &'tcx Generics,
span: Span,
+ report_extra_lifetimes: bool,
) {
if in_external_macro(cx.sess(), span) || has_where_lifetimes(cx, &generics.where_clause) {
return;
(or replaced with `'_` if needed by type declaration)",
);
}
- report_extra_lifetimes(cx, decl, generics);
+ if report_extra_lifetimes {
+ self::report_extra_lifetimes(cx, decl, generics);
+ }
}
fn could_use_elision<'a, 'tcx>(
LL | | }
| |_^
-error: aborting due to 15 previous errors
+error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
+ --> $DIR/needless_lifetimes.rs:254:9
+ |
+LL | fn needless_lt<'a>(x: &'a u8) {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
+ --> $DIR/needless_lifetimes.rs:258:9
+ |
+LL | fn needless_lt<'a>(_x: &'a u8) {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 17 previous errors