Use BinOpKind instead of BinOp for function args where possible.
Because it's nice to avoid passing in unnecessary data.
This commit is contained in:
parent
076cccd412
commit
ac8ccf09b4
7 changed files with 77 additions and 78 deletions
|
|
@ -10,7 +10,7 @@ use rustc_ast::{LitKind, RangeLimits};
|
|||
use rustc_data_structures::packed::Pu128;
|
||||
use rustc_data_structures::unhash::UnindexMap;
|
||||
use rustc_errors::{Applicability, Diag};
|
||||
use rustc_hir::{BinOp, Block, Body, Expr, ExprKind, UnOp};
|
||||
use rustc_hir::{BinOpKind, Block, Body, Expr, ExprKind, UnOp};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_session::declare_lint_pass;
|
||||
use rustc_span::source_map::Spanned;
|
||||
|
|
@ -97,7 +97,7 @@ enum LengthComparison {
|
|||
///
|
||||
/// E.g. for `v.len() > 5` this returns `Some((LengthComparison::IntLessThanLength, 5, v.len()))`
|
||||
fn len_comparison<'hir>(
|
||||
bin_op: BinOp,
|
||||
bin_op: BinOpKind,
|
||||
left: &'hir Expr<'hir>,
|
||||
right: &'hir Expr<'hir>,
|
||||
) -> Option<(LengthComparison, usize, &'hir Expr<'hir>)> {
|
||||
|
|
@ -112,7 +112,7 @@ fn len_comparison<'hir>(
|
|||
|
||||
// normalize comparison, `v.len() > 4` becomes `4 < v.len()`
|
||||
// this simplifies the logic a bit
|
||||
let (op, left, right) = normalize_comparison(bin_op.node, left, right)?;
|
||||
let (op, left, right) = normalize_comparison(bin_op, left, right)?;
|
||||
match (op, left.kind, right.kind) {
|
||||
(Rel::Lt, int_lit_pat!(left), _) => Some((LengthComparison::IntLessThanLength, left as usize, right)),
|
||||
(Rel::Lt, _, int_lit_pat!(right)) => Some((LengthComparison::LengthLessThanInt, right as usize, left)),
|
||||
|
|
@ -138,7 +138,7 @@ fn assert_len_expr<'hir>(
|
|||
&& let ExprKind::Unary(UnOp::Not, condition) = &cond.kind
|
||||
&& let ExprKind::Binary(bin_op, left, right) = &condition.kind
|
||||
|
||||
&& let Some((cmp, asserted_len, slice_len)) = len_comparison(*bin_op, left, right)
|
||||
&& let Some((cmp, asserted_len, slice_len)) = len_comparison(bin_op.node, left, right)
|
||||
&& let ExprKind::MethodCall(method, recv, [], _) = &slice_len.kind
|
||||
&& cx.typeck_results().expr_ty_adjusted(recv).peel_refs().is_slice()
|
||||
&& method.ident.name == sym::len
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ use rustc_apfloat::ieee::{Half, Quad};
|
|||
use rustc_ast::ast::{self, LitFloatType, LitKind};
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::{
|
||||
BinOp, BinOpKind, Block, ConstBlock, Expr, ExprKind, HirId, Item, ItemKind, Node, PatExpr, PatExprKind, QPath, UnOp,
|
||||
BinOpKind, Block, ConstBlock, Expr, ExprKind, HirId, Item, ItemKind, Node, PatExpr, PatExprKind, QPath, UnOp,
|
||||
};
|
||||
use rustc_lexer::tokenize;
|
||||
use rustc_lint::LateContext;
|
||||
|
|
@ -506,7 +506,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
UnOp::Deref => Some(if let Constant::Ref(r) = o { *r } else { o }),
|
||||
}),
|
||||
ExprKind::If(cond, then, ref otherwise) => self.ifthenelse(cond, then, *otherwise),
|
||||
ExprKind::Binary(op, left, right) => self.binop(op, left, right),
|
||||
ExprKind::Binary(op, left, right) => self.binop(op.node, left, right),
|
||||
ExprKind::Call(callee, []) => {
|
||||
// We only handle a few const functions for now.
|
||||
if let ExprKind::Path(qpath) = &callee.kind
|
||||
|
|
@ -744,7 +744,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn binop(&self, op: BinOp, left: &Expr<'_>, right: &Expr<'_>) -> Option<Constant<'tcx>> {
|
||||
fn binop(&self, op: BinOpKind, left: &Expr<'_>, right: &Expr<'_>) -> Option<Constant<'tcx>> {
|
||||
let l = self.expr(left)?;
|
||||
let r = self.expr(right);
|
||||
match (l, r) {
|
||||
|
|
@ -757,7 +757,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
|
||||
// Using / or %, where the left-hand argument is the smallest integer of a signed integer type and
|
||||
// the right-hand argument is -1 always panics, even with overflow-checks disabled
|
||||
if let BinOpKind::Div | BinOpKind::Rem = op.node
|
||||
if let BinOpKind::Div | BinOpKind::Rem = op
|
||||
&& l == ty_min_value
|
||||
&& r == -1
|
||||
{
|
||||
|
|
@ -765,7 +765,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
}
|
||||
|
||||
let zext = |n: i128| Constant::Int(unsext(self.tcx, n, ity));
|
||||
match op.node {
|
||||
match op {
|
||||
// When +, * or binary - create a value greater than the maximum value, or less than
|
||||
// the minimum value that can be stored, it panics.
|
||||
BinOpKind::Add => l.checked_add(r).and_then(|n| ity.ensure_fits(n)).map(zext),
|
||||
|
|
@ -792,7 +792,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
ty::Uint(ity) => {
|
||||
let bits = ity.bits();
|
||||
|
||||
match op.node {
|
||||
match op {
|
||||
BinOpKind::Add => l.checked_add(r).and_then(|n| ity.ensure_fits(n)).map(Constant::Int),
|
||||
BinOpKind::Sub => l.checked_sub(r).and_then(|n| ity.ensure_fits(n)).map(Constant::Int),
|
||||
BinOpKind::Mul => l.checked_mul(r).and_then(|n| ity.ensure_fits(n)).map(Constant::Int),
|
||||
|
|
@ -815,7 +815,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
_ => None,
|
||||
},
|
||||
// FIXME(f16_f128): add these types when binary operations are available on all platforms
|
||||
(Constant::F32(l), Some(Constant::F32(r))) => match op.node {
|
||||
(Constant::F32(l), Some(Constant::F32(r))) => match op {
|
||||
BinOpKind::Add => Some(Constant::F32(l + r)),
|
||||
BinOpKind::Sub => Some(Constant::F32(l - r)),
|
||||
BinOpKind::Mul => Some(Constant::F32(l * r)),
|
||||
|
|
@ -829,7 +829,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
BinOpKind::Gt => Some(Constant::Bool(l > r)),
|
||||
_ => None,
|
||||
},
|
||||
(Constant::F64(l), Some(Constant::F64(r))) => match op.node {
|
||||
(Constant::F64(l), Some(Constant::F64(r))) => match op {
|
||||
BinOpKind::Add => Some(Constant::F64(l + r)),
|
||||
BinOpKind::Sub => Some(Constant::F64(l - r)),
|
||||
BinOpKind::Mul => Some(Constant::F64(l * r)),
|
||||
|
|
@ -843,7 +843,7 @@ impl<'tcx> ConstEvalCtxt<'tcx> {
|
|||
BinOpKind::Gt => Some(Constant::Bool(l > r)),
|
||||
_ => None,
|
||||
},
|
||||
(l, r) => match (op.node, l, r) {
|
||||
(l, r) => match (op, l, r) {
|
||||
(BinOpKind::And, Constant::Bool(false), _) => Some(Constant::Bool(false)),
|
||||
(BinOpKind::Or, Constant::Bool(true), _) => Some(Constant::Bool(true)),
|
||||
(BinOpKind::And, Constant::Bool(true), Some(r)) | (BinOpKind::Or, Constant::Bool(false), Some(r)) => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue