Auto merge of #12368 - vohoanglong0107:unnecessary-min, r=Alexendoo
Unnecessary call to min/max method Continuation of https://github.com/rust-lang/rust-clippy/pull/12061 Fix https://github.com/rust-lang/rust-clippy/issues/11901 and https://github.com/rust-lang/rust-clippy/issues/11924 This implementation only deal with literal int, like `i32::MAX`, `-6_i32`, `0` changelog: added lint [`unnecessary_min_max`]
This commit is contained in:
commit
3e84ca8ac9
@ -5917,6 +5917,7 @@ Released 2018-09-13
|
||||
[`unnecessary_lazy_evaluations`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_lazy_evaluations
|
||||
[`unnecessary_literal_unwrap`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_literal_unwrap
|
||||
[`unnecessary_map_on_constructor`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_on_constructor
|
||||
[`unnecessary_min_or_max`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_min_or_max
|
||||
[`unnecessary_mut_passed`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed
|
||||
[`unnecessary_operation`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_operation
|
||||
[`unnecessary_owned_empty_strings`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_owned_empty_strings
|
||||
|
@ -471,6 +471,7 @@
|
||||
crate::methods::UNNECESSARY_JOIN_INFO,
|
||||
crate::methods::UNNECESSARY_LAZY_EVALUATIONS_INFO,
|
||||
crate::methods::UNNECESSARY_LITERAL_UNWRAP_INFO,
|
||||
crate::methods::UNNECESSARY_MIN_OR_MAX_INFO,
|
||||
crate::methods::UNNECESSARY_RESULT_MAP_OR_ELSE_INFO,
|
||||
crate::methods::UNNECESSARY_SORT_BY_INFO,
|
||||
crate::methods::UNNECESSARY_TO_OWNED_INFO,
|
||||
|
@ -117,6 +117,7 @@
|
||||
mod unnecessary_join;
|
||||
mod unnecessary_lazy_eval;
|
||||
mod unnecessary_literal_unwrap;
|
||||
mod unnecessary_min_or_max;
|
||||
mod unnecessary_result_map_or_else;
|
||||
mod unnecessary_sort_by;
|
||||
mod unnecessary_to_owned;
|
||||
@ -3945,6 +3946,31 @@
|
||||
"cloning an `Option` via `as_ref().cloned()`"
|
||||
}
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Checks for unnecessary calls to `min()` or `max()` in the following cases
|
||||
/// - Either both side is constant
|
||||
/// - One side is clearly larger than the other, like i32::MIN and an i32 variable
|
||||
///
|
||||
/// ### Why is this bad?
|
||||
///
|
||||
/// In the aformentioned cases it is not necessary to call `min()` or `max()`
|
||||
/// to compare values, it may even cause confusion.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```no_run
|
||||
/// let _ = 0.min(7_u32);
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```no_run
|
||||
/// let _ = 0;
|
||||
/// ```
|
||||
#[clippy::version = "1.78.0"]
|
||||
pub UNNECESSARY_MIN_OR_MAX,
|
||||
complexity,
|
||||
"using 'min()/max()' when there is no need for it"
|
||||
}
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Checks for usage of `.map_or_else()` "map closure" for `Result` type.
|
||||
@ -4267,6 +4293,7 @@ pub fn new(
|
||||
UNNECESSARY_GET_THEN_CHECK,
|
||||
NEEDLESS_CHARACTER_ITERATION,
|
||||
MANUAL_INSPECT,
|
||||
UNNECESSARY_MIN_OR_MAX,
|
||||
]);
|
||||
|
||||
/// Extracts a method call name, args, and `Span` of the method name.
|
||||
@ -4566,6 +4593,9 @@ fn check_methods<'tcx>(&self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
||||
Some(("bytes", recv2, [], _, _)) => bytes_count_to_len::check(cx, expr, recv, recv2),
|
||||
_ => {},
|
||||
},
|
||||
("min" | "max", [arg]) => {
|
||||
unnecessary_min_or_max::check(cx, expr, name, recv, arg);
|
||||
},
|
||||
("drain", ..) => {
|
||||
if let Node::Stmt(Stmt { hir_id: _, kind, .. }) = cx.tcx.parent_hir_node(expr.hir_id)
|
||||
&& matches!(kind, StmtKind::Semi(_))
|
||||
|
90
clippy_lints/src/methods/unnecessary_min_or_max.rs
Normal file
90
clippy_lints/src/methods/unnecessary_min_or_max.rs
Normal file
@ -0,0 +1,90 @@
|
||||
use std::cmp::Ordering;
|
||||
|
||||
use super::UNNECESSARY_MIN_OR_MAX;
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
|
||||
use clippy_utils::consts::{constant, constant_with_source, Constant, ConstantSource, FullInt};
|
||||
use clippy_utils::source::snippet;
|
||||
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_hir::Expr;
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::ty;
|
||||
use rustc_span::Span;
|
||||
|
||||
pub(super) fn check<'tcx>(
|
||||
cx: &LateContext<'tcx>,
|
||||
expr: &'tcx Expr<'_>,
|
||||
name: &str,
|
||||
recv: &'tcx Expr<'_>,
|
||||
arg: &'tcx Expr<'_>,
|
||||
) {
|
||||
let typeck_results = cx.typeck_results();
|
||||
if let Some((left, ConstantSource::Local | ConstantSource::CoreConstant)) =
|
||||
constant_with_source(cx, typeck_results, recv)
|
||||
&& let Some((right, ConstantSource::Local | ConstantSource::CoreConstant)) =
|
||||
constant_with_source(cx, typeck_results, arg)
|
||||
{
|
||||
let Some(ord) = Constant::partial_cmp(cx.tcx, typeck_results.expr_ty(recv), &left, &right) else {
|
||||
return;
|
||||
};
|
||||
|
||||
lint(cx, expr, name, recv.span, arg.span, ord);
|
||||
} else if let Some(extrema) = detect_extrema(cx, recv) {
|
||||
let ord = match extrema {
|
||||
Extrema::Minimum => Ordering::Less,
|
||||
Extrema::Maximum => Ordering::Greater,
|
||||
};
|
||||
lint(cx, expr, name, recv.span, arg.span, ord);
|
||||
} else if let Some(extrema) = detect_extrema(cx, arg) {
|
||||
let ord = match extrema {
|
||||
Extrema::Minimum => Ordering::Greater,
|
||||
Extrema::Maximum => Ordering::Less,
|
||||
};
|
||||
lint(cx, expr, name, recv.span, arg.span, ord);
|
||||
}
|
||||
}
|
||||
|
||||
fn lint(cx: &LateContext<'_>, expr: &Expr<'_>, name: &str, lhs: Span, rhs: Span, order: Ordering) {
|
||||
let cmp_str = if order.is_ge() { "smaller" } else { "greater" };
|
||||
|
||||
let suggested_value = if (name == "min" && order.is_ge()) || (name == "max" && order.is_le()) {
|
||||
snippet(cx, rhs, "..")
|
||||
} else {
|
||||
snippet(cx, lhs, "..")
|
||||
};
|
||||
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
UNNECESSARY_MIN_OR_MAX,
|
||||
expr.span,
|
||||
format!(
|
||||
"`{}` is never {} than `{}` and has therefore no effect",
|
||||
snippet(cx, lhs, ".."),
|
||||
cmp_str,
|
||||
snippet(cx, rhs, "..")
|
||||
),
|
||||
"try",
|
||||
suggested_value.to_string(),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Extrema {
|
||||
Minimum,
|
||||
Maximum,
|
||||
}
|
||||
fn detect_extrema<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) -> Option<Extrema> {
|
||||
let ty = cx.typeck_results().expr_ty(expr);
|
||||
|
||||
let cv = constant(cx, cx.typeck_results(), expr)?;
|
||||
|
||||
match (cv.int_value(cx, ty)?, ty.kind()) {
|
||||
(FullInt::S(i), &ty::Int(ity)) if i == i128::MIN >> (128 - ity.bit_width()?) => Some(Extrema::Minimum),
|
||||
(FullInt::S(i), &ty::Int(ity)) if i == i128::MAX >> (128 - ity.bit_width()?) => Some(Extrema::Maximum),
|
||||
(FullInt::U(i), &ty::Uint(uty)) if i == u128::MAX >> (128 - uty.bit_width()?) => Some(Extrema::Maximum),
|
||||
(FullInt::U(0), &ty::Uint(_)) => Some(Extrema::Minimum),
|
||||
_ => None,
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
#![allow(clippy::float_cmp)]
|
||||
|
||||
use crate::macros::HirNode;
|
||||
use crate::source::{get_source_text, walk_span_to_context};
|
||||
use crate::{clip, is_direct_expn_of, sext, unsext};
|
||||
|
||||
@ -15,7 +16,7 @@
|
||||
use rustc_middle::{bug, mir, span_bug};
|
||||
use rustc_span::def_id::DefId;
|
||||
use rustc_span::symbol::{Ident, Symbol};
|
||||
use rustc_span::SyntaxContext;
|
||||
use rustc_span::{sym, SyntaxContext};
|
||||
use rustc_target::abi::Size;
|
||||
use std::cmp::Ordering;
|
||||
use std::hash::{Hash, Hasher};
|
||||
@ -302,6 +303,8 @@ pub enum ConstantSource {
|
||||
Local,
|
||||
/// The value is dependent on a defined constant.
|
||||
Constant,
|
||||
/// The value is dependent on a constant defined in `core` crate.
|
||||
CoreConstant,
|
||||
}
|
||||
impl ConstantSource {
|
||||
pub fn is_local(&self) -> bool {
|
||||
@ -415,9 +418,19 @@ pub fn expr(&mut self, e: &Expr<'_>) -> Option<Constant<'tcx>> {
|
||||
ExprKind::ConstBlock(ConstBlock { body, .. }) => self.expr(self.lcx.tcx.hir().body(body).value),
|
||||
ExprKind::DropTemps(e) => self.expr(e),
|
||||
ExprKind::Path(ref qpath) => {
|
||||
let is_core_crate = if let Some(def_id) = self.lcx.qpath_res(qpath, e.hir_id()).opt_def_id() {
|
||||
self.lcx.tcx.crate_name(def_id.krate) == sym::core
|
||||
} else {
|
||||
false
|
||||
};
|
||||
self.fetch_path_and_apply(qpath, e.hir_id, self.typeck_results.expr_ty(e), |this, result| {
|
||||
let result = mir_to_const(this.lcx, result)?;
|
||||
this.source = ConstantSource::Constant;
|
||||
// If source is already Constant we wouldn't want to override it with CoreConstant
|
||||
this.source = if is_core_crate && !matches!(this.source, ConstantSource::Constant) {
|
||||
ConstantSource::CoreConstant
|
||||
} else {
|
||||
ConstantSource::Constant
|
||||
};
|
||||
Some(result)
|
||||
})
|
||||
},
|
||||
|
1
tests/ui/auxiliary/external_consts.rs
Normal file
1
tests/ui/auxiliary/external_consts.rs
Normal file
@ -0,0 +1 @@
|
||||
pub const MAGIC_NUMBER: i32 = 1;
|
@ -12,6 +12,7 @@
|
||||
#![allow(
|
||||
clippy::cast_abs_to_unsigned,
|
||||
clippy::no_effect,
|
||||
clippy::unnecessary_min_or_max,
|
||||
clippy::unnecessary_operation,
|
||||
clippy::unnecessary_literal_unwrap,
|
||||
clippy::identity_op
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: casting `i32` to `f32` causes a loss of precision (`i32` is 32 bits wide, but `f32`'s mantissa is only 23 bits wide)
|
||||
--> tests/ui/cast.rs:23:5
|
||||
--> tests/ui/cast.rs:24:5
|
||||
|
|
||||
LL | x0 as f32;
|
||||
| ^^^^^^^^^
|
||||
@ -8,37 +8,37 @@ LL | x0 as f32;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::cast_precision_loss)]`
|
||||
|
||||
error: casting `i64` to `f32` causes a loss of precision (`i64` is 64 bits wide, but `f32`'s mantissa is only 23 bits wide)
|
||||
--> tests/ui/cast.rs:27:5
|
||||
--> tests/ui/cast.rs:28:5
|
||||
|
|
||||
LL | x1 as f32;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: casting `i64` to `f64` causes a loss of precision (`i64` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
|
||||
--> tests/ui/cast.rs:29:5
|
||||
--> tests/ui/cast.rs:30:5
|
||||
|
|
||||
LL | x1 as f64;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: casting `u32` to `f32` causes a loss of precision (`u32` is 32 bits wide, but `f32`'s mantissa is only 23 bits wide)
|
||||
--> tests/ui/cast.rs:32:5
|
||||
--> tests/ui/cast.rs:33:5
|
||||
|
|
||||
LL | x2 as f32;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: casting `u64` to `f32` causes a loss of precision (`u64` is 64 bits wide, but `f32`'s mantissa is only 23 bits wide)
|
||||
--> tests/ui/cast.rs:35:5
|
||||
--> tests/ui/cast.rs:36:5
|
||||
|
|
||||
LL | x3 as f32;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: casting `u64` to `f64` causes a loss of precision (`u64` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
|
||||
--> tests/ui/cast.rs:37:5
|
||||
--> tests/ui/cast.rs:38:5
|
||||
|
|
||||
LL | x3 as f64;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: casting `f32` to `i32` may truncate the value
|
||||
--> tests/ui/cast.rs:40:5
|
||||
--> tests/ui/cast.rs:41:5
|
||||
|
|
||||
LL | 1f32 as i32;
|
||||
| ^^^^^^^^^^^
|
||||
@ -48,7 +48,7 @@ LL | 1f32 as i32;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::cast_possible_truncation)]`
|
||||
|
||||
error: casting `f32` to `u32` may truncate the value
|
||||
--> tests/ui/cast.rs:42:5
|
||||
--> tests/ui/cast.rs:43:5
|
||||
|
|
||||
LL | 1f32 as u32;
|
||||
| ^^^^^^^^^^^
|
||||
@ -56,7 +56,7 @@ LL | 1f32 as u32;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `f32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:42:5
|
||||
--> tests/ui/cast.rs:43:5
|
||||
|
|
||||
LL | 1f32 as u32;
|
||||
| ^^^^^^^^^^^
|
||||
@ -65,7 +65,7 @@ LL | 1f32 as u32;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::cast_sign_loss)]`
|
||||
|
||||
error: casting `f64` to `f32` may truncate the value
|
||||
--> tests/ui/cast.rs:46:5
|
||||
--> tests/ui/cast.rs:47:5
|
||||
|
|
||||
LL | 1f64 as f32;
|
||||
| ^^^^^^^^^^^
|
||||
@ -73,7 +73,7 @@ LL | 1f64 as f32;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `i32` to `i8` may truncate the value
|
||||
--> tests/ui/cast.rs:48:5
|
||||
--> tests/ui/cast.rs:49:5
|
||||
|
|
||||
LL | 1i32 as i8;
|
||||
| ^^^^^^^^^^
|
||||
@ -85,7 +85,7 @@ LL | i8::try_from(1i32);
|
||||
| ~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `i32` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:50:5
|
||||
--> tests/ui/cast.rs:51:5
|
||||
|
|
||||
LL | 1i32 as u8;
|
||||
| ^^^^^^^^^^
|
||||
@ -97,7 +97,7 @@ LL | u8::try_from(1i32);
|
||||
| ~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `f64` to `isize` may truncate the value
|
||||
--> tests/ui/cast.rs:52:5
|
||||
--> tests/ui/cast.rs:53:5
|
||||
|
|
||||
LL | 1f64 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -105,7 +105,7 @@ LL | 1f64 as isize;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `f64` to `usize` may truncate the value
|
||||
--> tests/ui/cast.rs:54:5
|
||||
--> tests/ui/cast.rs:55:5
|
||||
|
|
||||
LL | 1f64 as usize;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -113,13 +113,13 @@ LL | 1f64 as usize;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `f64` to `usize` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:54:5
|
||||
--> tests/ui/cast.rs:55:5
|
||||
|
|
||||
LL | 1f64 as usize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: casting `u32` to `u16` may truncate the value
|
||||
--> tests/ui/cast.rs:57:5
|
||||
--> tests/ui/cast.rs:58:5
|
||||
|
|
||||
LL | 1f32 as u32 as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
@ -131,7 +131,7 @@ LL | u16::try_from(1f32 as u32);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `f32` to `u32` may truncate the value
|
||||
--> tests/ui/cast.rs:57:5
|
||||
--> tests/ui/cast.rs:58:5
|
||||
|
|
||||
LL | 1f32 as u32 as u16;
|
||||
| ^^^^^^^^^^^
|
||||
@ -139,13 +139,13 @@ LL | 1f32 as u32 as u16;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `f32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:57:5
|
||||
--> tests/ui/cast.rs:58:5
|
||||
|
|
||||
LL | 1f32 as u32 as u16;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `i8` may truncate the value
|
||||
--> tests/ui/cast.rs:62:22
|
||||
--> tests/ui/cast.rs:63:22
|
||||
|
|
||||
LL | let _x: i8 = 1i32 as _;
|
||||
| ^^^^^^^^^
|
||||
@ -157,7 +157,7 @@ LL | let _x: i8 = 1i32.try_into();
|
||||
| ~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `f32` to `i32` may truncate the value
|
||||
--> tests/ui/cast.rs:64:9
|
||||
--> tests/ui/cast.rs:65:9
|
||||
|
|
||||
LL | 1f32 as i32;
|
||||
| ^^^^^^^^^^^
|
||||
@ -165,7 +165,7 @@ LL | 1f32 as i32;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `f64` to `i32` may truncate the value
|
||||
--> tests/ui/cast.rs:66:9
|
||||
--> tests/ui/cast.rs:67:9
|
||||
|
|
||||
LL | 1f64 as i32;
|
||||
| ^^^^^^^^^^^
|
||||
@ -173,7 +173,7 @@ LL | 1f64 as i32;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `f32` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:68:9
|
||||
--> tests/ui/cast.rs:69:9
|
||||
|
|
||||
LL | 1f32 as u8;
|
||||
| ^^^^^^^^^^
|
||||
@ -181,13 +181,13 @@ LL | 1f32 as u8;
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
|
||||
error: casting `f32` to `u8` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:68:9
|
||||
--> tests/ui/cast.rs:69:9
|
||||
|
|
||||
LL | 1f32 as u8;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: casting `u8` to `i8` may wrap around the value
|
||||
--> tests/ui/cast.rs:73:5
|
||||
--> tests/ui/cast.rs:74:5
|
||||
|
|
||||
LL | 1u8 as i8;
|
||||
| ^^^^^^^^^
|
||||
@ -196,31 +196,31 @@ LL | 1u8 as i8;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::cast_possible_wrap)]`
|
||||
|
||||
error: casting `u16` to `i16` may wrap around the value
|
||||
--> tests/ui/cast.rs:76:5
|
||||
--> tests/ui/cast.rs:77:5
|
||||
|
|
||||
LL | 1u16 as i16;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: casting `u32` to `i32` may wrap around the value
|
||||
--> tests/ui/cast.rs:78:5
|
||||
--> tests/ui/cast.rs:79:5
|
||||
|
|
||||
LL | 1u32 as i32;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: casting `u64` to `i64` may wrap around the value
|
||||
--> tests/ui/cast.rs:80:5
|
||||
--> tests/ui/cast.rs:81:5
|
||||
|
|
||||
LL | 1u64 as i64;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: casting `usize` to `isize` may wrap around the value
|
||||
--> tests/ui/cast.rs:82:5
|
||||
--> tests/ui/cast.rs:83:5
|
||||
|
|
||||
LL | 1usize as isize;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `usize` to `i8` may truncate the value
|
||||
--> tests/ui/cast.rs:85:5
|
||||
--> tests/ui/cast.rs:86:5
|
||||
|
|
||||
LL | 1usize as i8;
|
||||
| ^^^^^^^^^^^^
|
||||
@ -232,7 +232,7 @@ LL | i8::try_from(1usize);
|
||||
| ~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `usize` to `i16` may truncate the value
|
||||
--> tests/ui/cast.rs:88:5
|
||||
--> tests/ui/cast.rs:89:5
|
||||
|
|
||||
LL | 1usize as i16;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -244,7 +244,7 @@ LL | i16::try_from(1usize);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `usize` to `i16` may wrap around the value on targets with 16-bit wide pointers
|
||||
--> tests/ui/cast.rs:88:5
|
||||
--> tests/ui/cast.rs:89:5
|
||||
|
|
||||
LL | 1usize as i16;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -253,7 +253,7 @@ LL | 1usize as i16;
|
||||
= note: for more information see https://doc.rust-lang.org/reference/types/numeric.html#machine-dependent-integer-types
|
||||
|
||||
error: casting `usize` to `i32` may truncate the value on targets with 64-bit wide pointers
|
||||
--> tests/ui/cast.rs:93:5
|
||||
--> tests/ui/cast.rs:94:5
|
||||
|
|
||||
LL | 1usize as i32;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -265,19 +265,19 @@ LL | i32::try_from(1usize);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `usize` to `i32` may wrap around the value on targets with 32-bit wide pointers
|
||||
--> tests/ui/cast.rs:93:5
|
||||
--> tests/ui/cast.rs:94:5
|
||||
|
|
||||
LL | 1usize as i32;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: casting `usize` to `i64` may wrap around the value on targets with 64-bit wide pointers
|
||||
--> tests/ui/cast.rs:97:5
|
||||
--> tests/ui/cast.rs:98:5
|
||||
|
|
||||
LL | 1usize as i64;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: casting `u16` to `isize` may wrap around the value on targets with 16-bit wide pointers
|
||||
--> tests/ui/cast.rs:102:5
|
||||
--> tests/ui/cast.rs:103:5
|
||||
|
|
||||
LL | 1u16 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -286,13 +286,13 @@ LL | 1u16 as isize;
|
||||
= note: for more information see https://doc.rust-lang.org/reference/types/numeric.html#machine-dependent-integer-types
|
||||
|
||||
error: casting `u32` to `isize` may wrap around the value on targets with 32-bit wide pointers
|
||||
--> tests/ui/cast.rs:106:5
|
||||
--> tests/ui/cast.rs:107:5
|
||||
|
|
||||
LL | 1u32 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: casting `u64` to `isize` may truncate the value on targets with 32-bit wide pointers
|
||||
--> tests/ui/cast.rs:109:5
|
||||
--> tests/ui/cast.rs:110:5
|
||||
|
|
||||
LL | 1u64 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -304,55 +304,55 @@ LL | isize::try_from(1u64);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `u64` to `isize` may wrap around the value on targets with 64-bit wide pointers
|
||||
--> tests/ui/cast.rs:109:5
|
||||
--> tests/ui/cast.rs:110:5
|
||||
|
|
||||
LL | 1u64 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:114:5
|
||||
--> tests/ui/cast.rs:115:5
|
||||
|
|
||||
LL | -1i32 as u32;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: casting `isize` to `usize` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:117:5
|
||||
--> tests/ui/cast.rs:118:5
|
||||
|
|
||||
LL | -1isize as usize;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i8` to `u8` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:128:5
|
||||
--> tests/ui/cast.rs:129:5
|
||||
|
|
||||
LL | (i8::MIN).abs() as u8;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i64` to `u64` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:132:5
|
||||
--> tests/ui/cast.rs:133:5
|
||||
|
|
||||
LL | (-1i64).abs() as u64;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `isize` to `usize` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:133:5
|
||||
--> tests/ui/cast.rs:134:5
|
||||
|
|
||||
LL | (-1isize).abs() as usize;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i64` to `u64` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:140:5
|
||||
--> tests/ui/cast.rs:141:5
|
||||
|
|
||||
LL | (unsafe { (-1i64).checked_abs().unwrap_unchecked() }) as u64;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i64` to `u64` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:155:5
|
||||
--> tests/ui/cast.rs:156:5
|
||||
|
|
||||
LL | (unsafe { (-1i64).checked_isqrt().unwrap_unchecked() }) as u64;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i64` to `i8` may truncate the value
|
||||
--> tests/ui/cast.rs:206:5
|
||||
--> tests/ui/cast.rs:207:5
|
||||
|
|
||||
LL | (-99999999999i64).min(1) as i8;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -364,7 +364,7 @@ LL | i8::try_from((-99999999999i64).min(1));
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `u64` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:220:5
|
||||
--> tests/ui/cast.rs:221:5
|
||||
|
|
||||
LL | 999999u64.clamp(0, 256) as u8;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -376,7 +376,7 @@ LL | u8::try_from(999999u64.clamp(0, 256));
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `main::E2` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:243:21
|
||||
--> tests/ui/cast.rs:244:21
|
||||
|
|
||||
LL | let _ = self as u8;
|
||||
| ^^^^^^^^^^
|
||||
@ -388,7 +388,7 @@ LL | let _ = u8::try_from(self);
|
||||
| ~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `main::E2::B` to `u8` will truncate the value
|
||||
--> tests/ui/cast.rs:245:21
|
||||
--> tests/ui/cast.rs:246:21
|
||||
|
|
||||
LL | let _ = Self::B as u8;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -397,7 +397,7 @@ LL | let _ = Self::B as u8;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::cast_enum_truncation)]`
|
||||
|
||||
error: casting `main::E5` to `i8` may truncate the value
|
||||
--> tests/ui/cast.rs:287:21
|
||||
--> tests/ui/cast.rs:288:21
|
||||
|
|
||||
LL | let _ = self as i8;
|
||||
| ^^^^^^^^^^
|
||||
@ -409,13 +409,13 @@ LL | let _ = i8::try_from(self);
|
||||
| ~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `main::E5::A` to `i8` will truncate the value
|
||||
--> tests/ui/cast.rs:289:21
|
||||
--> tests/ui/cast.rs:290:21
|
||||
|
|
||||
LL | let _ = Self::A as i8;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: casting `main::E6` to `i16` may truncate the value
|
||||
--> tests/ui/cast.rs:306:21
|
||||
--> tests/ui/cast.rs:307:21
|
||||
|
|
||||
LL | let _ = self as i16;
|
||||
| ^^^^^^^^^^^
|
||||
@ -427,7 +427,7 @@ LL | let _ = i16::try_from(self);
|
||||
| ~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `main::E7` to `usize` may truncate the value on targets with 32-bit wide pointers
|
||||
--> tests/ui/cast.rs:325:21
|
||||
--> tests/ui/cast.rs:326:21
|
||||
|
|
||||
LL | let _ = self as usize;
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -439,7 +439,7 @@ LL | let _ = usize::try_from(self);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `main::E10` to `u16` may truncate the value
|
||||
--> tests/ui/cast.rs:372:21
|
||||
--> tests/ui/cast.rs:373:21
|
||||
|
|
||||
LL | let _ = self as u16;
|
||||
| ^^^^^^^^^^^
|
||||
@ -451,7 +451,7 @@ LL | let _ = u16::try_from(self);
|
||||
| ~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `u32` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:383:13
|
||||
--> tests/ui/cast.rs:384:13
|
||||
|
|
||||
LL | let c = (q >> 16) as u8;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
@ -463,7 +463,7 @@ LL | let c = u8::try_from(q >> 16);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `u32` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:387:13
|
||||
--> tests/ui/cast.rs:388:13
|
||||
|
|
||||
LL | let c = (q / 1000) as u8;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
@ -475,85 +475,85 @@ LL | let c = u8::try_from(q / 1000);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:399:9
|
||||
--> tests/ui/cast.rs:400:9
|
||||
|
|
||||
LL | (x * x) as u32;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:404:32
|
||||
--> tests/ui/cast.rs:405:32
|
||||
|
|
||||
LL | let _a = |x: i32| -> u32 { (x * x * x * x) as u32 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:406:5
|
||||
--> tests/ui/cast.rs:407:5
|
||||
|
|
||||
LL | (2_i32).checked_pow(3).unwrap() as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:407:5
|
||||
--> tests/ui/cast.rs:408:5
|
||||
|
|
||||
LL | (-2_i32).pow(3) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:412:5
|
||||
--> tests/ui/cast.rs:413:5
|
||||
|
|
||||
LL | (-5_i32 % 2) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:414:5
|
||||
--> tests/ui/cast.rs:415:5
|
||||
|
|
||||
LL | (-5_i32 % -2) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:417:5
|
||||
--> tests/ui/cast.rs:418:5
|
||||
|
|
||||
LL | (-2_i32 >> 1) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:421:5
|
||||
--> tests/ui/cast.rs:422:5
|
||||
|
|
||||
LL | (x * x) as u32;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:422:5
|
||||
--> tests/ui/cast.rs:423:5
|
||||
|
|
||||
LL | (x * x * x) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:426:5
|
||||
--> tests/ui/cast.rs:427:5
|
||||
|
|
||||
LL | (y * y * y * y * -2) as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:428:5
|
||||
--> tests/ui/cast.rs:429:5
|
||||
|
|
||||
LL | (y * y * y / y * 2) as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:429:5
|
||||
--> tests/ui/cast.rs:430:5
|
||||
|
|
||||
LL | (y * y / y * 2) as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:431:5
|
||||
--> tests/ui/cast.rs:432:5
|
||||
|
|
||||
LL | (y / y * y * -2) as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: equal expressions as operands to `/`
|
||||
--> tests/ui/cast.rs:431:6
|
||||
--> tests/ui/cast.rs:432:6
|
||||
|
|
||||
LL | (y / y * y * -2) as u16;
|
||||
| ^^^^^
|
||||
@ -561,97 +561,97 @@ LL | (y / y * y * -2) as u16;
|
||||
= note: `#[deny(clippy::eq_op)]` on by default
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:434:5
|
||||
--> tests/ui/cast.rs:435:5
|
||||
|
|
||||
LL | (y + y + y + -2) as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:436:5
|
||||
--> tests/ui/cast.rs:437:5
|
||||
|
|
||||
LL | (y + y + y + 2) as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:440:5
|
||||
--> tests/ui/cast.rs:441:5
|
||||
|
|
||||
LL | (z + -2) as u16;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i16` to `u16` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:442:5
|
||||
--> tests/ui/cast.rs:443:5
|
||||
|
|
||||
LL | (z + z + 2) as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:445:9
|
||||
--> tests/ui/cast.rs:446:9
|
||||
|
|
||||
LL | (a * a * b * b * c * c) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:446:9
|
||||
--> tests/ui/cast.rs:447:9
|
||||
|
|
||||
LL | (a * b * c) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:448:9
|
||||
--> tests/ui/cast.rs:449:9
|
||||
|
|
||||
LL | (a * -b * c) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:450:9
|
||||
--> tests/ui/cast.rs:451:9
|
||||
|
|
||||
LL | (a * b * c * c) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:451:9
|
||||
--> tests/ui/cast.rs:452:9
|
||||
|
|
||||
LL | (a * -2) as u32;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:453:9
|
||||
--> tests/ui/cast.rs:454:9
|
||||
|
|
||||
LL | (a * b * c * -2) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:455:9
|
||||
--> tests/ui/cast.rs:456:9
|
||||
|
|
||||
LL | (a / b) as u32;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:456:9
|
||||
--> tests/ui/cast.rs:457:9
|
||||
|
|
||||
LL | (a / b * c) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:458:9
|
||||
--> tests/ui/cast.rs:459:9
|
||||
|
|
||||
LL | (a / b + b * c) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:460:9
|
||||
--> tests/ui/cast.rs:461:9
|
||||
|
|
||||
LL | a.saturating_pow(3) as u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:462:9
|
||||
--> tests/ui/cast.rs:463:9
|
||||
|
|
||||
LL | (a.abs() * b.pow(2) / c.abs()) as u32
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `i32` to `u32` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:470:21
|
||||
--> tests/ui/cast.rs:471:21
|
||||
|
|
||||
LL | let _ = i32::MIN as u32; // cast_sign_loss
|
||||
| ^^^^^^^^^^^^^^^
|
||||
@ -662,7 +662,7 @@ LL | m!();
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: casting `u32` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:471:21
|
||||
--> tests/ui/cast.rs:472:21
|
||||
|
|
||||
LL | let _ = u32::MAX as u8; // cast_possible_truncation
|
||||
| ^^^^^^^^^^^^^^
|
||||
@ -678,7 +678,7 @@ LL | let _ = u8::try_from(u32::MAX); // cast_possible_truncation
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `f64` to `f32` may truncate the value
|
||||
--> tests/ui/cast.rs:472:21
|
||||
--> tests/ui/cast.rs:473:21
|
||||
|
|
||||
LL | let _ = std::f64::consts::PI as f32; // cast_possible_truncation
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -690,7 +690,7 @@ LL | m!();
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: casting `i64` to `usize` may truncate the value on targets with 32-bit wide pointers
|
||||
--> tests/ui/cast.rs:481:5
|
||||
--> tests/ui/cast.rs:482:5
|
||||
|
|
||||
LL | bar.unwrap().unwrap() as usize
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -702,13 +702,13 @@ LL | usize::try_from(bar.unwrap().unwrap())
|
||||
|
|
||||
|
||||
error: casting `i64` to `usize` may lose the sign of the value
|
||||
--> tests/ui/cast.rs:481:5
|
||||
--> tests/ui/cast.rs:482:5
|
||||
|
|
||||
LL | bar.unwrap().unwrap() as usize
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: casting `u64` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:496:5
|
||||
--> tests/ui/cast.rs:497:5
|
||||
|
|
||||
LL | (256 & 999999u64) as u8;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -720,7 +720,7 @@ LL | u8::try_from(256 & 999999u64);
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: casting `u64` to `u8` may truncate the value
|
||||
--> tests/ui/cast.rs:498:5
|
||||
--> tests/ui/cast.rs:499:5
|
||||
|
|
||||
LL | (255 % 999999u64) as u8;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
67
tests/ui/unnecessary_min_or_max.fixed
Normal file
67
tests/ui/unnecessary_min_or_max.fixed
Normal file
@ -0,0 +1,67 @@
|
||||
//@aux-build:external_consts.rs
|
||||
|
||||
#![allow(unused)]
|
||||
#![warn(clippy::unnecessary_min_or_max)]
|
||||
#![allow(clippy::identity_op)]
|
||||
|
||||
extern crate external_consts;
|
||||
|
||||
const X: i32 = 1;
|
||||
|
||||
fn main() {
|
||||
// Both are Literals
|
||||
let _ = (-6_i32);
|
||||
let _ = 9;
|
||||
let _ = 6;
|
||||
let _ = 9_u32;
|
||||
let _ = 6;
|
||||
let _ = 7_u8;
|
||||
|
||||
let x: u32 = 42;
|
||||
// unsigned with zero
|
||||
let _ = 0;
|
||||
let _ = x;
|
||||
let _ = 0_u32;
|
||||
let _ = x;
|
||||
|
||||
let x: i32 = 42;
|
||||
// signed MIN
|
||||
let _ = i32::MIN;
|
||||
let _ = x;
|
||||
let _ = i32::MIN;
|
||||
let _ = x;
|
||||
|
||||
let _ = i32::MIN - 0;
|
||||
let _ = x;
|
||||
|
||||
let _ = i32::MIN - 0;
|
||||
|
||||
// The below cases shouldn't be lint
|
||||
let mut min = u32::MAX;
|
||||
for _ in 0..1000 {
|
||||
min = min.min(random_u32());
|
||||
}
|
||||
|
||||
let _ = 2.min(external_consts::MAGIC_NUMBER);
|
||||
let _ = 2.max(external_consts::MAGIC_NUMBER);
|
||||
let _ = external_consts::MAGIC_NUMBER.min(2);
|
||||
let _ = external_consts::MAGIC_NUMBER.max(2);
|
||||
|
||||
let _ = X.min(external_consts::MAGIC_NUMBER);
|
||||
let _ = X.max(external_consts::MAGIC_NUMBER);
|
||||
let _ = external_consts::MAGIC_NUMBER.min(X);
|
||||
let _ = external_consts::MAGIC_NUMBER.max(X);
|
||||
|
||||
let _ = X.max(12);
|
||||
let _ = X.min(12);
|
||||
let _ = 12.min(X);
|
||||
let _ = 12.max(X);
|
||||
let _ = (X + 1).max(12);
|
||||
let _ = (X + 1).min(12);
|
||||
let _ = 12.min(X - 1);
|
||||
let _ = 12.max(X - 1);
|
||||
}
|
||||
fn random_u32() -> u32 {
|
||||
// random number generator
|
||||
0
|
||||
}
|
67
tests/ui/unnecessary_min_or_max.rs
Normal file
67
tests/ui/unnecessary_min_or_max.rs
Normal file
@ -0,0 +1,67 @@
|
||||
//@aux-build:external_consts.rs
|
||||
|
||||
#![allow(unused)]
|
||||
#![warn(clippy::unnecessary_min_or_max)]
|
||||
#![allow(clippy::identity_op)]
|
||||
|
||||
extern crate external_consts;
|
||||
|
||||
const X: i32 = 1;
|
||||
|
||||
fn main() {
|
||||
// Both are Literals
|
||||
let _ = (-6_i32).min(9);
|
||||
let _ = (-6_i32).max(9);
|
||||
let _ = 9_u32.min(6);
|
||||
let _ = 9_u32.max(6);
|
||||
let _ = 6.min(7_u8);
|
||||
let _ = 6.max(7_u8);
|
||||
|
||||
let x: u32 = 42;
|
||||
// unsigned with zero
|
||||
let _ = 0.min(x);
|
||||
let _ = 0.max(x);
|
||||
let _ = x.min(0_u32);
|
||||
let _ = x.max(0_u32);
|
||||
|
||||
let x: i32 = 42;
|
||||
// signed MIN
|
||||
let _ = i32::MIN.min(x);
|
||||
let _ = i32::MIN.max(x);
|
||||
let _ = x.min(i32::MIN);
|
||||
let _ = x.max(i32::MIN);
|
||||
|
||||
let _ = x.min(i32::MIN - 0);
|
||||
let _ = x.max(i32::MIN);
|
||||
|
||||
let _ = x.min(i32::MIN - 0);
|
||||
|
||||
// The below cases shouldn't be lint
|
||||
let mut min = u32::MAX;
|
||||
for _ in 0..1000 {
|
||||
min = min.min(random_u32());
|
||||
}
|
||||
|
||||
let _ = 2.min(external_consts::MAGIC_NUMBER);
|
||||
let _ = 2.max(external_consts::MAGIC_NUMBER);
|
||||
let _ = external_consts::MAGIC_NUMBER.min(2);
|
||||
let _ = external_consts::MAGIC_NUMBER.max(2);
|
||||
|
||||
let _ = X.min(external_consts::MAGIC_NUMBER);
|
||||
let _ = X.max(external_consts::MAGIC_NUMBER);
|
||||
let _ = external_consts::MAGIC_NUMBER.min(X);
|
||||
let _ = external_consts::MAGIC_NUMBER.max(X);
|
||||
|
||||
let _ = X.max(12);
|
||||
let _ = X.min(12);
|
||||
let _ = 12.min(X);
|
||||
let _ = 12.max(X);
|
||||
let _ = (X + 1).max(12);
|
||||
let _ = (X + 1).min(12);
|
||||
let _ = 12.min(X - 1);
|
||||
let _ = 12.max(X - 1);
|
||||
}
|
||||
fn random_u32() -> u32 {
|
||||
// random number generator
|
||||
0
|
||||
}
|
107
tests/ui/unnecessary_min_or_max.stderr
Normal file
107
tests/ui/unnecessary_min_or_max.stderr
Normal file
@ -0,0 +1,107 @@
|
||||
error: `(-6_i32)` is never greater than `9` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:13:13
|
||||
|
|
||||
LL | let _ = (-6_i32).min(9);
|
||||
| ^^^^^^^^^^^^^^^ help: try: `(-6_i32)`
|
||||
|
|
||||
= note: `-D clippy::unnecessary-min-or-max` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_min_or_max)]`
|
||||
|
||||
error: `(-6_i32)` is never greater than `9` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:14:13
|
||||
|
|
||||
LL | let _ = (-6_i32).max(9);
|
||||
| ^^^^^^^^^^^^^^^ help: try: `9`
|
||||
|
||||
error: `9_u32` is never smaller than `6` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:15:13
|
||||
|
|
||||
LL | let _ = 9_u32.min(6);
|
||||
| ^^^^^^^^^^^^ help: try: `6`
|
||||
|
||||
error: `9_u32` is never smaller than `6` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:16:13
|
||||
|
|
||||
LL | let _ = 9_u32.max(6);
|
||||
| ^^^^^^^^^^^^ help: try: `9_u32`
|
||||
|
||||
error: `6` is never greater than `7_u8` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:17:13
|
||||
|
|
||||
LL | let _ = 6.min(7_u8);
|
||||
| ^^^^^^^^^^^ help: try: `6`
|
||||
|
||||
error: `6` is never greater than `7_u8` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:18:13
|
||||
|
|
||||
LL | let _ = 6.max(7_u8);
|
||||
| ^^^^^^^^^^^ help: try: `7_u8`
|
||||
|
||||
error: `0` is never greater than `x` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:22:13
|
||||
|
|
||||
LL | let _ = 0.min(x);
|
||||
| ^^^^^^^^ help: try: `0`
|
||||
|
||||
error: `0` is never greater than `x` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:23:13
|
||||
|
|
||||
LL | let _ = 0.max(x);
|
||||
| ^^^^^^^^ help: try: `x`
|
||||
|
||||
error: `x` is never smaller than `0_u32` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:24:13
|
||||
|
|
||||
LL | let _ = x.min(0_u32);
|
||||
| ^^^^^^^^^^^^ help: try: `0_u32`
|
||||
|
||||
error: `x` is never smaller than `0_u32` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:25:13
|
||||
|
|
||||
LL | let _ = x.max(0_u32);
|
||||
| ^^^^^^^^^^^^ help: try: `x`
|
||||
|
||||
error: `i32::MIN` is never greater than `x` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:29:13
|
||||
|
|
||||
LL | let _ = i32::MIN.min(x);
|
||||
| ^^^^^^^^^^^^^^^ help: try: `i32::MIN`
|
||||
|
||||
error: `i32::MIN` is never greater than `x` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:30:13
|
||||
|
|
||||
LL | let _ = i32::MIN.max(x);
|
||||
| ^^^^^^^^^^^^^^^ help: try: `x`
|
||||
|
||||
error: `x` is never smaller than `i32::MIN` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:31:13
|
||||
|
|
||||
LL | let _ = x.min(i32::MIN);
|
||||
| ^^^^^^^^^^^^^^^ help: try: `i32::MIN`
|
||||
|
||||
error: `x` is never smaller than `i32::MIN` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:32:13
|
||||
|
|
||||
LL | let _ = x.max(i32::MIN);
|
||||
| ^^^^^^^^^^^^^^^ help: try: `x`
|
||||
|
||||
error: `x` is never smaller than `i32::MIN - 0` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:34:13
|
||||
|
|
||||
LL | let _ = x.min(i32::MIN - 0);
|
||||
| ^^^^^^^^^^^^^^^^^^^ help: try: `i32::MIN - 0`
|
||||
|
||||
error: `x` is never smaller than `i32::MIN` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:35:13
|
||||
|
|
||||
LL | let _ = x.max(i32::MIN);
|
||||
| ^^^^^^^^^^^^^^^ help: try: `x`
|
||||
|
||||
error: `x` is never smaller than `i32::MIN - 0` and has therefore no effect
|
||||
--> tests/ui/unnecessary_min_or_max.rs:37:13
|
||||
|
|
||||
LL | let _ = x.min(i32::MIN - 0);
|
||||
| ^^^^^^^^^^^^^^^^^^^ help: try: `i32::MIN - 0`
|
||||
|
||||
error: aborting due to 17 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user