Move max_value
handling to consts module
This commit is contained in:
parent
488cdebd26
commit
b6c3a6a09f
@ -1,6 +1,7 @@
|
|||||||
#![allow(clippy::float_cmp)]
|
#![allow(clippy::float_cmp)]
|
||||||
|
|
||||||
use crate::utils::{clip, sext, unsext};
|
use crate::utils::{clip, get_def_path, sext, unsext};
|
||||||
|
use if_chain::if_chain;
|
||||||
use rustc::hir::def::Def;
|
use rustc::hir::def::Def;
|
||||||
use rustc::hir::*;
|
use rustc::hir::*;
|
||||||
use rustc::lint::LateContext;
|
use rustc::lint::LateContext;
|
||||||
@ -234,6 +235,31 @@ pub fn expr(&mut self, e: &Expr) -> Option<Constant> {
|
|||||||
UnDeref => Some(o),
|
UnDeref => Some(o),
|
||||||
}),
|
}),
|
||||||
ExprKind::Binary(op, ref left, ref right) => self.binop(op, left, right),
|
ExprKind::Binary(op, ref left, ref right) => self.binop(op, left, right),
|
||||||
|
ExprKind::Call(ref callee, ref args) => {
|
||||||
|
// We only handle a few const functions for now
|
||||||
|
if_chain! {
|
||||||
|
if args.is_empty();
|
||||||
|
if let ExprKind::Path(qpath) = &callee.node;
|
||||||
|
let def = self.tables.qpath_def(qpath, callee.hir_id);
|
||||||
|
if let Some(def_id) = def.opt_def_id();
|
||||||
|
let def_path = get_def_path(self.tcx, def_id);
|
||||||
|
if let &["core", "num", impl_ty, "max_value"] = &def_path[..];
|
||||||
|
then {
|
||||||
|
let value = match impl_ty {
|
||||||
|
"<impl i8>" => i8::max_value() as u128,
|
||||||
|
"<impl i16>" => i16::max_value() as u128,
|
||||||
|
"<impl i32>" => i32::max_value() as u128,
|
||||||
|
"<impl i64>" => i64::max_value() as u128,
|
||||||
|
"<impl i128>" => i128::max_value() as u128,
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
Some(Constant::Int(value))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
// TODO: add other expressions
|
// TODO: add other expressions
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
use crate::reexport::*;
|
use crate::reexport::*;
|
||||||
use crate::utils::paths;
|
use crate::utils::paths;
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
clip, comparisons, differing_macro_contexts, get_def_path, higher, in_constant, in_macro, int_bits,
|
clip, comparisons, differing_macro_contexts, higher, in_constant, in_macro, int_bits, last_path_segment,
|
||||||
last_path_segment, match_def_path, match_path, multispan_sugg, opt_def_id, same_tys, sext, snippet, snippet_opt,
|
match_def_path, match_path, multispan_sugg, opt_def_id, same_tys, sext, snippet, snippet_opt,
|
||||||
snippet_with_applicability, span_help_and_lint, span_lint, span_lint_and_sugg, span_lint_and_then, unsext,
|
snippet_with_applicability, span_help_and_lint, span_lint, span_lint_and_sugg, span_lint_and_then, unsext,
|
||||||
AbsolutePathBuffer,
|
AbsolutePathBuffer,
|
||||||
};
|
};
|
||||||
@ -1018,23 +1018,6 @@ fn check_loss_of_sign(cx: &LateContext<'_, '_>, expr: &Expr, op: &Expr, cast_fro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't lint for max_value const fns
|
|
||||||
if_chain! {
|
|
||||||
if let ExprKind::Call(callee, args) = &op.node;
|
|
||||||
if args.is_empty();
|
|
||||||
if let ExprKind::Path(qpath) = &callee.node;
|
|
||||||
let def = cx.tables.qpath_def(qpath, callee.hir_id);
|
|
||||||
if let Some(def_id) = def.opt_def_id();
|
|
||||||
let def_path = get_def_path(cx.tcx, def_id);
|
|
||||||
if let &["core", "num", impl_ty, "max_value"] = &def_path[..];
|
|
||||||
then {
|
|
||||||
if let "<impl i8>" | "<impl i16>" | "<impl i32>" |
|
|
||||||
"<impl i64>" | "<impl i128>" = impl_ty {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
span_lint(
|
span_lint(
|
||||||
cx,
|
cx,
|
||||||
CAST_SIGN_LOSS,
|
CAST_SIGN_LOSS,
|
||||||
|
Loading…
Reference in New Issue
Block a user