..
},
..,
- ) => cx.typeck_results().qpath_res(qpath, *path_hir_id).opt_def_id(),
+ ) => {
+ // Only return Fn-like DefIds, not the DefIds of statics/consts/etc that contain or
+ // deref to fn pointers, dyn Fn, impl Fn - #8850
+ if let Res::Def(DefKind::Fn | DefKind::Ctor(..) | DefKind::AssocFn, id) =
+ cx.typeck_results().qpath_res(qpath, *path_hir_id)
+ {
+ Some(id)
+ } else {
+ None
+ }
+ },
_ => None,
}
}
--- /dev/null
+fn fn_pointer_static() -> usize {
+ static FN: fn() -> usize = || 1;
+ let res = FN() + 1;
+ res
+}
+
+fn fn_pointer_const() -> usize {
+ const FN: fn() -> usize = || 1;
+ let res = FN() + 1;
+ res
+}
+
+fn deref_to_dyn_fn() -> usize {
+ struct Derefs;
+ impl std::ops::Deref for Derefs {
+ type Target = dyn Fn() -> usize;
+
+ fn deref(&self) -> &Self::Target {
+ &|| 2
+ }
+ }
+ static FN: Derefs = Derefs;
+ let res = FN() + 1;
+ res
+}
+
+fn main() {}
--- /dev/null
+error: returning the result of a `let` binding from a block
+ --> $DIR/ice-8850.rs:4:5
+ |
+LL | let res = FN() + 1;
+ | ------------------- unnecessary `let` binding
+LL | res
+ | ^^^
+ |
+ = note: `-D clippy::let-and-return` implied by `-D warnings`
+help: return the expression directly
+ |
+LL ~
+LL ~ FN() + 1
+ |
+
+error: returning the result of a `let` binding from a block
+ --> $DIR/ice-8850.rs:10:5
+ |
+LL | let res = FN() + 1;
+ | ------------------- unnecessary `let` binding
+LL | res
+ | ^^^
+ |
+help: return the expression directly
+ |
+LL ~
+LL ~ FN() + 1
+ |
+
+error: returning the result of a `let` binding from a block
+ --> $DIR/ice-8850.rs:24:5
+ |
+LL | let res = FN() + 1;
+ | ------------------- unnecessary `let` binding
+LL | res
+ | ^^^
+ |
+help: return the expression directly
+ |
+LL ~
+LL ~ FN() + 1
+ |
+
+error: aborting due to 3 previous errors
+