only run flop lints on inherent method calls
This commit is contained in:
parent
4f3180adac
commit
708ef7955d
@ -2,7 +2,8 @@
|
|||||||
use clippy_utils::consts::{constant, constant_simple, Constant};
|
use clippy_utils::consts::{constant, constant_simple, Constant};
|
||||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||||
use clippy_utils::{
|
use clippy_utils::{
|
||||||
eq_expr_value, get_parent_expr, higher, in_constant, is_no_std_crate, numeric_literal, peel_blocks, sugg,
|
eq_expr_value, get_parent_expr, higher, in_constant, is_inherent_method_call, is_no_std_crate, numeric_literal,
|
||||||
|
peel_blocks, sugg,
|
||||||
};
|
};
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::{BinOpKind, Expr, ExprKind, PathSegment, UnOp};
|
use rustc_hir::{BinOpKind, Expr, ExprKind, PathSegment, UnOp};
|
||||||
@ -759,7 +760,7 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
|||||||
if let ExprKind::MethodCall(path, receiver, args, _) = &expr.kind {
|
if let ExprKind::MethodCall(path, receiver, args, _) = &expr.kind {
|
||||||
let recv_ty = cx.typeck_results().expr_ty(receiver);
|
let recv_ty = cx.typeck_results().expr_ty(receiver);
|
||||||
|
|
||||||
if recv_ty.is_floating_point() && !is_no_std_crate(cx) {
|
if recv_ty.is_floating_point() && !is_no_std_crate(cx) && is_inherent_method_call(cx, expr) {
|
||||||
match path.ident.name.as_str() {
|
match path.ident.name.as_str() {
|
||||||
"ln" => check_ln1p(cx, expr, receiver),
|
"ln" => check_ln1p(cx, expr, receiver),
|
||||||
"log" => check_log_base(cx, expr, receiver, args),
|
"log" => check_log_base(cx, expr, receiver, args),
|
||||||
|
@ -321,6 +321,15 @@ pub fn match_trait_method(cx: &LateContext<'_>, expr: &Expr<'_>, path: &[&str])
|
|||||||
.map_or(false, |trt_id| match_def_path(cx, trt_id, path))
|
.map_or(false, |trt_id| match_def_path(cx, trt_id, path))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks if the given method call expression calls an inherent method.
|
||||||
|
pub fn is_inherent_method_call(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||||
|
if let Some(method_id) = cx.typeck_results().type_dependent_def_id(expr.hir_id) {
|
||||||
|
cx.tcx.trait_of_item(method_id).is_none()
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks if a method is defined in an impl of a diagnostic item
|
/// Checks if a method is defined in an impl of a diagnostic item
|
||||||
pub fn is_diag_item_method(cx: &LateContext<'_>, def_id: DefId, diag_item: Symbol) -> bool {
|
pub fn is_diag_item_method(cx: &LateContext<'_>, def_id: DefId, diag_item: Symbol) -> bool {
|
||||||
if let Some(impl_did) = cx.tcx.impl_of_method(def_id) {
|
if let Some(impl_did) = cx.tcx.impl_of_method(def_id) {
|
||||||
|
@ -55,4 +55,19 @@ fn check_ln1p() {
|
|||||||
let _ = (1.0 + x - 2.0).ln();
|
let _ = (1.0 + x - 2.0).ln();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn issue12881() {
|
||||||
|
pub trait MyLog {
|
||||||
|
fn log(&self) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyLog for f32 {
|
||||||
|
fn log(&self) -> Self {
|
||||||
|
4.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = 2.0;
|
||||||
|
x.log();
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -55,4 +55,19 @@ fn check_ln1p() {
|
|||||||
let _ = (1.0 + x - 2.0).ln();
|
let _ = (1.0 + x - 2.0).ln();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn issue12881() {
|
||||||
|
pub trait MyLog {
|
||||||
|
fn log(&self) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyLog for f32 {
|
||||||
|
fn log(&self) -> Self {
|
||||||
|
4.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = 2.0;
|
||||||
|
x.log();
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user