Merge commit 'bf1c6f9871' into clippyup
This commit is contained in:
parent
fcde7683fe
commit
cdb555f4fc
74 changed files with 2147 additions and 593 deletions
|
|
@ -4,6 +4,7 @@
|
|||
#![crate_type = "proc-macro"]
|
||||
#![feature(repr128, proc_macro_quote)]
|
||||
#![allow(incomplete_features)]
|
||||
#![allow(clippy::eq_op)]
|
||||
|
||||
extern crate proc_macro;
|
||||
|
||||
|
|
|
|||
7
tests/ui/crashes/ice-6139.rs
Normal file
7
tests/ui/crashes/ice-6139.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
trait T<'a> {}
|
||||
|
||||
fn foo(_: Vec<Box<dyn T<'_>>>) {}
|
||||
|
||||
fn main() {
|
||||
foo(vec![]);
|
||||
}
|
||||
9
tests/ui/crashes/ice-6153.rs
Normal file
9
tests/ui/crashes/ice-6153.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
pub struct S<'a, 'e>(&'a str, &'e str);
|
||||
|
||||
pub type T<'a, 'e> = std::collections::HashMap<S<'a, 'e>, ()>;
|
||||
|
||||
impl<'e, 'a: 'e> S<'a, 'e> {
|
||||
pub fn foo(_a: &str, _b: &str, _map: &T) {}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
// edition:2018
|
||||
#![warn(clippy::missing_errors_doc)]
|
||||
#![allow(clippy::result_unit_err)]
|
||||
|
||||
use std::io;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: docs for function returning `Result` missing `# Errors` section
|
||||
--> $DIR/doc_errors.rs:6:1
|
||||
--> $DIR/doc_errors.rs:7:1
|
||||
|
|
||||
LL | / pub fn pub_fn_missing_errors_header() -> Result<(), ()> {
|
||||
LL | | unimplemented!();
|
||||
|
|
@ -9,7 +9,7 @@ LL | | }
|
|||
= note: `-D clippy::missing-errors-doc` implied by `-D warnings`
|
||||
|
||||
error: docs for function returning `Result` missing `# Errors` section
|
||||
--> $DIR/doc_errors.rs:10:1
|
||||
--> $DIR/doc_errors.rs:11:1
|
||||
|
|
||||
LL | / pub async fn async_pub_fn_missing_errors_header() -> Result<(), ()> {
|
||||
LL | | unimplemented!();
|
||||
|
|
@ -17,7 +17,7 @@ LL | | }
|
|||
| |_^
|
||||
|
||||
error: docs for function returning `Result` missing `# Errors` section
|
||||
--> $DIR/doc_errors.rs:15:1
|
||||
--> $DIR/doc_errors.rs:16:1
|
||||
|
|
||||
LL | / pub fn pub_fn_returning_io_result() -> io::Result<()> {
|
||||
LL | | unimplemented!();
|
||||
|
|
@ -25,7 +25,7 @@ LL | | }
|
|||
| |_^
|
||||
|
||||
error: docs for function returning `Result` missing `# Errors` section
|
||||
--> $DIR/doc_errors.rs:20:1
|
||||
--> $DIR/doc_errors.rs:21:1
|
||||
|
|
||||
LL | / pub async fn async_pub_fn_returning_io_result() -> io::Result<()> {
|
||||
LL | | unimplemented!();
|
||||
|
|
@ -33,7 +33,7 @@ LL | | }
|
|||
| |_^
|
||||
|
||||
error: docs for function returning `Result` missing `# Errors` section
|
||||
--> $DIR/doc_errors.rs:50:5
|
||||
--> $DIR/doc_errors.rs:51:5
|
||||
|
|
||||
LL | / pub fn pub_method_missing_errors_header() -> Result<(), ()> {
|
||||
LL | | unimplemented!();
|
||||
|
|
@ -41,7 +41,7 @@ LL | | }
|
|||
| |_____^
|
||||
|
||||
error: docs for function returning `Result` missing `# Errors` section
|
||||
--> $DIR/doc_errors.rs:55:5
|
||||
--> $DIR/doc_errors.rs:56:5
|
||||
|
|
||||
LL | / pub async fn async_pub_method_missing_errors_header() -> Result<(), ()> {
|
||||
LL | | unimplemented!();
|
||||
|
|
@ -49,7 +49,7 @@ LL | | }
|
|||
| |_____^
|
||||
|
||||
error: docs for function returning `Result` missing `# Errors` section
|
||||
--> $DIR/doc_errors.rs:84:5
|
||||
--> $DIR/doc_errors.rs:85:5
|
||||
|
|
||||
LL | fn trait_method_missing_errors_header() -> Result<(), ()>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#![warn(clippy::double_must_use)]
|
||||
#![allow(clippy::result_unit_err)]
|
||||
|
||||
#[must_use]
|
||||
pub fn must_use_result() -> Result<(), ()> {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: this function has an empty `#[must_use]` attribute, but returns a type already marked as `#[must_use]`
|
||||
--> $DIR/double_must_use.rs:4:1
|
||||
--> $DIR/double_must_use.rs:5:1
|
||||
|
|
||||
LL | pub fn must_use_result() -> Result<(), ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -8,7 +8,7 @@ LL | pub fn must_use_result() -> Result<(), ()> {
|
|||
= help: either add some descriptive text or remove the attribute
|
||||
|
||||
error: this function has an empty `#[must_use]` attribute, but returns a type already marked as `#[must_use]`
|
||||
--> $DIR/double_must_use.rs:9:1
|
||||
--> $DIR/double_must_use.rs:10:1
|
||||
|
|
||||
LL | pub fn must_use_tuple() -> (Result<(), ()>, u8) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -16,7 +16,7 @@ LL | pub fn must_use_tuple() -> (Result<(), ()>, u8) {
|
|||
= help: either add some descriptive text or remove the attribute
|
||||
|
||||
error: this function has an empty `#[must_use]` attribute, but returns a type already marked as `#[must_use]`
|
||||
--> $DIR/double_must_use.rs:14:1
|
||||
--> $DIR/double_must_use.rs:15:1
|
||||
|
|
||||
LL | pub fn must_use_array() -> [Result<(), ()>; 1] {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#![warn(clippy::double_parens)]
|
||||
#![allow(dead_code)]
|
||||
#![allow(dead_code, clippy::eq_op)]
|
||||
#![feature(custom_inner_attributes)]
|
||||
#![rustfmt::skip]
|
||||
|
||||
|
|
|
|||
56
tests/ui/eq_op_macros.rs
Normal file
56
tests/ui/eq_op_macros.rs
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
#![warn(clippy::eq_op)]
|
||||
|
||||
// lint also in macro definition
|
||||
macro_rules! assert_in_macro_def {
|
||||
() => {
|
||||
let a = 42;
|
||||
assert_eq!(a, a);
|
||||
assert_ne!(a, a);
|
||||
debug_assert_eq!(a, a);
|
||||
debug_assert_ne!(a, a);
|
||||
};
|
||||
}
|
||||
|
||||
// lint identical args in assert-like macro invocations (see #3574)
|
||||
fn main() {
|
||||
assert_in_macro_def!();
|
||||
|
||||
let a = 1;
|
||||
let b = 2;
|
||||
|
||||
// lint identical args in `assert_eq!`
|
||||
assert_eq!(a, a);
|
||||
assert_eq!(a + 1, a + 1);
|
||||
// ok
|
||||
assert_eq!(a, b);
|
||||
assert_eq!(a, a + 1);
|
||||
assert_eq!(a + 1, b + 1);
|
||||
|
||||
// lint identical args in `assert_ne!`
|
||||
assert_ne!(a, a);
|
||||
assert_ne!(a + 1, a + 1);
|
||||
// ok
|
||||
assert_ne!(a, b);
|
||||
assert_ne!(a, a + 1);
|
||||
assert_ne!(a + 1, b + 1);
|
||||
|
||||
// lint identical args in `debug_assert_eq!`
|
||||
debug_assert_eq!(a, a);
|
||||
debug_assert_eq!(a + 1, a + 1);
|
||||
// ok
|
||||
debug_assert_eq!(a, b);
|
||||
debug_assert_eq!(a, a + 1);
|
||||
debug_assert_eq!(a + 1, b + 1);
|
||||
|
||||
// lint identical args in `debug_assert_ne!`
|
||||
debug_assert_ne!(a, a);
|
||||
debug_assert_ne!(a + 1, a + 1);
|
||||
// ok
|
||||
debug_assert_ne!(a, b);
|
||||
debug_assert_ne!(a, a + 1);
|
||||
debug_assert_ne!(a + 1, b + 1);
|
||||
|
||||
let my_vec = vec![1; 5];
|
||||
let mut my_iter = my_vec.iter();
|
||||
assert_ne!(my_iter.next(), my_iter.next());
|
||||
}
|
||||
95
tests/ui/eq_op_macros.stderr
Normal file
95
tests/ui/eq_op_macros.stderr
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
error: identical args used in this `assert_eq!` macro call
|
||||
--> $DIR/eq_op_macros.rs:7:20
|
||||
|
|
||||
LL | assert_eq!(a, a);
|
||||
| ^^^^
|
||||
...
|
||||
LL | assert_in_macro_def!();
|
||||
| ----------------------- in this macro invocation
|
||||
|
|
||||
= note: `-D clippy::eq-op` implied by `-D warnings`
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: identical args used in this `assert_ne!` macro call
|
||||
--> $DIR/eq_op_macros.rs:8:20
|
||||
|
|
||||
LL | assert_ne!(a, a);
|
||||
| ^^^^
|
||||
...
|
||||
LL | assert_in_macro_def!();
|
||||
| ----------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: identical args used in this `assert_eq!` macro call
|
||||
--> $DIR/eq_op_macros.rs:22:16
|
||||
|
|
||||
LL | assert_eq!(a, a);
|
||||
| ^^^^
|
||||
|
||||
error: identical args used in this `assert_eq!` macro call
|
||||
--> $DIR/eq_op_macros.rs:23:16
|
||||
|
|
||||
LL | assert_eq!(a + 1, a + 1);
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: identical args used in this `assert_ne!` macro call
|
||||
--> $DIR/eq_op_macros.rs:30:16
|
||||
|
|
||||
LL | assert_ne!(a, a);
|
||||
| ^^^^
|
||||
|
||||
error: identical args used in this `assert_ne!` macro call
|
||||
--> $DIR/eq_op_macros.rs:31:16
|
||||
|
|
||||
LL | assert_ne!(a + 1, a + 1);
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: identical args used in this `debug_assert_eq!` macro call
|
||||
--> $DIR/eq_op_macros.rs:9:26
|
||||
|
|
||||
LL | debug_assert_eq!(a, a);
|
||||
| ^^^^
|
||||
...
|
||||
LL | assert_in_macro_def!();
|
||||
| ----------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: identical args used in this `debug_assert_ne!` macro call
|
||||
--> $DIR/eq_op_macros.rs:10:26
|
||||
|
|
||||
LL | debug_assert_ne!(a, a);
|
||||
| ^^^^
|
||||
...
|
||||
LL | assert_in_macro_def!();
|
||||
| ----------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: identical args used in this `debug_assert_eq!` macro call
|
||||
--> $DIR/eq_op_macros.rs:38:22
|
||||
|
|
||||
LL | debug_assert_eq!(a, a);
|
||||
| ^^^^
|
||||
|
||||
error: identical args used in this `debug_assert_eq!` macro call
|
||||
--> $DIR/eq_op_macros.rs:39:22
|
||||
|
|
||||
LL | debug_assert_eq!(a + 1, a + 1);
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: identical args used in this `debug_assert_ne!` macro call
|
||||
--> $DIR/eq_op_macros.rs:46:22
|
||||
|
|
||||
LL | debug_assert_ne!(a, a);
|
||||
| ^^^^
|
||||
|
||||
error: identical args used in this `debug_assert_ne!` macro call
|
||||
--> $DIR/eq_op_macros.rs:47:22
|
||||
|
|
||||
LL | debug_assert_ne!(a + 1, a + 1);
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
#![allow(
|
||||
unused,
|
||||
clippy::no_effect,
|
||||
clippy::op_ref,
|
||||
clippy::unnecessary_operation,
|
||||
clippy::cast_lossless,
|
||||
clippy::many_single_char_names
|
||||
|
|
@ -116,4 +117,8 @@ fn main() {
|
|||
1.23f64.signum() != x64.signum();
|
||||
1.23f64.signum() != -(x64.signum());
|
||||
1.23f64.signum() != 3.21f64.signum();
|
||||
|
||||
// the comparison should also look through references
|
||||
&0.0 == &ZERO;
|
||||
&&&&0.0 == &&&&ZERO;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: strict comparison of `f32` or `f64`
|
||||
--> $DIR/float_cmp.rs:65:5
|
||||
--> $DIR/float_cmp.rs:66:5
|
||||
|
|
||||
LL | ONE as f64 != 2.0;
|
||||
| ^^^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(ONE as f64 - 2.0).abs() > error_margin`
|
||||
|
|
@ -8,7 +8,7 @@ LL | ONE as f64 != 2.0;
|
|||
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
|
||||
|
||||
error: strict comparison of `f32` or `f64`
|
||||
--> $DIR/float_cmp.rs:70:5
|
||||
--> $DIR/float_cmp.rs:71:5
|
||||
|
|
||||
LL | x == 1.0;
|
||||
| ^^^^^^^^ help: consider comparing them within some margin of error: `(x - 1.0).abs() < error_margin`
|
||||
|
|
@ -16,7 +16,7 @@ LL | x == 1.0;
|
|||
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
|
||||
|
||||
error: strict comparison of `f32` or `f64`
|
||||
--> $DIR/float_cmp.rs:73:5
|
||||
--> $DIR/float_cmp.rs:74:5
|
||||
|
|
||||
LL | twice(x) != twice(ONE as f64);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(twice(x) - twice(ONE as f64)).abs() > error_margin`
|
||||
|
|
@ -24,7 +24,7 @@ LL | twice(x) != twice(ONE as f64);
|
|||
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
|
||||
|
||||
error: strict comparison of `f32` or `f64`
|
||||
--> $DIR/float_cmp.rs:93:5
|
||||
--> $DIR/float_cmp.rs:94:5
|
||||
|
|
||||
LL | NON_ZERO_ARRAY[i] == NON_ZERO_ARRAY[j];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(NON_ZERO_ARRAY[i] - NON_ZERO_ARRAY[j]).abs() < error_margin`
|
||||
|
|
@ -32,7 +32,7 @@ LL | NON_ZERO_ARRAY[i] == NON_ZERO_ARRAY[j];
|
|||
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
|
||||
|
||||
error: strict comparison of `f32` or `f64` arrays
|
||||
--> $DIR/float_cmp.rs:98:5
|
||||
--> $DIR/float_cmp.rs:99:5
|
||||
|
|
||||
LL | a1 == a2;
|
||||
| ^^^^^^^^
|
||||
|
|
@ -40,7 +40,7 @@ LL | a1 == a2;
|
|||
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
|
||||
|
||||
error: strict comparison of `f32` or `f64`
|
||||
--> $DIR/float_cmp.rs:99:5
|
||||
--> $DIR/float_cmp.rs:100:5
|
||||
|
|
||||
LL | a1[0] == a2[0];
|
||||
| ^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(a1[0] - a2[0]).abs() < error_margin`
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ fn main() {
|
|||
"foo".to_string();
|
||||
"{}".to_string();
|
||||
"{} abc {}".to_string();
|
||||
"foo {}\n\" bar".to_string();
|
||||
r##"foo {}
|
||||
" bar"##.to_string();
|
||||
|
||||
"foo".to_string();
|
||||
format!("{:?}", "foo"); // Don't warn about `Debug`.
|
||||
|
|
|
|||
|
|
@ -25,7 +25,13 @@ LL | / format!(
|
|||
LL | | r##"foo {{}}
|
||||
LL | | " bar"##
|
||||
LL | | );
|
||||
| |______^ help: consider using `.to_string()`: `"foo {}/n/" bar".to_string();`
|
||||
| |______^
|
||||
|
|
||||
help: consider using `.to_string()`
|
||||
|
|
||||
LL | r##"foo {}
|
||||
LL | " bar"##.to_string();
|
||||
|
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:21:5
|
||||
|
|
|
|||
|
|
@ -1,88 +0,0 @@
|
|||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:7:14
|
||||
|
|
||||
LL | for i in 0..src.len() {
|
||||
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])`
|
||||
|
|
||||
= note: `-D clippy::manual-memcpy` implied by `-D warnings`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:12:14
|
||||
|
|
||||
LL | for i in 0..src.len() {
|
||||
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[10..(src.len() + 10)].clone_from_slice(&src[..])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:17:14
|
||||
|
|
||||
LL | for i in 0..src.len() {
|
||||
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[10..])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:22:14
|
||||
|
|
||||
LL | for i in 11..src.len() {
|
||||
| ^^^^^^^^^^^^^ help: try replacing the loop by: `dst[11..src.len()].clone_from_slice(&src[(11 - 10)..(src.len() - 10)])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:27:14
|
||||
|
|
||||
LL | for i in 0..dst.len() {
|
||||
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst.clone_from_slice(&src[..dst.len()])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:40:14
|
||||
|
|
||||
LL | for i in 10..256 {
|
||||
| ^^^^^^^
|
||||
|
|
||||
help: try replacing the loop by
|
||||
|
|
||||
LL | for i in dst[10..256].clone_from_slice(&src[(10 - 5)..(256 - 5)])
|
||||
LL | dst2[(10 + 500)..(256 + 500)].clone_from_slice(&src[10..256]) {
|
||||
|
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:52:14
|
||||
|
|
||||
LL | for i in 10..LOOP_OFFSET {
|
||||
| ^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[(10 + LOOP_OFFSET)..(LOOP_OFFSET + LOOP_OFFSET)].clone_from_slice(&src[(10 - some_var)..(LOOP_OFFSET - some_var)])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:65:14
|
||||
|
|
||||
LL | for i in 0..src_vec.len() {
|
||||
| ^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst_vec[..src_vec.len()].clone_from_slice(&src_vec[..])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:94:14
|
||||
|
|
||||
LL | for i in from..from + src.len() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + src.len()].clone_from_slice(&src[..(from + src.len() - from)])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:98:14
|
||||
|
|
||||
LL | for i in from..from + 3 {
|
||||
| ^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + 3].clone_from_slice(&src[..(from + 3 - from)])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:103:14
|
||||
|
|
||||
LL | for i in 0..5 {
|
||||
| ^^^^ help: try replacing the loop by: `dst[..5].clone_from_slice(&src[..5])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:108:14
|
||||
|
|
||||
LL | for i in 0..0 {
|
||||
| ^^^^ help: try replacing the loop by: `dst[..0].clone_from_slice(&src[..0])`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/manual_memcpy.rs:120:14
|
||||
|
|
||||
LL | for i in 0..src.len() {
|
||||
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])`
|
||||
|
||||
error: aborting due to 13 previous errors
|
||||
|
||||
88
tests/ui/manual_memcpy/with_loop_counters.rs
Normal file
88
tests/ui/manual_memcpy/with_loop_counters.rs
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
#![warn(clippy::needless_range_loop, clippy::manual_memcpy)]
|
||||
|
||||
pub fn manual_copy_with_counters(src: &[i32], dst: &mut [i32], dst2: &mut [i32]) {
|
||||
let mut count = 0;
|
||||
for i in 3..src.len() {
|
||||
dst[i] = src[count];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 0;
|
||||
for i in 3..src.len() {
|
||||
dst[count] = src[i];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 3;
|
||||
for i in 0..src.len() {
|
||||
dst[count] = src[i];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 3;
|
||||
for i in 0..src.len() {
|
||||
dst[i] = src[count];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 0;
|
||||
for i in 3..(3 + src.len()) {
|
||||
dst[i] = src[count];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 3;
|
||||
for i in 5..src.len() {
|
||||
dst[i] = src[count - 2];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 2;
|
||||
for i in 0..dst.len() {
|
||||
dst[i] = src[count];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 5;
|
||||
for i in 3..10 {
|
||||
dst[i] = src[count];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut count = 3;
|
||||
let mut count2 = 30;
|
||||
for i in 0..src.len() {
|
||||
dst[count] = src[i];
|
||||
dst2[count2] = src[i];
|
||||
count += 1;
|
||||
count2 += 1;
|
||||
}
|
||||
|
||||
// make sure parentheses are added properly to bitwise operators, which have lower precedence than
|
||||
// arithmetric ones
|
||||
let mut count = 0 << 1;
|
||||
for i in 0..1 << 1 {
|
||||
dst[count] = src[i + 2];
|
||||
count += 1;
|
||||
}
|
||||
|
||||
// make sure incrementing expressions without semicolons at the end of loops are handled correctly.
|
||||
let mut count = 0;
|
||||
for i in 3..src.len() {
|
||||
dst[i] = src[count];
|
||||
count += 1
|
||||
}
|
||||
|
||||
// make sure ones where the increment is not at the end of the loop.
|
||||
// As a possible enhancement, one could adjust the offset in the suggestion according to
|
||||
// the position. For example, if the increment is at the top of the loop;
|
||||
// treating the loop counter as if it were initialized 1 greater than the original value.
|
||||
let mut count = 0;
|
||||
#[allow(clippy::needless_range_loop)]
|
||||
for i in 0..src.len() {
|
||||
count += 1;
|
||||
dst[i] = src[count];
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
111
tests/ui/manual_memcpy/with_loop_counters.stderr
Normal file
111
tests/ui/manual_memcpy/with_loop_counters.stderr
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:5:5
|
||||
|
|
||||
LL | / for i in 3..src.len() {
|
||||
LL | | dst[i] = src[count];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[3..src.len()].clone_from_slice(&src[..(src.len() - 3)]);`
|
||||
|
|
||||
= note: `-D clippy::manual-memcpy` implied by `-D warnings`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:11:5
|
||||
|
|
||||
LL | / for i in 3..src.len() {
|
||||
LL | | dst[count] = src[i];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[..(src.len() - 3)].clone_from_slice(&src[3..]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:17:5
|
||||
|
|
||||
LL | / for i in 0..src.len() {
|
||||
LL | | dst[count] = src[i];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[3..(src.len() + 3)].clone_from_slice(&src[..]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:23:5
|
||||
|
|
||||
LL | / for i in 0..src.len() {
|
||||
LL | | dst[i] = src[count];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[3..(src.len() + 3)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:29:5
|
||||
|
|
||||
LL | / for i in 3..(3 + src.len()) {
|
||||
LL | | dst[i] = src[count];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[3..((3 + src.len()))].clone_from_slice(&src[..((3 + src.len()) - 3)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:35:5
|
||||
|
|
||||
LL | / for i in 5..src.len() {
|
||||
LL | | dst[i] = src[count - 2];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[5..src.len()].clone_from_slice(&src[(3 - 2)..((src.len() - 2) + 3 - 5)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:41:5
|
||||
|
|
||||
LL | / for i in 0..dst.len() {
|
||||
LL | | dst[i] = src[count];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst.clone_from_slice(&src[2..(dst.len() + 2)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:47:5
|
||||
|
|
||||
LL | / for i in 3..10 {
|
||||
LL | | dst[i] = src[count];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[3..10].clone_from_slice(&src[5..(10 + 5 - 3)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:54:5
|
||||
|
|
||||
LL | / for i in 0..src.len() {
|
||||
LL | | dst[count] = src[i];
|
||||
LL | | dst2[count2] = src[i];
|
||||
LL | | count += 1;
|
||||
LL | | count2 += 1;
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
help: try replacing the loop by
|
||||
|
|
||||
LL | dst[3..(src.len() + 3)].clone_from_slice(&src[..]);
|
||||
LL | dst2[30..(src.len() + 30)].clone_from_slice(&src[..]);
|
||||
|
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:64:5
|
||||
|
|
||||
LL | / for i in 0..1 << 1 {
|
||||
LL | | dst[count] = src[i + 2];
|
||||
LL | | count += 1;
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[(0 << 1)..((1 << 1) + (0 << 1))].clone_from_slice(&src[2..((1 << 1) + 2)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/with_loop_counters.rs:71:5
|
||||
|
|
||||
LL | / for i in 3..src.len() {
|
||||
LL | | dst[i] = src[count];
|
||||
LL | | count += 1
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[3..src.len()].clone_from_slice(&src[..(src.len() - 3)]);`
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
|
||||
115
tests/ui/manual_memcpy/without_loop_counters.stderr
Normal file
115
tests/ui/manual_memcpy/without_loop_counters.stderr
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:7:5
|
||||
|
|
||||
LL | / for i in 0..src.len() {
|
||||
LL | | dst[i] = src[i];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..]);`
|
||||
|
|
||||
= note: `-D clippy::manual-memcpy` implied by `-D warnings`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:12:5
|
||||
|
|
||||
LL | / for i in 0..src.len() {
|
||||
LL | | dst[i + 10] = src[i];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[10..(src.len() + 10)].clone_from_slice(&src[..]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:17:5
|
||||
|
|
||||
LL | / for i in 0..src.len() {
|
||||
LL | | dst[i] = src[i + 10];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[10..(src.len() + 10)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:22:5
|
||||
|
|
||||
LL | / for i in 11..src.len() {
|
||||
LL | | dst[i] = src[i - 10];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[11..src.len()].clone_from_slice(&src[(11 - 10)..(src.len() - 10)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:27:5
|
||||
|
|
||||
LL | / for i in 0..dst.len() {
|
||||
LL | | dst[i] = src[i];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst.clone_from_slice(&src[..dst.len()]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:40:5
|
||||
|
|
||||
LL | / for i in 10..256 {
|
||||
LL | | dst[i] = src[i - 5];
|
||||
LL | | dst2[i + 500] = src[i]
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
help: try replacing the loop by
|
||||
|
|
||||
LL | dst[10..256].clone_from_slice(&src[(10 - 5)..(256 - 5)]);
|
||||
LL | dst2[(10 + 500)..(256 + 500)].clone_from_slice(&src[10..256]);
|
||||
|
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:52:5
|
||||
|
|
||||
LL | / for i in 10..LOOP_OFFSET {
|
||||
LL | | dst[i + LOOP_OFFSET] = src[i - some_var];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[(10 + LOOP_OFFSET)..(LOOP_OFFSET + LOOP_OFFSET)].clone_from_slice(&src[(10 - some_var)..(LOOP_OFFSET - some_var)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:65:5
|
||||
|
|
||||
LL | / for i in 0..src_vec.len() {
|
||||
LL | | dst_vec[i] = src_vec[i];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst_vec[..src_vec.len()].clone_from_slice(&src_vec[..]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:94:5
|
||||
|
|
||||
LL | / for i in from..from + src.len() {
|
||||
LL | | dst[i] = src[i - from];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[from..(from + src.len())].clone_from_slice(&src[..(from + src.len() - from)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:98:5
|
||||
|
|
||||
LL | / for i in from..from + 3 {
|
||||
LL | | dst[i] = src[i - from];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[from..(from + 3)].clone_from_slice(&src[..(from + 3 - from)]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:103:5
|
||||
|
|
||||
LL | / for i in 0..5 {
|
||||
LL | | dst[i - 0] = src[i];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[..5].clone_from_slice(&src[..5]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:108:5
|
||||
|
|
||||
LL | / for i in 0..0 {
|
||||
LL | | dst[i] = src[i];
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[..0].clone_from_slice(&src[..0]);`
|
||||
|
||||
error: it looks like you're manually copying between slices
|
||||
--> $DIR/without_loop_counters.rs:120:5
|
||||
|
|
||||
LL | / for i in 0..src.len() {
|
||||
LL | | dst[i] = src[i].clone();
|
||||
LL | | }
|
||||
| |_____^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..]);`
|
||||
|
||||
error: aborting due to 13 previous errors
|
||||
|
||||
68
tests/ui/manual_unwrap_or.fixed
Normal file
68
tests/ui/manual_unwrap_or.fixed
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
// run-rustfix
|
||||
#![allow(dead_code)]
|
||||
|
||||
fn unwrap_or() {
|
||||
// int case
|
||||
Some(1).unwrap_or(42);
|
||||
|
||||
// int case reversed
|
||||
Some(1).unwrap_or(42);
|
||||
|
||||
// richer none expr
|
||||
Some(1).unwrap_or(1 + 42);
|
||||
|
||||
// multiline case
|
||||
#[rustfmt::skip]
|
||||
Some(1).unwrap_or({
|
||||
42 + 42
|
||||
+ 42 + 42 + 42
|
||||
+ 42 + 42 + 42
|
||||
});
|
||||
|
||||
// string case
|
||||
Some("Bob").unwrap_or("Alice");
|
||||
|
||||
// don't lint
|
||||
match Some(1) {
|
||||
Some(i) => i + 2,
|
||||
None => 42,
|
||||
};
|
||||
match Some(1) {
|
||||
Some(i) => i,
|
||||
None => return,
|
||||
};
|
||||
for j in 0..4 {
|
||||
match Some(j) {
|
||||
Some(i) => i,
|
||||
None => continue,
|
||||
};
|
||||
match Some(j) {
|
||||
Some(i) => i,
|
||||
None => break,
|
||||
};
|
||||
}
|
||||
|
||||
// cases where the none arm isn't a constant expression
|
||||
// are not linted due to potential ownership issues
|
||||
|
||||
// ownership issue example, don't lint
|
||||
struct NonCopyable;
|
||||
let mut option: Option<NonCopyable> = None;
|
||||
match option {
|
||||
Some(x) => x,
|
||||
None => {
|
||||
option = Some(NonCopyable);
|
||||
// some more code ...
|
||||
option.unwrap()
|
||||
},
|
||||
};
|
||||
|
||||
// ownership issue example, don't lint
|
||||
let option: Option<&str> = None;
|
||||
match option {
|
||||
Some(s) => s,
|
||||
None => &format!("{} {}!", "hello", "world"),
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
83
tests/ui/manual_unwrap_or.rs
Normal file
83
tests/ui/manual_unwrap_or.rs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
// run-rustfix
|
||||
#![allow(dead_code)]
|
||||
|
||||
fn unwrap_or() {
|
||||
// int case
|
||||
match Some(1) {
|
||||
Some(i) => i,
|
||||
None => 42,
|
||||
};
|
||||
|
||||
// int case reversed
|
||||
match Some(1) {
|
||||
None => 42,
|
||||
Some(i) => i,
|
||||
};
|
||||
|
||||
// richer none expr
|
||||
match Some(1) {
|
||||
Some(i) => i,
|
||||
None => 1 + 42,
|
||||
};
|
||||
|
||||
// multiline case
|
||||
#[rustfmt::skip]
|
||||
match Some(1) {
|
||||
Some(i) => i,
|
||||
None => {
|
||||
42 + 42
|
||||
+ 42 + 42 + 42
|
||||
+ 42 + 42 + 42
|
||||
}
|
||||
};
|
||||
|
||||
// string case
|
||||
match Some("Bob") {
|
||||
Some(i) => i,
|
||||
None => "Alice",
|
||||
};
|
||||
|
||||
// don't lint
|
||||
match Some(1) {
|
||||
Some(i) => i + 2,
|
||||
None => 42,
|
||||
};
|
||||
match Some(1) {
|
||||
Some(i) => i,
|
||||
None => return,
|
||||
};
|
||||
for j in 0..4 {
|
||||
match Some(j) {
|
||||
Some(i) => i,
|
||||
None => continue,
|
||||
};
|
||||
match Some(j) {
|
||||
Some(i) => i,
|
||||
None => break,
|
||||
};
|
||||
}
|
||||
|
||||
// cases where the none arm isn't a constant expression
|
||||
// are not linted due to potential ownership issues
|
||||
|
||||
// ownership issue example, don't lint
|
||||
struct NonCopyable;
|
||||
let mut option: Option<NonCopyable> = None;
|
||||
match option {
|
||||
Some(x) => x,
|
||||
None => {
|
||||
option = Some(NonCopyable);
|
||||
// some more code ...
|
||||
option.unwrap()
|
||||
},
|
||||
};
|
||||
|
||||
// ownership issue example, don't lint
|
||||
let option: Option<&str> = None;
|
||||
match option {
|
||||
Some(s) => s,
|
||||
None => &format!("{} {}!", "hello", "world"),
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
61
tests/ui/manual_unwrap_or.stderr
Normal file
61
tests/ui/manual_unwrap_or.stderr
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
error: this pattern reimplements `Option::unwrap_or`
|
||||
--> $DIR/manual_unwrap_or.rs:6:5
|
||||
|
|
||||
LL | / match Some(1) {
|
||||
LL | | Some(i) => i,
|
||||
LL | | None => 42,
|
||||
LL | | };
|
||||
| |_____^ help: replace with: `Some(1).unwrap_or(42)`
|
||||
|
|
||||
= note: `-D clippy::manual-unwrap-or` implied by `-D warnings`
|
||||
|
||||
error: this pattern reimplements `Option::unwrap_or`
|
||||
--> $DIR/manual_unwrap_or.rs:12:5
|
||||
|
|
||||
LL | / match Some(1) {
|
||||
LL | | None => 42,
|
||||
LL | | Some(i) => i,
|
||||
LL | | };
|
||||
| |_____^ help: replace with: `Some(1).unwrap_or(42)`
|
||||
|
||||
error: this pattern reimplements `Option::unwrap_or`
|
||||
--> $DIR/manual_unwrap_or.rs:18:5
|
||||
|
|
||||
LL | / match Some(1) {
|
||||
LL | | Some(i) => i,
|
||||
LL | | None => 1 + 42,
|
||||
LL | | };
|
||||
| |_____^ help: replace with: `Some(1).unwrap_or(1 + 42)`
|
||||
|
||||
error: this pattern reimplements `Option::unwrap_or`
|
||||
--> $DIR/manual_unwrap_or.rs:25:5
|
||||
|
|
||||
LL | / match Some(1) {
|
||||
LL | | Some(i) => i,
|
||||
LL | | None => {
|
||||
LL | | 42 + 42
|
||||
... |
|
||||
LL | | }
|
||||
LL | | };
|
||||
| |_____^
|
||||
|
|
||||
help: replace with
|
||||
|
|
||||
LL | Some(1).unwrap_or({
|
||||
LL | 42 + 42
|
||||
LL | + 42 + 42 + 42
|
||||
LL | + 42 + 42 + 42
|
||||
LL | });
|
||||
|
|
||||
|
||||
error: this pattern reimplements `Option::unwrap_or`
|
||||
--> $DIR/manual_unwrap_or.rs:35:5
|
||||
|
|
||||
LL | / match Some("Bob") {
|
||||
LL | | Some(i) => i,
|
||||
LL | | None => "Alice",
|
||||
LL | | };
|
||||
| |_____^ help: replace with: `Some("Bob").unwrap_or("Alice")`
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
38
tests/ui/ptr_eq.fixed
Normal file
38
tests/ui/ptr_eq.fixed
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
// run-rustfix
|
||||
#![warn(clippy::ptr_eq)]
|
||||
|
||||
macro_rules! mac {
|
||||
($a:expr, $b:expr) => {
|
||||
$a as *const _ as usize == $b as *const _ as usize
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! another_mac {
|
||||
($a:expr, $b:expr) => {
|
||||
$a as *const _ == $b as *const _
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let a = &[1, 2, 3];
|
||||
let b = &[1, 2, 3];
|
||||
|
||||
let _ = std::ptr::eq(a, b);
|
||||
let _ = std::ptr::eq(a, b);
|
||||
let _ = a.as_ptr() == b as *const _;
|
||||
let _ = a.as_ptr() == b.as_ptr();
|
||||
|
||||
// Do not lint
|
||||
|
||||
let _ = mac!(a, b);
|
||||
let _ = another_mac!(a, b);
|
||||
|
||||
let a = &mut [1, 2, 3];
|
||||
let b = &mut [1, 2, 3];
|
||||
|
||||
let _ = a.as_mut_ptr() == b as *mut [i32] as *mut _;
|
||||
let _ = a.as_mut_ptr() == b.as_mut_ptr();
|
||||
|
||||
let _ = a == b;
|
||||
let _ = core::ptr::eq(a, b);
|
||||
}
|
||||
38
tests/ui/ptr_eq.rs
Normal file
38
tests/ui/ptr_eq.rs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
// run-rustfix
|
||||
#![warn(clippy::ptr_eq)]
|
||||
|
||||
macro_rules! mac {
|
||||
($a:expr, $b:expr) => {
|
||||
$a as *const _ as usize == $b as *const _ as usize
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! another_mac {
|
||||
($a:expr, $b:expr) => {
|
||||
$a as *const _ == $b as *const _
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let a = &[1, 2, 3];
|
||||
let b = &[1, 2, 3];
|
||||
|
||||
let _ = a as *const _ as usize == b as *const _ as usize;
|
||||
let _ = a as *const _ == b as *const _;
|
||||
let _ = a.as_ptr() == b as *const _;
|
||||
let _ = a.as_ptr() == b.as_ptr();
|
||||
|
||||
// Do not lint
|
||||
|
||||
let _ = mac!(a, b);
|
||||
let _ = another_mac!(a, b);
|
||||
|
||||
let a = &mut [1, 2, 3];
|
||||
let b = &mut [1, 2, 3];
|
||||
|
||||
let _ = a.as_mut_ptr() == b as *mut [i32] as *mut _;
|
||||
let _ = a.as_mut_ptr() == b.as_mut_ptr();
|
||||
|
||||
let _ = a == b;
|
||||
let _ = core::ptr::eq(a, b);
|
||||
}
|
||||
16
tests/ui/ptr_eq.stderr
Normal file
16
tests/ui/ptr_eq.stderr
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
error: use `std::ptr::eq` when comparing raw pointers
|
||||
--> $DIR/ptr_eq.rs:20:13
|
||||
|
|
||||
LL | let _ = a as *const _ as usize == b as *const _ as usize;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::ptr::eq(a, b)`
|
||||
|
|
||||
= note: `-D clippy::ptr-eq` implied by `-D warnings`
|
||||
|
||||
error: use `std::ptr::eq` when comparing raw pointers
|
||||
--> $DIR/ptr_eq.rs:21:13
|
||||
|
|
||||
LL | let _ = a as *const _ == b as *const _;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::ptr::eq(a, b)`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
38
tests/ui/result_unit_error.rs
Normal file
38
tests/ui/result_unit_error.rs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
#[warn(clippy::result_unit_err)]
|
||||
#[allow(unused)]
|
||||
|
||||
pub fn returns_unit_error() -> Result<u32, ()> {
|
||||
Err(())
|
||||
}
|
||||
|
||||
fn private_unit_errors() -> Result<String, ()> {
|
||||
Err(())
|
||||
}
|
||||
|
||||
pub trait HasUnitError {
|
||||
fn get_that_error(&self) -> Result<bool, ()>;
|
||||
|
||||
fn get_this_one_too(&self) -> Result<bool, ()> {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
|
||||
impl HasUnitError for () {
|
||||
fn get_that_error(&self) -> Result<bool, ()> {
|
||||
Ok(true)
|
||||
}
|
||||
}
|
||||
|
||||
trait PrivateUnitError {
|
||||
fn no_problem(&self) -> Result<usize, ()>;
|
||||
}
|
||||
|
||||
pub struct UnitErrorHolder;
|
||||
|
||||
impl UnitErrorHolder {
|
||||
pub fn unit_error(&self) -> Result<usize, ()> {
|
||||
Ok(0)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
35
tests/ui/result_unit_error.stderr
Normal file
35
tests/ui/result_unit_error.stderr
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
error: this returns a `Result<_, ()>
|
||||
--> $DIR/result_unit_error.rs:4:1
|
||||
|
|
||||
LL | pub fn returns_unit_error() -> Result<u32, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::result-unit-err` implied by `-D warnings`
|
||||
= help: use a custom Error type instead
|
||||
|
||||
error: this returns a `Result<_, ()>
|
||||
--> $DIR/result_unit_error.rs:13:5
|
||||
|
|
||||
LL | fn get_that_error(&self) -> Result<bool, ()>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: use a custom Error type instead
|
||||
|
||||
error: this returns a `Result<_, ()>
|
||||
--> $DIR/result_unit_error.rs:15:5
|
||||
|
|
||||
LL | fn get_this_one_too(&self) -> Result<bool, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: use a custom Error type instead
|
||||
|
||||
error: this returns a `Result<_, ()>
|
||||
--> $DIR/result_unit_error.rs:33:5
|
||||
|
|
||||
LL | pub fn unit_error(&self) -> Result<usize, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: use a custom Error type instead
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
|
@ -77,4 +77,14 @@ fn ifs_same_cond_fn() {
|
|||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
fn main() {
|
||||
// macro as condition (see #6168)
|
||||
let os = if cfg!(target_os = "macos") {
|
||||
"macos"
|
||||
} else if cfg!(target_os = "windows") {
|
||||
"windows"
|
||||
} else {
|
||||
"linux"
|
||||
};
|
||||
println!("{}", os);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#![allow(
|
||||
unused_parens,
|
||||
unused_variables,
|
||||
clippy::manual_unwrap_or,
|
||||
clippy::missing_docs_in_private_items,
|
||||
clippy::single_match
|
||||
)]
|
||||
|
|
|
|||
|
|
@ -1,135 +1,135 @@
|
|||
error: `x` is shadowed by itself in `&mut x`
|
||||
--> $DIR/shadow.rs:26:5
|
||||
--> $DIR/shadow.rs:27:5
|
||||
|
|
||||
LL | let x = &mut x;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::shadow-same` implied by `-D warnings`
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:25:13
|
||||
--> $DIR/shadow.rs:26:13
|
||||
|
|
||||
LL | let mut x = 1;
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by itself in `{ x }`
|
||||
--> $DIR/shadow.rs:27:5
|
||||
|
|
||||
LL | let x = { x };
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:26:9
|
||||
|
|
||||
LL | let x = &mut x;
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by itself in `(&*x)`
|
||||
--> $DIR/shadow.rs:28:5
|
||||
|
|
||||
LL | let x = (&*x);
|
||||
LL | let x = { x };
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:27:9
|
||||
|
|
||||
LL | let x = &mut x;
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by itself in `(&*x)`
|
||||
--> $DIR/shadow.rs:29:5
|
||||
|
|
||||
LL | let x = (&*x);
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:28:9
|
||||
|
|
||||
LL | let x = { x };
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by `{ *x + 1 }` which reuses the original value
|
||||
--> $DIR/shadow.rs:29:9
|
||||
--> $DIR/shadow.rs:30:9
|
||||
|
|
||||
LL | let x = { *x + 1 };
|
||||
| ^
|
||||
|
|
||||
= note: `-D clippy::shadow-reuse` implied by `-D warnings`
|
||||
note: initialization happens here
|
||||
--> $DIR/shadow.rs:29:13
|
||||
--> $DIR/shadow.rs:30:13
|
||||
|
|
||||
LL | let x = { *x + 1 };
|
||||
| ^^^^^^^^^^
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:28:9
|
||||
--> $DIR/shadow.rs:29:9
|
||||
|
|
||||
LL | let x = (&*x);
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by `id(x)` which reuses the original value
|
||||
--> $DIR/shadow.rs:30:9
|
||||
|
|
||||
LL | let x = id(x);
|
||||
| ^
|
||||
|
|
||||
note: initialization happens here
|
||||
--> $DIR/shadow.rs:30:13
|
||||
|
|
||||
LL | let x = id(x);
|
||||
| ^^^^^
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:29:9
|
||||
|
|
||||
LL | let x = { *x + 1 };
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by `(1, x)` which reuses the original value
|
||||
--> $DIR/shadow.rs:31:9
|
||||
|
|
||||
LL | let x = (1, x);
|
||||
LL | let x = id(x);
|
||||
| ^
|
||||
|
|
||||
note: initialization happens here
|
||||
--> $DIR/shadow.rs:31:13
|
||||
|
|
||||
LL | let x = (1, x);
|
||||
| ^^^^^^
|
||||
LL | let x = id(x);
|
||||
| ^^^^^
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:30:9
|
||||
|
|
||||
LL | let x = id(x);
|
||||
LL | let x = { *x + 1 };
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by `first(x)` which reuses the original value
|
||||
error: `x` is shadowed by `(1, x)` which reuses the original value
|
||||
--> $DIR/shadow.rs:32:9
|
||||
|
|
||||
LL | let x = first(x);
|
||||
LL | let x = (1, x);
|
||||
| ^
|
||||
|
|
||||
note: initialization happens here
|
||||
--> $DIR/shadow.rs:32:13
|
||||
|
|
||||
LL | let x = (1, x);
|
||||
| ^^^^^^
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:31:9
|
||||
|
|
||||
LL | let x = id(x);
|
||||
| ^
|
||||
|
||||
error: `x` is shadowed by `first(x)` which reuses the original value
|
||||
--> $DIR/shadow.rs:33:9
|
||||
|
|
||||
LL | let x = first(x);
|
||||
| ^
|
||||
|
|
||||
note: initialization happens here
|
||||
--> $DIR/shadow.rs:33:13
|
||||
|
|
||||
LL | let x = first(x);
|
||||
| ^^^^^^^^
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:31:9
|
||||
--> $DIR/shadow.rs:32:9
|
||||
|
|
||||
LL | let x = (1, x);
|
||||
| ^
|
||||
|
||||
error: `x` is being shadowed
|
||||
--> $DIR/shadow.rs:34:9
|
||||
--> $DIR/shadow.rs:35:9
|
||||
|
|
||||
LL | let x = y;
|
||||
| ^
|
||||
|
|
||||
= note: `-D clippy::shadow-unrelated` implied by `-D warnings`
|
||||
note: initialization happens here
|
||||
--> $DIR/shadow.rs:34:13
|
||||
--> $DIR/shadow.rs:35:13
|
||||
|
|
||||
LL | let x = y;
|
||||
| ^
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:32:9
|
||||
--> $DIR/shadow.rs:33:9
|
||||
|
|
||||
LL | let x = first(x);
|
||||
| ^
|
||||
|
||||
error: `x` shadows a previous declaration
|
||||
--> $DIR/shadow.rs:36:5
|
||||
--> $DIR/shadow.rs:37:5
|
||||
|
|
||||
LL | let x;
|
||||
| ^^^^^^
|
||||
|
|
||||
note: previous binding is here
|
||||
--> $DIR/shadow.rs:34:9
|
||||
--> $DIR/shadow.rs:35:9
|
||||
|
|
||||
LL | let x = y;
|
||||
| ^
|
||||
|
|
|
|||
|
|
@ -30,15 +30,27 @@ while [[ "$1" != "" ]]; do
|
|||
! (cmp -s -- "$BUILD_DIR"/"$STDOUT_NAME" "$MYDIR"/"$STDOUT_NAME"); then
|
||||
echo updating "$MYDIR"/"$STDOUT_NAME"
|
||||
cp "$BUILD_DIR"/"$STDOUT_NAME" "$MYDIR"/"$STDOUT_NAME"
|
||||
if [[ ! -s "$MYDIR"/"$STDOUT_NAME" ]]; then
|
||||
echo removing "$MYDIR"/"$STDOUT_NAME"
|
||||
rm "$MYDIR"/"$STDOUT_NAME"
|
||||
fi
|
||||
fi
|
||||
if [[ -f "$BUILD_DIR"/"$STDERR_NAME" ]] && \
|
||||
! (cmp -s -- "$BUILD_DIR"/"$STDERR_NAME" "$MYDIR"/"$STDERR_NAME"); then
|
||||
echo updating "$MYDIR"/"$STDERR_NAME"
|
||||
cp "$BUILD_DIR"/"$STDERR_NAME" "$MYDIR"/"$STDERR_NAME"
|
||||
if [[ ! -s "$MYDIR"/"$STDERR_NAME" ]]; then
|
||||
echo removing "$MYDIR"/"$STDERR_NAME"
|
||||
rm "$MYDIR"/"$STDERR_NAME"
|
||||
fi
|
||||
fi
|
||||
if [[ -f "$BUILD_DIR"/"$FIXED_NAME" ]] && \
|
||||
! (cmp -s -- "$BUILD_DIR"/"$FIXED_NAME" "$MYDIR"/"$FIXED_NAME"); then
|
||||
echo updating "$MYDIR"/"$FIXED_NAME"
|
||||
cp "$BUILD_DIR"/"$FIXED_NAME" "$MYDIR"/"$FIXED_NAME"
|
||||
if [[ ! -s "$MYDIR"/"$FIXED_NAME" ]]; then
|
||||
echo removing "$MYDIR"/"$FIXED_NAME"
|
||||
rm "$MYDIR"/"$FIXED_NAME"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#![feature(rustc_private)]
|
||||
#![warn(clippy::all)]
|
||||
#![allow(clippy::blacklisted_name)]
|
||||
#![allow(clippy::blacklisted_name, clippy::eq_op)]
|
||||
#![warn(clippy::used_underscore_binding)]
|
||||
|
||||
#[macro_use]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue