diff --git a/clippy_lints/src/single_call_fn.rs b/clippy_lints/src/single_call_fn.rs index d0fbedee8..55a19b813 100644 --- a/clippy_lints/src/single_call_fn.rs +++ b/clippy_lints/src/single_call_fn.rs @@ -88,14 +88,14 @@ impl<'tcx> LateLintPass<'tcx> for SingleCallFn { cx.tcx.hir().visit_all_item_likes_in_crate(&mut v); for usage in self.def_id_to_usage.values() { - let fn_span = usage.0; - if let [usage] = *usage.1 { + let single_call_fn_span = usage.0; + if let [caller_span] = *usage.1 { span_lint_and_help( cx, SINGLE_CALL_FN, - fn_span, + single_call_fn_span, "this function is only used once", - Some(usage), + Some(caller_span), "used here", ); } diff --git a/clippy_lints/src/utils/conf.rs b/clippy_lints/src/utils/conf.rs index e8c8d478f..987e2abec 100644 --- a/clippy_lints/src/utils/conf.rs +++ b/clippy_lints/src/utils/conf.rs @@ -289,7 +289,7 @@ define_Conf! { /// arithmetic-side-effects-allowed-unary = ["SomeType", "AnotherType"] /// ``` (arithmetic_side_effects_allowed_unary: rustc_data_structures::fx::FxHashSet = <_>::default()), - /// Lint: ENUM_VARIANT_NAMES, LARGE_TYPES_PASSED_BY_VALUE, TRIVIALLY_COPY_PASS_BY_REF, UNNECESSARY_WRAPS, UNUSED_SELF, UPPER_CASE_ACRONYMS, WRONG_SELF_CONVENTION, BOX_COLLECTION, REDUNDANT_ALLOCATION, RC_BUFFER, VEC_BOX, OPTION_OPTION, LINKEDLIST, RC_MUTEX, UNNECESSARY_BOX_RETURNS. + /// Lint: ENUM_VARIANT_NAMES, LARGE_TYPES_PASSED_BY_VALUE, TRIVIALLY_COPY_PASS_BY_REF, UNNECESSARY_WRAPS, UNUSED_SELF, UPPER_CASE_ACRONYMS, WRONG_SELF_CONVENTION, BOX_COLLECTION, REDUNDANT_ALLOCATION, RC_BUFFER, VEC_BOX, OPTION_OPTION, LINKEDLIST, RC_MUTEX, UNNECESSARY_BOX_RETURNS, SINGLE_CALL_FN. /// /// Suppress lints whenever the suggested change would cause breakage for other crates. (avoid_breaking_exported_api: bool = true), diff --git a/tests/ui/single_call_fn.rs b/tests/ui/single_call_fn.rs index 9806eaf3c..e7f819cc8 100644 --- a/tests/ui/single_call_fn.rs +++ b/tests/ui/single_call_fn.rs @@ -1,5 +1,5 @@ //@aux-build:proc_macros.rs -#![allow(unused)] +#![allow(clippy::redundant_closure_call, unused)] #![warn(clippy::single_call_fn)] #![no_main] @@ -9,6 +9,23 @@ extern crate proc_macros; // Do not lint since it's public pub fn f() {} +fn i() {} +fn j() {} + +fn h() { + // Linted + let a = i; + // Do not lint closures + let a = (|| { + // Not linted + a(); + // Imo, it's reasonable to lint this as the function is still only being used once. Just in + // a closure. + j(); + }); + a(); +} + fn g() { f(); } diff --git a/tests/ui/single_call_fn.stderr b/tests/ui/single_call_fn.stderr index decf561ee..9ef8c4878 100644 --- a/tests/ui/single_call_fn.stderr +++ b/tests/ui/single_call_fn.stderr @@ -1,18 +1,5 @@ error: this function is only used once - --> $DIR/single_call_fn.rs:26:1 - | -LL | fn a() {} - | ^^^^^^^^^ - | -help: used here - --> $DIR/single_call_fn.rs:29:5 - | -LL | a(); - | ^ - = note: `-D clippy::single-call-fn` implied by `-D warnings` - -error: this function is only used once - --> $DIR/single_call_fn.rs:16:1 + --> $DIR/single_call_fn.rs:33:1 | LL | / fn c() { LL | | println!("really"); @@ -22,10 +9,47 @@ LL | | } | |_^ | help: used here - --> $DIR/single_call_fn.rs:23:5 + --> $DIR/single_call_fn.rs:40:5 | LL | c(); | ^ + = note: `-D clippy::single-call-fn` implied by `-D warnings` -error: aborting due to 2 previous errors +error: this function is only used once + --> $DIR/single_call_fn.rs:12:1 + | +LL | fn i() {} + | ^^^^^^^^^ + | +help: used here + --> $DIR/single_call_fn.rs:17:13 + | +LL | let a = i; + | ^ + +error: this function is only used once + --> $DIR/single_call_fn.rs:43:1 + | +LL | fn a() {} + | ^^^^^^^^^ + | +help: used here + --> $DIR/single_call_fn.rs:46:5 + | +LL | a(); + | ^ + +error: this function is only used once + --> $DIR/single_call_fn.rs:13:1 + | +LL | fn j() {} + | ^^^^^^^^^ + | +help: used here + --> $DIR/single_call_fn.rs:24:9 + | +LL | j(); + | ^ + +error: aborting due to 4 previous errors