Move max_value handling to consts module

This commit is contained in:
Michael Wright 2019-02-01 06:32:16 +02:00
parent 488cdebd26
commit b6c3a6a09f
2 changed files with 29 additions and 20 deletions

View File

@ -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,
} }

View File

@ -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,