Merge commit 'b794b8e08c' into clippy-subtree-update

This commit is contained in:
Philipp Krones 2024-07-11 15:44:03 +02:00
commit 2ed6ed41be
No known key found for this signature in database
GPG key ID: 1CA0DF2AF59D68A5
191 changed files with 4157 additions and 2504 deletions

View file

@ -1,22 +1,18 @@
error: use of a disallowed method `rustc_lint::context::LintContext::span_lint`
--> tests/ui-internal/disallow_span_lint.rs:14:5
--> tests/ui-internal/disallow_span_lint.rs:14:8
|
LL | / cx.span_lint(lint, span, |lint| {
LL | | lint.primary_message(msg);
LL | | });
| |______^
LL | cx.span_lint(lint, span, |lint| {
| ^^^^^^^^^
|
= note: this function does not add a link to our documentation, please use the `clippy_utils::diagnostics::span_lint*` functions instead (from clippy.toml)
= note: `-D clippy::disallowed-methods` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::disallowed_methods)]`
error: use of a disallowed method `rustc_middle::ty::context::TyCtxt::node_span_lint`
--> tests/ui-internal/disallow_span_lint.rs:20:5
--> tests/ui-internal/disallow_span_lint.rs:20:9
|
LL | / tcx.node_span_lint(lint, hir_id, span, |lint| {
LL | | lint.primary_message(msg);
LL | | });
| |______^
LL | tcx.node_span_lint(lint, hir_id, span, |lint| {
| ^^^^^^^^^^^^^^
|
= note: this function does not add a link to our documentation, please use the `clippy_utils::diagnostics::span_lint_hir*` functions instead (from clippy.toml)

View file

@ -1,4 +1,4 @@
error: `std::string::String` may not be held across an `await` point per `clippy.toml`
error: `std::string::String` may not be held across an await point per `clippy.toml`
--> tests/ui-toml/await_holding_invalid_type/await_holding_invalid_type.rs:5:9
|
LL | let _x = String::from("hello");
@ -8,13 +8,13 @@ LL | let _x = String::from("hello");
= note: `-D clippy::await-holding-invalid-type` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::await_holding_invalid_type)]`
error: `std::net::Ipv4Addr` may not be held across an `await` point per `clippy.toml`
error: `std::net::Ipv4Addr` may not be held across an await point per `clippy.toml`
--> tests/ui-toml/await_holding_invalid_type/await_holding_invalid_type.rs:10:9
|
LL | let x = Ipv4Addr::new(127, 0, 0, 1);
| ^
error: `std::string::String` may not be held across an `await` point per `clippy.toml`
error: `std::string::String` may not be held across an await point per `clippy.toml`
--> tests/ui-toml/await_holding_invalid_type/await_holding_invalid_type.rs:33:13
|
LL | let _x = String::from("hi!");

View file

@ -0,0 +1 @@
avoid-breaking-exported-api = false

View file

@ -0,0 +1,10 @@
#![warn(clippy::needless_pass_by_ref_mut)]
#![allow(clippy::ptr_arg)]
// Should warn
pub fn pub_foo(s: &Vec<u32>, b: &u32, x: &mut u32) {
//~^ ERROR: this argument is a mutable reference, but not used mutably
*x += *b + s.len() as u32;
}
fn main() {}

View file

@ -0,0 +1,10 @@
#![warn(clippy::needless_pass_by_ref_mut)]
#![allow(clippy::ptr_arg)]
// Should warn
pub fn pub_foo(s: &mut Vec<u32>, b: &u32, x: &mut u32) {
//~^ ERROR: this argument is a mutable reference, but not used mutably
*x += *b + s.len() as u32;
}
fn main() {}

View file

@ -0,0 +1,12 @@
error: this argument is a mutable reference, but not used mutably
--> tests/ui-toml/needless_pass_by_ref_mut/needless_pass_by_ref_mut.rs:5:19
|
LL | pub fn pub_foo(s: &mut Vec<u32>, b: &u32, x: &mut u32) {
| ^^^^^^^^^^^^^ help: consider changing to: `&Vec<u32>`
|
= warning: changing this function will impact semver compatibility
= note: `-D clippy::needless-pass-by-ref-mut` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_pass_by_ref_mut)]`
error: aborting due to 1 previous error

View file

@ -2,36 +2,36 @@ error: use of a disallowed method `regex::Regex::new`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:35:14
|
LL | let re = Regex::new(r"ab.*c").unwrap();
| ^^^^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^
|
= note: `-D clippy::disallowed-methods` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::disallowed_methods)]`
error: use of a disallowed method `regex::Regex::is_match`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:36:5
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:36:8
|
LL | re.is_match("abc");
| ^^^^^^^^^^^^^^^^^^
| ^^^^^^^^
|
= note: no matching allowed (from clippy.toml)
error: use of a disallowed method `std::iter::Iterator::sum`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:39:5
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:39:14
|
LL | a.iter().sum::<i32>();
| ^^^^^^^^^^^^^^^^^^^^^
| ^^^
error: use of a disallowed method `slice::sort_unstable`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:41:5
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:41:7
|
LL | a.sort_unstable();
| ^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^^^^
error: use of a disallowed method `f32::clamp`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:44:13
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:44:20
|
LL | let _ = 2.0f32.clamp(3.0f32, 4.0f32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| ^^^^^
error: use of a disallowed method `regex::Regex::new`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:47:61
@ -55,37 +55,37 @@ error: use of a disallowed method `futures::stream::select_all`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:54:31
|
LL | let same_name_as_module = select_all(vec![empty::<()>()]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^
error: use of a disallowed method `conf_disallowed_methods::local_fn`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:56:5
|
LL | local_fn();
| ^^^^^^^^^^
| ^^^^^^^^
error: use of a disallowed method `conf_disallowed_methods::local_mod::f`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:57:5
|
LL | local_mod::f();
| ^^^^^^^^^^^^^^
| ^^^^^^^^^^^^
error: use of a disallowed method `conf_disallowed_methods::Struct::method`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:59:5
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:59:7
|
LL | s.method();
| ^^^^^^^^^^
| ^^^^^^
error: use of a disallowed method `conf_disallowed_methods::Trait::provided_method`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:60:5
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:60:7
|
LL | s.provided_method();
| ^^^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^^^^^^
error: use of a disallowed method `conf_disallowed_methods::Trait::implemented_method`
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:61:5
--> tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs:61:7
|
LL | s.implemented_method();
| ^^^^^^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^^^^^^^^^
error: aborting due to 14 previous errors

View file

@ -1,4 +1,4 @@
#![allow(non_fmt_panics, clippy::needless_bool)]
#![allow(non_fmt_panics, clippy::needless_bool, clippy::eq_op)]
macro_rules! assert_const {
($len:expr) => {
@ -49,7 +49,16 @@ fn main() {
const _: () = assert!(true);
//~^ ERROR: `assert!(true)` will be optimized out by the compiler
assert!(8 == (7 + 1));
//~^ ERROR: `assert!(true)` will be optimized out by the compiler
// Don't lint if the value is dependent on a defined constant:
const N: usize = 1024;
const _: () = assert!(N.is_power_of_two());
}
const _: () = {
assert!(true);
//~^ ERROR: `assert!(true)` will be optimized out by the compiler
assert!(8 == (7 + 1));
};

View file

@ -80,5 +80,21 @@ LL | const _: () = assert!(true);
|
= help: remove it
error: aborting due to 10 previous errors
error: `assert!(true)` will be optimized out by the compiler
--> tests/ui/assertions_on_constants.rs:52:5
|
LL | assert!(8 == (7 + 1));
| ^^^^^^^^^^^^^^^^^^^^^
|
= help: remove it
error: `assert!(true)` will be optimized out by the compiler
--> tests/ui/assertions_on_constants.rs:61:5
|
LL | assert!(true);
| ^^^^^^^^^^^^^
|
= help: remove it
error: aborting due to 12 previous errors

View file

@ -8,7 +8,7 @@ mod std_mutex {
pub async fn bad(x: &Mutex<u32>) -> u32 {
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
@ -24,13 +24,13 @@ mod std_mutex {
pub async fn bad_rw(x: &RwLock<u32>) -> u32 {
let guard = x.read().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
pub async fn bad_rw_write(x: &RwLock<u32>) -> u32 {
let mut guard = x.write().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
@ -52,7 +52,7 @@ mod std_mutex {
let first = baz().await;
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
let second = baz().await;
@ -66,7 +66,7 @@ mod std_mutex {
let second = {
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
};
@ -79,7 +79,7 @@ mod std_mutex {
pub fn block_bad(x: &Mutex<u32>) -> impl std::future::Future<Output = u32> + '_ {
async move {
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
}
@ -92,7 +92,7 @@ mod parking_lot_mutex {
pub async fn bad(x: &Mutex<u32>) -> u32 {
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
@ -108,13 +108,13 @@ mod parking_lot_mutex {
pub async fn bad_rw(x: &RwLock<u32>) -> u32 {
let guard = x.read();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
pub async fn bad_rw_write(x: &RwLock<u32>) -> u32 {
let mut guard = x.write();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
@ -136,7 +136,7 @@ mod parking_lot_mutex {
let first = baz().await;
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
let second = baz().await;
@ -150,7 +150,7 @@ mod parking_lot_mutex {
let second = {
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
};
@ -163,7 +163,7 @@ mod parking_lot_mutex {
pub fn block_bad(x: &Mutex<u32>) -> impl std::future::Future<Output = u32> + '_ {
async move {
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
baz().await
}
}
@ -184,7 +184,7 @@ async fn no_await(x: std::sync::Mutex<u32>) {
// `*guard += 1` is removed it is picked up.
async fn dropped_before_await(x: std::sync::Mutex<u32>) {
let mut guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
//~^ ERROR: this `MutexGuard` is held across an await point
*guard += 1;
drop(guard);
baz().await;

View file

@ -1,11 +1,11 @@
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:10:13
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:12:15
|
LL | baz().await
@ -13,40 +13,40 @@ LL | baz().await
= note: `-D clippy::await-holding-lock` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::await_holding_lock)]`
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:26:13
|
LL | let guard = x.read().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:28:15
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:32:13
|
LL | let mut guard = x.write().unwrap();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:34:15
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:54:13
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:57:28
|
LL | let second = baz().await;
@ -55,79 +55,79 @@ LL |
LL | let third = baz().await;
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:68:17
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:70:19
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:81:17
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:83:19
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:94:13
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:96:15
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:110:13
|
LL | let guard = x.read();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:112:15
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:116:13
|
LL | let mut guard = x.write();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:118:15
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:138:13
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:141:28
|
LL | let second = baz().await;
@ -136,40 +136,40 @@ LL |
LL | let third = baz().await;
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:152:17
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:154:19
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:165:17
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:167:19
|
LL | baz().await
| ^^^^^
error: this `MutexGuard` is held across an `await` point
error: this `MutexGuard` is held across an await point
--> tests/ui/await_holding_lock.rs:186:9
|
LL | let mut guard = x.lock().unwrap();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await`
note: these are all the await points this lock is held through
--> tests/ui/await_holding_lock.rs:190:11
|
LL | baz().await;

View file

@ -4,13 +4,13 @@ use std::cell::RefCell;
async fn bad(x: &RefCell<u32>) -> u32 {
let b = x.borrow();
//~^ ERROR: this `RefCell` reference is held across an `await` point
//~^ ERROR: this `RefCell` reference is held across an await point
baz().await
}
async fn bad_mut(x: &RefCell<u32>) -> u32 {
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
//~^ ERROR: this `RefCell` reference is held across an await point
baz().await
}
@ -32,7 +32,7 @@ async fn also_bad(x: &RefCell<u32>) -> u32 {
let first = baz().await;
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
//~^ ERROR: this `RefCell` reference is held across an await point
let second = baz().await;
@ -45,7 +45,7 @@ async fn less_bad(x: &RefCell<u32>) -> u32 {
let first = baz().await;
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
//~^ ERROR: this `RefCell` reference is held across an await point
let second = baz().await;
@ -61,7 +61,7 @@ async fn not_good(x: &RefCell<u32>) -> u32 {
let second = {
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
//~^ ERROR: this `RefCell` reference is held across an await point
baz().await
};
@ -74,7 +74,7 @@ async fn not_good(x: &RefCell<u32>) -> u32 {
fn block_bad(x: &RefCell<u32>) -> impl std::future::Future<Output = u32> + '_ {
async move {
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
//~^ ERROR: this `RefCell` reference is held across an await point
baz().await
}
}

View file

@ -1,11 +1,11 @@
error: this `RefCell` reference is held across an `await` point
error: this `RefCell` reference is held across an await point
--> tests/ui/await_holding_refcell_ref.rs:6:9
|
LL | let b = x.borrow();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
note: these are all the await points this reference is held through
--> tests/ui/await_holding_refcell_ref.rs:8:11
|
LL | baz().await
@ -13,27 +13,27 @@ LL | baz().await
= note: `-D clippy::await-holding-refcell-ref` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::await_holding_refcell_ref)]`
error: this `RefCell` reference is held across an `await` point
error: this `RefCell` reference is held across an await point
--> tests/ui/await_holding_refcell_ref.rs:12:9
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
note: these are all the await points this reference is held through
--> tests/ui/await_holding_refcell_ref.rs:14:11
|
LL | baz().await
| ^^^^^
error: this `RefCell` reference is held across an `await` point
error: this `RefCell` reference is held across an await point
--> tests/ui/await_holding_refcell_ref.rs:34:9
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
note: these are all the await points this reference is held through
--> tests/ui/await_holding_refcell_ref.rs:37:24
|
LL | let second = baz().await;
@ -42,40 +42,40 @@ LL |
LL | let third = baz().await;
| ^^^^^
error: this `RefCell` reference is held across an `await` point
error: this `RefCell` reference is held across an await point
--> tests/ui/await_holding_refcell_ref.rs:47:9
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
note: these are all the await points this reference is held through
--> tests/ui/await_holding_refcell_ref.rs:50:24
|
LL | let second = baz().await;
| ^^^^^
error: this `RefCell` reference is held across an `await` point
error: this `RefCell` reference is held across an await point
--> tests/ui/await_holding_refcell_ref.rs:63:13
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
note: these are all the await points this reference is held through
--> tests/ui/await_holding_refcell_ref.rs:65:15
|
LL | baz().await
| ^^^^^
error: this `RefCell` reference is held across an `await` point
error: this `RefCell` reference is held across an await point
--> tests/ui/await_holding_refcell_ref.rs:76:13
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
note: these are all the await points this reference is held through
--> tests/ui/await_holding_refcell_ref.rs:78:15
|
LL | baz().await

View file

@ -0,0 +1,13 @@
#![allow(unused)]
#![warn(clippy::byte_char_slices)]
fn main() {
let bad = b"abc";
let quotes = b"\"Hi";
let quotes = b"'Sup";
let escapes = b"\x42Esc";
let good = &[b'a', 0x42];
let good = [b'a', b'a'];
let good: u8 = [b'a', b'c'].into_iter().sum();
}

View file

@ -0,0 +1,13 @@
#![allow(unused)]
#![warn(clippy::byte_char_slices)]
fn main() {
let bad = &[b'a', b'b', b'c'];
let quotes = &[b'"', b'H', b'i'];
let quotes = &[b'\'', b'S', b'u', b'p'];
let escapes = &[b'\x42', b'E', b's', b'c'];
let good = &[b'a', 0x42];
let good = vec![b'a', b'a'];
let good: u8 = [b'a', b'c'].into_iter().sum();
}

View file

@ -0,0 +1,38 @@
error: can be more succinctly written as a byte str
--> tests/ui/byte_char_slices.rs:5:15
|
LL | let bad = &[b'a', b'b', b'c'];
| ^^^^^^^^^^^^^^^^^^^ help: try: `b"abc"`
|
= note: `-D clippy::byte-char-slices` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::byte_char_slices)]`
error: can be more succinctly written as a byte str
--> tests/ui/byte_char_slices.rs:6:18
|
LL | let quotes = &[b'"', b'H', b'i'];
| ^^^^^^^^^^^^^^^^^^^ help: try: `b"\"Hi"`
error: can be more succinctly written as a byte str
--> tests/ui/byte_char_slices.rs:7:18
|
LL | let quotes = &[b'\'', b'S', b'u', b'p'];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `b"'Sup"`
error: can be more succinctly written as a byte str
--> tests/ui/byte_char_slices.rs:8:19
|
LL | let escapes = &[b'\x42', b'E', b's', b'c'];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `b"\x42Esc"`
error: useless use of `vec!`
--> tests/ui/byte_char_slices.rs:11:16
|
LL | let good = vec![b'a', b'a'];
| ^^^^^^^^^^^^^^^^ help: you can use an array directly: `[b'a', b'a']`
|
= note: `-D clippy::useless-vec` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::useless_vec)]`
error: aborting due to 5 previous errors

View file

@ -0,0 +1,32 @@
#![allow(unused)]
#![warn(clippy::cfg_not_test)]
fn important_check() {}
fn main() {
// Statement
#[cfg(not(test))]
let answer = 42;
// Expression
#[cfg(not(test))]
important_check();
// Make sure only not(test) are checked, not other attributes
#[cfg(not(foo))]
important_check();
}
#[cfg(not(not(test)))]
struct CfgNotTest;
// Deeply nested `not(test)`
#[cfg(not(test))]
fn foo() {}
#[cfg(all(debug_assertions, not(test)))]
fn bar() {}
#[cfg(not(any(not(debug_assertions), test)))]
fn baz() {}
#[cfg(test)]
mod tests {}

View file

@ -0,0 +1,45 @@
error: code is excluded from test builds
--> tests/ui/cfg_not_test.rs:8:5
|
LL | #[cfg(not(test))]
| ^^^^^^^^^^^^^^^^^
|
= help: consider not excluding any code from test builds
= note: this could increase code coverage despite not actually being tested
= note: `-D clippy::cfg-not-test` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::cfg_not_test)]`
error: code is excluded from test builds
--> tests/ui/cfg_not_test.rs:12:5
|
LL | #[cfg(not(test))]
| ^^^^^^^^^^^^^^^^^
|
= help: consider not excluding any code from test builds
error: code is excluded from test builds
--> tests/ui/cfg_not_test.rs:24:1
|
LL | #[cfg(not(test))]
| ^^^^^^^^^^^^^^^^^
|
= help: consider not excluding any code from test builds
error: code is excluded from test builds
--> tests/ui/cfg_not_test.rs:26:1
|
LL | #[cfg(all(debug_assertions, not(test)))]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider not excluding any code from test builds
error: code is excluded from test builds
--> tests/ui/cfg_not_test.rs:28:1
|
LL | #[cfg(not(any(not(debug_assertions), test)))]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider not excluding any code from test builds
error: aborting due to 5 previous errors

View file

@ -1,4 +1,4 @@
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/crashes/ice-12616.rs:6:5
|
LL | s() as *const ();

View file

@ -60,6 +60,7 @@ fn issue_1647_ref_mut() {
//~^ ERROR: use of a disallowed/placeholder name `quux`
}
#[cfg(test)]
mod tests {
fn issue_7305() {
// `disallowed_names` lint should not be triggered inside of the test code.

View file

@ -0,0 +1,47 @@
// https://github.com/rust-lang/rust-clippy/issues/12917
#![warn(clippy::doc_lazy_continuation)]
/// This is a constant.
///
/// The meaning of which should not be explained.
pub const A: i32 = 42;
/// This is another constant, no longer used.
///
/// This block of documentation has a long
/// explanation and derivation to explain
/// why it is what it is, and how it's used.
///
/// It is left here for historical reasons, and
/// for reference.
///
/// Reasons it's great:
/// - First reason
/// - Second reason
///
//pub const B: i32 = 1337;
/// This is yet another constant.
///
/// This has a similar fate as `B`.
///
/// Reasons it's useful:
/// 1. First reason
/// 2. Second reason
///
//pub const C: i32 = 8008;
/// This is still in use.
pub const D: i32 = 20;
/// > blockquote code path
///
/// bottom text
pub const E: i32 = 20;
/// > blockquote code path
///
#[repr(C)]
/// bottom text
pub struct Foo(i32);

View file

@ -0,0 +1,43 @@
// https://github.com/rust-lang/rust-clippy/issues/12917
#![warn(clippy::doc_lazy_continuation)]
/// This is a constant.
///
/// The meaning of which should not be explained.
pub const A: i32 = 42;
/// This is another constant, no longer used.
///
/// This block of documentation has a long
/// explanation and derivation to explain
/// why it is what it is, and how it's used.
///
/// It is left here for historical reasons, and
/// for reference.
///
/// Reasons it's great:
/// - First reason
/// - Second reason
//pub const B: i32 = 1337;
/// This is yet another constant.
///
/// This has a similar fate as `B`.
///
/// Reasons it's useful:
/// 1. First reason
/// 2. Second reason
//pub const C: i32 = 8008;
/// This is still in use.
pub const D: i32 = 20;
/// > blockquote code path
/// bottom text
pub const E: i32 = 20;
/// > blockquote code path
#[repr(C)]
/// bottom text
pub struct Foo(i32);

View file

@ -0,0 +1,56 @@
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_blank_line.rs:23:5
|
LL | /// This is yet another constant.
| ^
|
= help: if this is intended to be part of the list, indent 3 spaces
= note: `-D clippy::doc-lazy-continuation` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::doc_lazy_continuation)]`
help: if this should be its own paragraph, add a blank doc comment line
|
LL ~ /// - Second reason
LL + ///
|
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_blank_line.rs:32:5
|
LL | /// This is still in use.
| ^
|
= help: if this is intended to be part of the list, indent 4 spaces
help: if this should be its own paragraph, add a blank doc comment line
|
LL ~ /// 2. Second reason
LL + ///
|
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blank_line.rs:37:5
|
LL | /// bottom text
| ^
|
= help: if this not intended to be a quote at all, escape it with `\>`
help: if this should be its own paragraph, add a blank doc comment line
|
LL ~ /// > blockquote code path
LL + ///
|
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blank_line.rs:42:5
|
LL | /// bottom text
| ^
|
= help: if this not intended to be a quote at all, escape it with `\>`
help: if this should be its own paragraph, add a blank doc comment line
|
LL ~ /// > blockquote code path
LL + ///
|
error: aborting due to 4 previous errors

View file

@ -2,7 +2,7 @@
/// > blockquote with
/// > lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn first() {}
/// > blockquote with no
@ -18,24 +18,24 @@ fn two_nowarn() {}
/// >
/// > > nest here
/// > > lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn two() {}
/// > nest here
/// >
/// > > nest here
/// > > lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn three() {}
/// > * > nest here
/// > > lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn four() {}
/// > * > nest here
/// > > lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn four_point_1() {}
/// * > nest here lazy continuation
@ -43,5 +43,5 @@ fn five() {}
/// 1. > nest here
/// > lazy continuation (this results in strange indentation, but still works)
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn six() {}

View file

@ -2,7 +2,7 @@
/// > blockquote with
/// lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn first() {}
/// > blockquote with no
@ -18,24 +18,24 @@ fn two_nowarn() {}
/// >
/// > > nest here
/// > lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn two() {}
/// > nest here
/// >
/// > > nest here
/// lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn three() {}
/// > * > nest here
/// lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn four() {}
/// > * > nest here
/// lazy continuation
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn four_point_1() {}
/// * > nest here lazy continuation
@ -43,5 +43,5 @@ fn five() {}
/// 1. > nest here
/// lazy continuation (this results in strange indentation, but still works)
//~^ ERROR: doc quote missing `>` marker
//~^ ERROR: doc quote line without `>` marker
fn six() {}

View file

@ -1,4 +1,4 @@
error: doc quote missing `>` marker
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blockquote.rs:4:5
|
LL | /// lazy continuation
@ -12,7 +12,7 @@ help: add markers to start of line
LL | /// > lazy continuation
| +
error: doc quote missing `>` marker
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blockquote.rs:20:5
|
LL | /// > lazy continuation
@ -24,7 +24,7 @@ help: add markers to start of line
LL | /// > > lazy continuation
| +
error: doc quote missing `>` marker
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blockquote.rs:27:5
|
LL | /// lazy continuation
@ -36,7 +36,7 @@ help: add markers to start of line
LL | /// > > lazy continuation
| +++
error: doc quote missing `>` marker
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blockquote.rs:32:5
|
LL | /// lazy continuation
@ -48,7 +48,7 @@ help: add markers to start of line
LL | /// > > lazy continuation
| +++++++
error: doc quote missing `>` marker
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blockquote.rs:37:5
|
LL | /// lazy continuation
@ -60,7 +60,7 @@ help: add markers to start of line
LL | /// > > lazy continuation
| +++++
error: doc quote missing `>` marker
error: doc quote line without `>` marker
--> tests/ui/doc/doc_lazy_blockquote.rs:45:5
|
LL | /// lazy continuation (this results in strange indentation, but still works)

View file

@ -2,38 +2,41 @@
/// 1. nest here
/// lazy continuation
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn one() {}
/// 1. first line
/// lazy list continuations don't make warnings with this lint
//~^ ERROR: doc list item missing indentation
/// because they don't have the
//~^ ERROR: doc list item missing indentation
///
//~^ ERROR: doc list item without indentation
/// because they don't have the
//~^ ERROR: doc list item without indentation
fn two() {}
/// - nest here
/// lazy continuation
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn three() {}
/// - first line
/// lazy list continuations don't make warnings with this lint
//~^ ERROR: doc list item missing indentation
/// because they don't have the
//~^ ERROR: doc list item missing indentation
///
//~^ ERROR: doc list item without indentation
/// because they don't have the
//~^ ERROR: doc list item without indentation
fn four() {}
/// - nest here
/// lazy continuation
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn five() {}
/// - - first line
/// this will warn on the lazy continuation
//~^ ERROR: doc list item missing indentation
/// and so should this
//~^ ERROR: doc list item missing indentation
///
//~^ ERROR: doc list item without indentation
/// and so should this
//~^ ERROR: doc list item without indentation
fn six() {}
/// - - first line
@ -54,7 +57,7 @@ fn seven() {}
/// * `protocol_descriptors`: A Json Representation of the ProtocolDescriptors
/// to set up. Example:
/// 'protocol_descriptors': [
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
/// {
/// 'protocol': 25, # u64 Representation of ProtocolIdentifier::AVDTP
/// 'params': [
@ -73,5 +76,5 @@ fn seven() {}
/// }]
/// }
/// ]
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn eight() {}

View file

@ -2,38 +2,38 @@
/// 1. nest here
/// lazy continuation
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn one() {}
/// 1. first line
/// lazy list continuations don't make warnings with this lint
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
/// because they don't have the
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn two() {}
/// - nest here
/// lazy continuation
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn three() {}
/// - first line
/// lazy list continuations don't make warnings with this lint
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
/// because they don't have the
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn four() {}
/// - nest here
/// lazy continuation
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn five() {}
/// - - first line
/// this will warn on the lazy continuation
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
/// and so should this
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn six() {}
/// - - first line
@ -54,7 +54,7 @@ fn seven() {}
/// * `protocol_descriptors`: A Json Representation of the ProtocolDescriptors
/// to set up. Example:
/// 'protocol_descriptors': [
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
/// {
/// 'protocol': 25, # u64 Representation of ProtocolIdentifier::AVDTP
/// 'params': [
@ -73,5 +73,5 @@ fn seven() {}
/// }]
/// }
/// ]
//~^ ERROR: doc list item missing indentation
//~^ ERROR: doc list item without indentation
fn eight() {}

View file

@ -1,4 +1,4 @@
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:4:5
|
LL | /// lazy continuation
@ -12,7 +12,7 @@ help: indent this line
LL | /// lazy continuation
| +++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:9:5
|
LL | /// lazy list continuations don't make warnings with this lint
@ -24,19 +24,20 @@ help: indent this line
LL | /// lazy list continuations don't make warnings with this lint
| +++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:11:5
|
LL | /// because they don't have the
| ^
|
= help: if this is supposed to be its own paragraph, add a blank line
help: indent this line
= help: if this is intended to be part of the list, indent 3 spaces
help: if this should be its own paragraph, add a blank doc comment line
|
LL ~ /// lazy list continuations don't make warnings with this lint
LL + ///
|
LL | /// because they don't have the
| +++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:16:5
|
LL | /// lazy continuation
@ -48,7 +49,7 @@ help: indent this line
LL | /// lazy continuation
| ++++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:21:5
|
LL | /// lazy list continuations don't make warnings with this lint
@ -60,19 +61,20 @@ help: indent this line
LL | /// lazy list continuations don't make warnings with this lint
| ++++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:23:5
|
LL | /// because they don't have the
| ^
|
= help: if this is supposed to be its own paragraph, add a blank line
help: indent this line
= help: if this is intended to be part of the list, indent 4 spaces
help: if this should be its own paragraph, add a blank doc comment line
|
LL ~ /// lazy list continuations don't make warnings with this lint
LL + ///
|
LL | /// because they don't have the
| ++++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:28:5
|
LL | /// lazy continuation
@ -84,7 +86,7 @@ help: indent this line
LL | /// lazy continuation
| ++++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:33:5
|
LL | /// this will warn on the lazy continuation
@ -96,19 +98,20 @@ help: indent this line
LL | /// this will warn on the lazy continuation
| ++++++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:35:5
|
LL | /// and so should this
| ^^^^
|
= help: if this is supposed to be its own paragraph, add a blank line
help: indent this line
= help: if this is intended to be part of the list, indent 2 spaces
help: if this should be its own paragraph, add a blank doc comment line
|
LL ~ /// this will warn on the lazy continuation
LL + ///
|
LL | /// and so should this
| ++
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:56:5
|
LL | /// 'protocol_descriptors': [
@ -120,7 +123,7 @@ help: indent this line
LL | /// 'protocol_descriptors': [
| +
error: doc list item missing indentation
error: doc list item without indentation
--> tests/ui/doc/doc_lazy_list.rs:75:5
|
LL | /// ]

View file

@ -49,3 +49,20 @@ fn other_markdown() {}
/// pub struct Struct;
/// ```
fn issue_7421() {}
/// `
//~^ ERROR: backticks are unbalanced
fn escape_0() {}
/// Escaped \` backticks don't count.
fn escape_1() {}
/// Escaped \` \` backticks don't count.
fn escape_2() {}
/// Escaped \` ` backticks don't count, but unescaped backticks do.
//~^ ERROR: backticks are unbalanced
fn escape_3() {}
/// Backslashes ` \` within code blocks don't count.
fn escape_4() {}

View file

@ -78,5 +78,21 @@ help: try
LL | /// - This item needs `backticks_here`
| ~~~~~~~~~~~~~~~~
error: aborting due to 8 previous errors
error: backticks are unbalanced
--> tests/ui/doc/unbalanced_ticks.rs:53:5
|
LL | /// `
| ^
|
= help: a backtick may be missing a pair
error: backticks are unbalanced
--> tests/ui/doc/unbalanced_ticks.rs:63:5
|
LL | /// Escaped \` ` backticks don't count, but unescaped backticks do.
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: a backtick may be missing a pair
error: aborting due to 10 previous errors

View file

@ -345,3 +345,39 @@ fn main() {
let _ = &mut ({ *x.u }).x;
}
}
mod issue_12969 {
use std::ops::Deref;
struct Wrapper<T>(T);
impl<T> Deref for Wrapper<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
fn foo(_bar: &str) {}
fn bar() {
let wrapped_bar = Wrapper("");
foo(&wrapped_bar);
}
}
mod issue_9841 {
fn takes_array_ref<T, const N: usize>(array: &&[T; N]) {
takes_slice(*array)
}
fn takes_array_ref_ref<T, const N: usize>(array: &&&[T; N]) {
takes_slice(**array)
}
fn takes_slice<T>(slice: &[T]) {
todo!()
}
}

View file

@ -345,3 +345,39 @@ fn main() {
let _ = &mut ({ *x.u }).x;
}
}
mod issue_12969 {
use std::ops::Deref;
struct Wrapper<T>(T);
impl<T> Deref for Wrapper<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
fn foo(_bar: &str) {}
fn bar() {
let wrapped_bar = Wrapper("");
foo(&*wrapped_bar);
}
}
mod issue_9841 {
fn takes_array_ref<T, const N: usize>(array: &&[T; N]) {
takes_slice(*array)
}
fn takes_array_ref_ref<T, const N: usize>(array: &&&[T; N]) {
takes_slice(**array)
}
fn takes_slice<T>(slice: &[T]) {
todo!()
}
}

View file

@ -271,5 +271,11 @@ error: deref which would be done by auto-deref
LL | let _ = &mut (*{ x.u }).x;
| ^^^^^^^^^^ help: try: `{ x.u }`
error: aborting due to 45 previous errors
error: deref which would be done by auto-deref
--> tests/ui/explicit_auto_deref.rs:367:13
|
LL | foo(&*wrapped_bar);
| ^^^^^^^^^^^^^ help: try: `&wrapped_bar`
error: aborting due to 46 previous errors

View file

@ -71,19 +71,16 @@ fn main() {
twice(ONE) != ONE;
ONE as f64 != 2.0;
//~^ ERROR: strict comparison of `f32` or `f64`
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
ONE as f64 != 0.0; // no error, comparison with zero is ok
let x: f64 = 1.0;
x == 1.0;
//~^ ERROR: strict comparison of `f32` or `f64`
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
x != 0f64; // no error, comparison with zero is ok
twice(x) != twice(ONE as f64);
//~^ ERROR: strict comparison of `f32` or `f64`
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
x < 0.0; // no errors, lower or greater comparisons need no fuzzyness
x > 0.0;
@ -105,17 +102,14 @@ fn main() {
ZERO_ARRAY[i] == NON_ZERO_ARRAY[j]; // ok, because lhs is zero regardless of i
NON_ZERO_ARRAY[i] == NON_ZERO_ARRAY[j];
//~^ ERROR: strict comparison of `f32` or `f64`
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
let a1: [f32; 1] = [0.0];
let a2: [f32; 1] = [1.1];
a1 == a2;
//~^ ERROR: strict comparison of `f32` or `f64` arrays
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
a1[0] == a2[0];
//~^ ERROR: strict comparison of `f32` or `f64`
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
// no errors - comparing signums is ok
let x32 = 3.21f32;

View file

@ -4,49 +4,38 @@ error: strict comparison of `f32` or `f64`
LL | ONE as f64 != 2.0;
| ^^^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(ONE as f64 - 2.0).abs() > error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
= note: `-D clippy::float-cmp` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::float_cmp)]`
error: strict comparison of `f32` or `f64`
--> tests/ui/float_cmp.rs:79:5
--> tests/ui/float_cmp.rs:78:5
|
LL | x == 1.0;
| ^^^^^^^^ help: consider comparing them within some margin of error: `(x - 1.0).abs() < error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: strict comparison of `f32` or `f64`
--> tests/ui/float_cmp.rs:84:5
--> tests/ui/float_cmp.rs:82: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`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: strict comparison of `f32` or `f64`
--> tests/ui/float_cmp.rs:106:5
--> tests/ui/float_cmp.rs:103: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`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: strict comparison of `f32` or `f64` arrays
--> tests/ui/float_cmp.rs:113:5
--> tests/ui/float_cmp.rs:109:5
|
LL | a1 == a2;
| ^^^^^^^^
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: strict comparison of `f32` or `f64`
--> tests/ui/float_cmp.rs:116:5
--> tests/ui/float_cmp.rs:111:5
|
LL | a1[0] == a2[0];
| ^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(a1[0] - a2[0]).abs() < error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: aborting due to 6 previous errors

View file

@ -15,28 +15,21 @@ fn main() {
// has errors
1f32 == ONE;
//~^ ERROR: strict comparison of `f32` or `f64` constant
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
TWO == ONE;
//~^ ERROR: strict comparison of `f32` or `f64` constant
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
TWO != ONE;
//~^ ERROR: strict comparison of `f32` or `f64` constant
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
ONE + ONE == TWO;
//~^ ERROR: strict comparison of `f32` or `f64` constant
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
let x = 1;
x as f32 == ONE;
//~^ ERROR: strict comparison of `f32` or `f64` constant
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
let v = 0.9;
v == ONE;
//~^ ERROR: strict comparison of `f32` or `f64` constant
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
v != ONE;
//~^ ERROR: strict comparison of `f32` or `f64` constant
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
// no errors, lower than or greater than comparisons
v < ONE;
@ -70,5 +63,4 @@ fn main() {
// has errors
NON_ZERO_ARRAY == NON_ZERO_ARRAY2;
//~^ ERROR: strict comparison of `f32` or `f64` constant arrays
//~| NOTE: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
}

View file

@ -4,65 +4,50 @@ error: strict comparison of `f32` or `f64` constant
LL | 1f32 == ONE;
| ^^^^^^^^^^^ help: consider comparing them within some margin of error: `(1f32 - ONE).abs() < error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
= note: `-D clippy::float-cmp-const` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::float_cmp_const)]`
error: strict comparison of `f32` or `f64` constant
--> tests/ui/float_cmp_const.rs:19:5
--> tests/ui/float_cmp_const.rs:18:5
|
LL | TWO == ONE;
| ^^^^^^^^^^ help: consider comparing them within some margin of error: `(TWO - ONE).abs() < error_margin`
error: strict comparison of `f32` or `f64` constant
--> tests/ui/float_cmp_const.rs:20:5
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
LL | TWO != ONE;
| ^^^^^^^^^^ help: consider comparing them within some margin of error: `(TWO - ONE).abs() > error_margin`
error: strict comparison of `f32` or `f64` constant
--> tests/ui/float_cmp_const.rs:22:5
|
LL | TWO != ONE;
| ^^^^^^^^^^ help: consider comparing them within some margin of error: `(TWO - ONE).abs() > error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
LL | ONE + ONE == TWO;
| ^^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(ONE + ONE - TWO).abs() < error_margin`
error: strict comparison of `f32` or `f64` constant
--> tests/ui/float_cmp_const.rs:25:5
|
LL | ONE + ONE == TWO;
| ^^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(ONE + ONE - TWO).abs() < error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
LL | x as f32 == ONE;
| ^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(x as f32 - ONE).abs() < error_margin`
error: strict comparison of `f32` or `f64` constant
--> tests/ui/float_cmp_const.rs:29:5
|
LL | x as f32 == ONE;
| ^^^^^^^^^^^^^^^ help: consider comparing them within some margin of error: `(x as f32 - ONE).abs() < error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: strict comparison of `f32` or `f64` constant
--> tests/ui/float_cmp_const.rs:34:5
|
LL | v == ONE;
| ^^^^^^^^ help: consider comparing them within some margin of error: `(v - ONE).abs() < error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: strict comparison of `f32` or `f64` constant
--> tests/ui/float_cmp_const.rs:37:5
--> tests/ui/float_cmp_const.rs:31:5
|
LL | v != ONE;
| ^^^^^^^^ help: consider comparing them within some margin of error: `(v - ONE).abs() > error_margin`
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: strict comparison of `f32` or `f64` constant arrays
--> tests/ui/float_cmp_const.rs:71:5
--> tests/ui/float_cmp_const.rs:64:5
|
LL | NON_ZERO_ARRAY == NON_ZERO_ARRAY2;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
error: aborting due to 8 previous errors

View file

@ -39,4 +39,13 @@ fn main() {
struct TupleStructVec(Vec<usize>);
let _ = TupleStructVec(vec![0, 1, 2, 3]);
{
struct S(i32, i32);
let mut iter = [1i32, 1i32].into_iter();
let _ = S {
1: iter.next().unwrap(),
0: iter.next().unwrap(),
};
}
}

View file

@ -47,4 +47,13 @@ fn main() {
struct TupleStructVec(Vec<usize>);
let _ = TupleStructVec { 0: vec![0, 1, 2, 3] };
{
struct S(i32, i32);
let mut iter = [1i32, 1i32].into_iter();
let _ = S {
1: iter.next().unwrap(),
0: iter.next().unwrap(),
};
}
}

View file

@ -1,5 +1,5 @@
error: used a field initializer for a tuple struct
--> tests/ui/numbered_fields.rs:17:13
--> tests/ui/init_numbered_fields.rs:17:13
|
LL | let _ = TupleStruct {
| _____________^
@ -7,13 +7,13 @@ LL | | 0: 1u32,
LL | | 1: 42,
LL | | 2: 23u8,
LL | | };
| |_____^ help: try: `TupleStruct(1u32, 42, 23u8)`
| |_____^ help: use tuple initialization: `TupleStruct(1u32, 42, 23u8)`
|
= note: `-D clippy::init-numbered-fields` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::init_numbered_fields)]`
error: used a field initializer for a tuple struct
--> tests/ui/numbered_fields.rs:24:13
--> tests/ui/init_numbered_fields.rs:24:13
|
LL | let _ = TupleStruct {
| _____________^
@ -21,13 +21,13 @@ LL | | 0: 1u32,
LL | | 2: 2u8,
LL | | 1: 3u32,
LL | | };
| |_____^ help: try: `TupleStruct(1u32, 3u32, 2u8)`
| |_____^ help: use tuple initialization: `TupleStruct(1u32, 3u32, 2u8)`
error: used a field initializer for a tuple struct
--> tests/ui/numbered_fields.rs:49:13
--> tests/ui/init_numbered_fields.rs:49:13
|
LL | let _ = TupleStructVec { 0: vec![0, 1, 2, 3] };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `TupleStructVec(vec![0, 1, 2, 3])`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use tuple initialization: `TupleStructVec(vec![0, 1, 2, 3])`
error: aborting due to 3 previous errors

View file

@ -185,3 +185,42 @@ pub mod issue11635 {
}
}
}
pub mod issue12964 {
pub struct MyIter<'a, T: 'a> {
iter: std::slice::Iter<'a, T>,
}
impl<'a, T> Iterator for MyIter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}
pub struct MyContainer<T> {
inner: Vec<T>,
}
impl<T> MyContainer<T> {}
impl<T> MyContainer<T> {
#[must_use]
pub fn iter(&self) -> MyIter<'_, T> {
<&Self as IntoIterator>::into_iter(self)
}
}
impl<'a, T> IntoIterator for &'a MyContainer<T> {
type Item = &'a T;
type IntoIter = MyIter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
Self::IntoIter {
iter: self.inner.as_slice().iter(),
}
}
}
}

View file

@ -3,7 +3,7 @@
fn main() {
let x = [1, 2, 3, 4];
for _ in vec.iter().next() {}
for _ in x.iter().next() {}
struct Unrelated(&'static [u8]);
impl Unrelated {

View file

@ -1,9 +1,11 @@
error[E0423]: expected value, found macro `vec`
error: you are iterating over `Iterator::next()` which is an Option; this will compile but is probably not what you want
--> tests/ui/iter_next_loop.rs:6:14
|
LL | for _ in vec.iter().next() {}
| ^^^ not a value
LL | for _ in x.iter().next() {}
| ^^^^^^^^^^^^^^^
|
= note: `-D clippy::iter-next-loop` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::iter_next_loop)]`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0423`.

View file

@ -1,4 +1,4 @@
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:5:21
|
LL | let _ = Some(0).map(|x| {
@ -12,7 +12,7 @@ LL ~ let _ = Some(0).inspect(|&x| {
LL ~ println!("{}", x);
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:10:21
|
LL | let _ = Some(0).map(|x| {
@ -24,7 +24,7 @@ LL ~ let _ = Some(0).inspect(|&x| {
LL ~ println!("{x}");
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:15:21
|
LL | let _ = Some(0).map(|x| {
@ -36,7 +36,7 @@ LL ~ let _ = Some(0).inspect(|&x| {
LL ~ println!("{}", x * 5 + 1);
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:20:21
|
LL | let _ = Some(0).map(|x| {
@ -50,7 +50,7 @@ LL | panic!();
LL ~ }
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:27:21
|
LL | let _ = Some(0).map(|x| {
@ -65,7 +65,7 @@ LL | panic!();
LL ~ }
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:78:41
|
LL | let _ = Some((String::new(), 0u32)).map(|x| {
@ -80,7 +80,7 @@ LL | panic!();
LL ~ }
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:104:33
|
LL | let _ = Some(String::new()).map(|x| {
@ -98,7 +98,7 @@ LL | }
LL ~ println!("test");
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:115:21
|
LL | let _ = Some(0).map(|x| {
@ -113,7 +113,7 @@ LL | panic!();
LL ~ }
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:130:46
|
LL | let _ = Some(Cell2(Cell::new(0u32))).map(|x| {
@ -125,7 +125,7 @@ LL ~ let _ = Some(Cell2(Cell::new(0u32))).inspect(|x| {
LL ~ x.0.set(1);
|
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:146:34
|
LL | let _: Result<_, ()> = Ok(0).map(|x| {
@ -137,7 +137,7 @@ LL ~ let _: Result<_, ()> = Ok(0).inspect(|&x| {
LL ~ println!("{}", x);
|
error:
error: using `map_err` over `inspect_err`
--> tests/ui/manual_inspect.rs:151:35
|
LL | let _: Result<(), _> = Err(0).map_err(|x| {
@ -166,7 +166,7 @@ LL | | .count();
= note: `-D clippy::suspicious-map` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::suspicious_map)]`
error:
error: using `map` over `inspect`
--> tests/ui/manual_inspect.rs:158:10
|
LL | .map(|x| {

View file

@ -0,0 +1,31 @@
#![warn(clippy::manual_rotate)]
#![allow(unused)]
fn main() {
let (x_u8, x_u16, x_u32, x_u64) = (1u8, 1u16, 1u32, 1u64);
let (x_i8, x_i16, x_i32, x_i64) = (1i8, 1i16, 1i32, 1i64);
let a_u32 = 1u32;
// True positives
let y_u8 = x_u8.rotate_right(3);
let y_u16 = x_u16.rotate_right(7);
let y_u32 = x_u32.rotate_right(8);
let y_u64 = x_u64.rotate_right(9);
let y_i8 = x_i8.rotate_right(3);
let y_i16 = x_i16.rotate_right(7);
let y_i32 = x_i32.rotate_right(8);
let y_i64 = x_i64.rotate_right(9);
// Plus also works instead of |
let y_u32_plus = x_u32.rotate_right(8);
// Complex expression
let y_u32_complex = (x_u32 | 3256).rotate_right(8);
let y_u64_as = (x_u32 as u64).rotate_right(8);
// False positives - can't be replaced with a rotation
let y_u8_false = (x_u8 >> 6) | (x_u8 << 3);
let y_u32_false = (x_u32 >> 8) | (x_u32 >> 24);
let y_u64_false2 = (x_u64 >> 9) & (x_u64 << 55);
// Variable mismatch
let y_u32_wrong_vars = (x_u32 >> 8) | (a_u32 << 24);
// Has side effects and therefore should not be matched
let mut l = vec![12_u8, 34];
let y = (l.pop().unwrap() << 3) + (l.pop().unwrap() >> 5);
}

View file

@ -0,0 +1,31 @@
#![warn(clippy::manual_rotate)]
#![allow(unused)]
fn main() {
let (x_u8, x_u16, x_u32, x_u64) = (1u8, 1u16, 1u32, 1u64);
let (x_i8, x_i16, x_i32, x_i64) = (1i8, 1i16, 1i32, 1i64);
let a_u32 = 1u32;
// True positives
let y_u8 = (x_u8 >> 3) | (x_u8 << 5);
let y_u16 = (x_u16 >> 7) | (x_u16 << 9);
let y_u32 = (x_u32 >> 8) | (x_u32 << 24);
let y_u64 = (x_u64 >> 9) | (x_u64 << 55);
let y_i8 = (x_i8 >> 3) | (x_i8 << 5);
let y_i16 = (x_i16 >> 7) | (x_i16 << 9);
let y_i32 = (x_i32 >> 8) | (x_i32 << 24);
let y_i64 = (x_i64 >> 9) | (x_i64 << 55);
// Plus also works instead of |
let y_u32_plus = (x_u32 >> 8) + (x_u32 << 24);
// Complex expression
let y_u32_complex = ((x_u32 | 3256) >> 8) | ((x_u32 | 3256) << 24);
let y_u64_as = (x_u32 as u64 >> 8) | ((x_u32 as u64) << 56);
// False positives - can't be replaced with a rotation
let y_u8_false = (x_u8 >> 6) | (x_u8 << 3);
let y_u32_false = (x_u32 >> 8) | (x_u32 >> 24);
let y_u64_false2 = (x_u64 >> 9) & (x_u64 << 55);
// Variable mismatch
let y_u32_wrong_vars = (x_u32 >> 8) | (a_u32 << 24);
// Has side effects and therefore should not be matched
let mut l = vec![12_u8, 34];
let y = (l.pop().unwrap() << 3) + (l.pop().unwrap() >> 5);
}

View file

@ -0,0 +1,71 @@
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:8:16
|
LL | let y_u8 = (x_u8 >> 3) | (x_u8 << 5);
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_u8.rotate_right(3)`
|
= note: `-D clippy::manual-rotate` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::manual_rotate)]`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:9:17
|
LL | let y_u16 = (x_u16 >> 7) | (x_u16 << 9);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_u16.rotate_right(7)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:10:17
|
LL | let y_u32 = (x_u32 >> 8) | (x_u32 << 24);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_u32.rotate_right(8)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:11:17
|
LL | let y_u64 = (x_u64 >> 9) | (x_u64 << 55);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_u64.rotate_right(9)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:12:16
|
LL | let y_i8 = (x_i8 >> 3) | (x_i8 << 5);
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_i8.rotate_right(3)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:13:17
|
LL | let y_i16 = (x_i16 >> 7) | (x_i16 << 9);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_i16.rotate_right(7)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:14:17
|
LL | let y_i32 = (x_i32 >> 8) | (x_i32 << 24);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_i32.rotate_right(8)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:15:17
|
LL | let y_i64 = (x_i64 >> 9) | (x_i64 << 55);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_i64.rotate_right(9)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:17:22
|
LL | let y_u32_plus = (x_u32 >> 8) + (x_u32 << 24);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `x_u32.rotate_right(8)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:19:25
|
LL | let y_u32_complex = ((x_u32 | 3256) >> 8) | ((x_u32 | 3256) << 24);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `(x_u32 | 3256).rotate_right(8)`
error: there is no need to manually implement bit rotation
--> tests/ui/manual_rotate.rs:20:20
|
LL | let y_u64_as = (x_u32 as u64 >> 8) | ((x_u32 as u64) << 56);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: this expression can be rewritten as: `(x_u32 as u64).rotate_right(8)`
error: aborting due to 11 previous errors

View file

@ -7,6 +7,7 @@
#![warn(clippy::missing_const_for_fn)]
#![feature(start)]
#![feature(type_alias_impl_trait)]
extern crate helper;
extern crate proc_macros;
@ -180,4 +181,21 @@ mod msrv {
unsafe { *self.1 as usize }
}
}
#[clippy::msrv = "1.61"]
extern "C" fn c() {}
}
mod with_extern {
extern "C-unwind" fn c_unwind() {}
extern "system" fn system() {}
extern "system-unwind" fn system_unwind() {}
}
mod with_ty_alias {
type Foo = impl std::fmt::Debug;
fn foo(_: Foo) {
let _: Foo = 1;
}
}

View file

@ -143,6 +143,21 @@ mod msrv {
let bar = Bar { val: 1 };
let _ = unsafe { bar.val };
}
#[clippy::msrv = "1.62"]
mod with_extern {
const extern "C" fn c() {}
//~^ ERROR: this could be a `const fn`
#[rustfmt::skip]
const extern fn implicit_c() {}
//~^ ERROR: this could be a `const fn`
// any item functions in extern block won't trigger this lint
extern "C" {
fn c_in_block();
}
}
}
mod issue12677 {
@ -174,3 +189,18 @@ mod issue12677 {
}
}
}
mod with_ty_alias {
trait FooTrait {
type Foo: std::fmt::Debug;
fn bar(_: Self::Foo) {}
}
impl FooTrait for () {
type Foo = i32;
}
// NOTE: When checking the type of a function param, make sure it is not an alias with
// `AliasTyKind::Projection` before calling `TyCtxt::type_of` to find out what the actual type
// is. Because the associate ty could have no default, therefore would cause ICE, as demostrated
// in this test.
const fn alias_ty_is_projection(bar: <() as FooTrait>::Foo) {}
}

View file

@ -143,6 +143,21 @@ mod msrv {
let bar = Bar { val: 1 };
let _ = unsafe { bar.val };
}
#[clippy::msrv = "1.62"]
mod with_extern {
extern "C" fn c() {}
//~^ ERROR: this could be a `const fn`
#[rustfmt::skip]
extern fn implicit_c() {}
//~^ ERROR: this could be a `const fn`
// any item functions in extern block won't trigger this lint
extern "C" {
fn c_in_block();
}
}
}
mod issue12677 {
@ -174,3 +189,18 @@ mod issue12677 {
}
}
}
mod with_ty_alias {
trait FooTrait {
type Foo: std::fmt::Debug;
fn bar(_: Self::Foo) {}
}
impl FooTrait for () {
type Foo = i32;
}
// NOTE: When checking the type of a function param, make sure it is not an alias with
// `AliasTyKind::Projection` before calling `TyCtxt::type_of` to find out what the actual type
// is. Because the associate ty could have no default, therefore would cause ICE, as demostrated
// in this test.
fn alias_ty_is_projection(bar: <() as FooTrait>::Foo) {}
}

View file

@ -211,7 +211,29 @@ LL | const fn union_access_can_be_const() {
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const.rs:155:9
--> tests/ui/missing_const_for_fn/could_be_const.rs:149:9
|
LL | extern "C" fn c() {}
| ^^^^^^^^^^^^^^^^^^^^
|
help: make the function `const`
|
LL | const extern "C" fn c() {}
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const.rs:153:9
|
LL | extern fn implicit_c() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: make the function `const`
|
LL | const extern fn implicit_c() {}
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const.rs:170:9
|
LL | / pub fn new(strings: Vec<String>) -> Self {
LL | | Self { strings }
@ -224,7 +246,7 @@ LL | pub const fn new(strings: Vec<String>) -> Self {
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const.rs:160:9
--> tests/ui/missing_const_for_fn/could_be_const.rs:175:9
|
LL | / pub fn empty() -> Self {
LL | | Self { strings: Vec::new() }
@ -237,7 +259,7 @@ LL | pub const fn empty() -> Self {
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const.rs:171:9
--> tests/ui/missing_const_for_fn/could_be_const.rs:186:9
|
LL | / pub fn new(text: String) -> Self {
LL | | let vec = Vec::new();
@ -250,5 +272,16 @@ help: make the function `const`
LL | pub const fn new(text: String) -> Self {
| +++++
error: aborting due to 18 previous errors
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const.rs:205:5
|
LL | fn alias_ty_is_projection(bar: <() as FooTrait>::Foo) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: make the function `const`
|
LL | const fn alias_ty_is_projection(bar: <() as FooTrait>::Foo) {}
| +++++
error: aborting due to 21 previous errors

View file

@ -0,0 +1,14 @@
#![warn(clippy::missing_const_for_fn)]
#![allow(unsupported_calling_conventions)]
#![feature(const_extern_fn)]
const extern "C-unwind" fn c_unwind() {}
//~^ ERROR: this could be a `const fn`
const extern "system" fn system() {}
//~^ ERROR: this could be a `const fn`
const extern "system-unwind" fn system_unwind() {}
//~^ ERROR: this could be a `const fn`
pub const extern "stdcall" fn std_call() {}
//~^ ERROR: this could be a `const fn`
pub const extern "stdcall-unwind" fn std_call_unwind() {}
//~^ ERROR: this could be a `const fn`

View file

@ -0,0 +1,14 @@
#![warn(clippy::missing_const_for_fn)]
#![allow(unsupported_calling_conventions)]
#![feature(const_extern_fn)]
extern "C-unwind" fn c_unwind() {}
//~^ ERROR: this could be a `const fn`
extern "system" fn system() {}
//~^ ERROR: this could be a `const fn`
extern "system-unwind" fn system_unwind() {}
//~^ ERROR: this could be a `const fn`
pub extern "stdcall" fn std_call() {}
//~^ ERROR: this could be a `const fn`
pub extern "stdcall-unwind" fn std_call_unwind() {}
//~^ ERROR: this could be a `const fn`

View file

@ -0,0 +1,59 @@
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const_with_const_extern_fn.rs:5:1
|
LL | extern "C-unwind" fn c_unwind() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `-D clippy::missing-const-for-fn` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::missing_const_for_fn)]`
help: make the function `const`
|
LL | const extern "C-unwind" fn c_unwind() {}
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const_with_const_extern_fn.rs:7:1
|
LL | extern "system" fn system() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: make the function `const`
|
LL | const extern "system" fn system() {}
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const_with_const_extern_fn.rs:9:1
|
LL | extern "system-unwind" fn system_unwind() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: make the function `const`
|
LL | const extern "system-unwind" fn system_unwind() {}
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const_with_const_extern_fn.rs:11:1
|
LL | pub extern "stdcall" fn std_call() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: make the function `const`
|
LL | pub const extern "stdcall" fn std_call() {}
| +++++
error: this could be a `const fn`
--> tests/ui/missing_const_for_fn/could_be_const_with_const_extern_fn.rs:13:1
|
LL | pub extern "stdcall-unwind" fn std_call_unwind() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: make the function `const`
|
LL | pub const extern "stdcall-unwind" fn std_call_unwind() {}
| +++++
error: aborting due to 5 previous errors

View file

@ -1,4 +1,4 @@
#![warn(clippy::thread_local_initializer_can_be_made_const)]
#![warn(clippy::missing_const_for_thread_local)]
use std::cell::{Cell, RefCell};

View file

@ -1,4 +1,4 @@
#![warn(clippy::thread_local_initializer_can_be_made_const)]
#![warn(clippy::missing_const_for_thread_local)]
use std::cell::{Cell, RefCell};

View file

@ -1,38 +1,38 @@
error: initializer for `thread_local` value can be made `const`
--> tests/ui/thread_local_initializer_can_be_made_const.rs:8:41
--> tests/ui/missing_const_for_thread_local.rs:8:41
|
LL | static BUF_1: RefCell<String> = RefCell::new(String::new());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `const { RefCell::new(String::new()) }`
|
= note: `-D clippy::thread-local-initializer-can-be-made-const` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::thread_local_initializer_can_be_made_const)]`
= note: `-D clippy::missing-const-for-thread-local` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::missing_const_for_thread_local)]`
error: initializer for `thread_local` value can be made `const`
--> tests/ui/thread_local_initializer_can_be_made_const.rs:18:29
--> tests/ui/missing_const_for_thread_local.rs:18:29
|
LL | static SIMPLE:i32 = 1;
| ^ help: replace with: `const { 1 }`
error: initializer for `thread_local` value can be made `const`
--> tests/ui/thread_local_initializer_can_be_made_const.rs:24:59
--> tests/ui/missing_const_for_thread_local.rs:24:59
|
LL | static BUF_3_CAN_BE_MADE_CONST: RefCell<String> = RefCell::new(String::new());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `const { RefCell::new(String::new()) }`
error: initializer for `thread_local` value can be made `const`
--> tests/ui/thread_local_initializer_can_be_made_const.rs:26:59
--> tests/ui/missing_const_for_thread_local.rs:26:59
|
LL | static BUF_4_CAN_BE_MADE_CONST: RefCell<String> = RefCell::new(String::new());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `const { RefCell::new(String::new()) }`
error: initializer for `thread_local` value can be made `const`
--> tests/ui/thread_local_initializer_can_be_made_const.rs:32:31
--> tests/ui/missing_const_for_thread_local.rs:32:31
|
LL | static PEEL_ME: i32 = { 1 };
| ^^^^^ help: replace with: `const { 1 }`
error: initializer for `thread_local` value can be made `const`
--> tests/ui/thread_local_initializer_can_be_made_const.rs:34:36
--> tests/ui/missing_const_for_thread_local.rs:34:36
|
LL | static PEEL_ME_MANY: i32 = { let x = 1; x * x };
| ^^^^^^^^^^^^^^^^^^^^ help: replace with: `const { { let x = 1; x * x } }`

View file

@ -232,43 +232,48 @@ async fn async_vec2(b: &mut Vec<bool>) {
}
fn non_mut(n: &str) {}
//Should warn
pub async fn call_in_closure1(n: &mut str) {
async fn call_in_closure1(n: &mut str) {
(|| non_mut(n))()
}
fn str_mut(str: &mut String) -> bool {
str.pop().is_some()
}
//Should not warn
pub async fn call_in_closure2(str: &mut String) {
async fn call_in_closure2(str: &mut String) {
(|| str_mut(str))();
}
// Should not warn.
pub async fn closure(n: &mut usize) -> impl '_ + FnMut() {
async fn closure(n: &mut usize) -> impl '_ + FnMut() {
|| {
*n += 1;
}
}
// Should warn.
pub fn closure2(n: &mut usize) -> impl '_ + FnMut() -> usize {
fn closure2(n: &mut usize) -> impl '_ + FnMut() -> usize {
//~^ ERROR: this argument is a mutable reference, but not used mutably
|| *n + 1
}
// Should not warn.
pub async fn closure3(n: &mut usize) {
async fn closure3(n: &mut usize) {
(|| *n += 1)();
}
// Should warn.
pub async fn closure4(n: &mut usize) {
async fn closure4(n: &mut usize) {
//~^ ERROR: this argument is a mutable reference, but not used mutably
(|| {
let _x = *n + 1;
})();
}
// Should not warn: pub
pub fn pub_foo(s: &mut Vec<u32>, b: &u32, x: &mut u32) {
*x += *b + s.len() as u32;
}
// Should not warn.
async fn _f(v: &mut Vec<()>) {
let x = || v.pop();
@ -365,4 +370,5 @@ fn main() {
used_as_path;
let _: fn(&mut u32) = passed_as_local;
let _ = if v[0] == 0 { ty_unify_1 } else { ty_unify_2 };
pub_foo(&mut v, &0, &mut u);
}

View file

@ -108,109 +108,103 @@ LL | async fn inner_async3(x: &mut i32, y: &mut u32) {
| ^^^^^^^^ help: consider changing to: `&i32`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:235:34
--> tests/ui/needless_pass_by_ref_mut.rs:235:30
|
LL | pub async fn call_in_closure1(n: &mut str) {
| ^^^^^^^^ help: consider changing to: `&str`
|
= warning: changing this function will impact semver compatibility
LL | async fn call_in_closure1(n: &mut str) {
| ^^^^^^^^ help: consider changing to: `&str`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:254:20
--> tests/ui/needless_pass_by_ref_mut.rs:254:16
|
LL | pub fn closure2(n: &mut usize) -> impl '_ + FnMut() -> usize {
| ^^^^^^^^^^ help: consider changing to: `&usize`
|
= warning: changing this function will impact semver compatibility
LL | fn closure2(n: &mut usize) -> impl '_ + FnMut() -> usize {
| ^^^^^^^^^^ help: consider changing to: `&usize`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:265:26
--> tests/ui/needless_pass_by_ref_mut.rs:265:22
|
LL | pub async fn closure4(n: &mut usize) {
| ^^^^^^^^^^ help: consider changing to: `&usize`
|
= warning: changing this function will impact semver compatibility
LL | async fn closure4(n: &mut usize) {
| ^^^^^^^^^^ help: consider changing to: `&usize`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:314:12
--> tests/ui/needless_pass_by_ref_mut.rs:319:12
|
LL | fn bar(&mut self) {}
| ^^^^^^^^^ help: consider changing to: `&self`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:316:18
--> tests/ui/needless_pass_by_ref_mut.rs:321:18
|
LL | async fn foo(&mut self, u: &mut i32, v: &mut u32) {
| ^^^^^^^^^ help: consider changing to: `&self`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:316:45
--> tests/ui/needless_pass_by_ref_mut.rs:321:45
|
LL | async fn foo(&mut self, u: &mut i32, v: &mut u32) {
| ^^^^^^^^ help: consider changing to: `&u32`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:324:46
--> tests/ui/needless_pass_by_ref_mut.rs:329:46
|
LL | async fn foo2(&mut self, u: &mut i32, v: &mut u32) {
| ^^^^^^^^ help: consider changing to: `&u32`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:340:18
--> tests/ui/needless_pass_by_ref_mut.rs:345:18
|
LL | fn _empty_tup(x: &mut (())) {}
| ^^^^^^^^^ help: consider changing to: `&()`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:341:19
--> tests/ui/needless_pass_by_ref_mut.rs:346:19
|
LL | fn _single_tup(x: &mut ((i32,))) {}
| ^^^^^^^^^^^^^ help: consider changing to: `&(i32,)`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:342:18
--> tests/ui/needless_pass_by_ref_mut.rs:347:18
|
LL | fn _multi_tup(x: &mut ((i32, u32))) {}
| ^^^^^^^^^^^^^^^^^ help: consider changing to: `&(i32, u32)`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:343:11
--> tests/ui/needless_pass_by_ref_mut.rs:348:11
|
LL | fn _fn(x: &mut (fn())) {}
| ^^^^^^^^^^^ help: consider changing to: `&fn()`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:345:23
--> tests/ui/needless_pass_by_ref_mut.rs:350:23
|
LL | fn _extern_rust_fn(x: &mut extern "Rust" fn()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing to: `&extern "Rust" fn()`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:346:20
--> tests/ui/needless_pass_by_ref_mut.rs:351:20
|
LL | fn _extern_c_fn(x: &mut extern "C" fn()) {}
| ^^^^^^^^^^^^^^^^^^^^ help: consider changing to: `&extern "C" fn()`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:347:18
--> tests/ui/needless_pass_by_ref_mut.rs:352:18
|
LL | fn _unsafe_fn(x: &mut unsafe fn()) {}
| ^^^^^^^^^^^^^^^^ help: consider changing to: `&unsafe fn()`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:348:25
--> tests/ui/needless_pass_by_ref_mut.rs:353:25
|
LL | fn _unsafe_extern_fn(x: &mut unsafe extern "C" fn()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing to: `&unsafe extern "C" fn()`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:349:20
--> tests/ui/needless_pass_by_ref_mut.rs:354:20
|
LL | fn _fn_with_arg(x: &mut unsafe extern "C" fn(i32)) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing to: `&unsafe extern "C" fn(i32)`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut.rs:350:20
--> tests/ui/needless_pass_by_ref_mut.rs:355:20
|
LL | fn _fn_with_ret(x: &mut unsafe extern "C" fn() -> (i32)) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing to: `&unsafe extern "C" fn() -> (i32)`

View file

@ -5,7 +5,7 @@
#![allow(clippy::redundant_closure_call)]
#![warn(clippy::needless_pass_by_ref_mut)]
pub async fn inner_async3(x: &i32, y: &mut u32) {
async fn inner_async3(x: &i32, y: &mut u32) {
//~^ ERROR: this argument is a mutable reference, but not used mutably
async {
*y += 1;
@ -13,7 +13,7 @@ pub async fn inner_async3(x: &i32, y: &mut u32) {
.await;
}
pub async fn inner_async4(u: &mut i32, v: &u32) {
async fn inner_async4(u: &mut i32, v: &u32) {
//~^ ERROR: this argument is a mutable reference, but not used mutably
async {
*u += 1;

View file

@ -5,7 +5,7 @@
#![allow(clippy::redundant_closure_call)]
#![warn(clippy::needless_pass_by_ref_mut)]
pub async fn inner_async3(x: &mut i32, y: &mut u32) {
async fn inner_async3(x: &mut i32, y: &mut u32) {
//~^ ERROR: this argument is a mutable reference, but not used mutably
async {
*y += 1;
@ -13,7 +13,7 @@ pub async fn inner_async3(x: &mut i32, y: &mut u32) {
.await;
}
pub async fn inner_async4(u: &mut i32, v: &mut u32) {
async fn inner_async4(u: &mut i32, v: &mut u32) {
//~^ ERROR: this argument is a mutable reference, but not used mutably
async {
*u += 1;

View file

@ -1,20 +1,17 @@
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut2.rs:8:30
--> tests/ui/needless_pass_by_ref_mut2.rs:8:26
|
LL | pub async fn inner_async3(x: &mut i32, y: &mut u32) {
| ^^^^^^^^ help: consider changing to: `&i32`
LL | async fn inner_async3(x: &mut i32, y: &mut u32) {
| ^^^^^^^^ help: consider changing to: `&i32`
|
= warning: changing this function will impact semver compatibility
= note: `-D clippy::needless-pass-by-ref-mut` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_pass_by_ref_mut)]`
error: this argument is a mutable reference, but not used mutably
--> tests/ui/needless_pass_by_ref_mut2.rs:16:43
--> tests/ui/needless_pass_by_ref_mut2.rs:16:39
|
LL | pub async fn inner_async4(u: &mut i32, v: &mut u32) {
| ^^^^^^^^ help: consider changing to: `&u32`
|
= warning: changing this function will impact semver compatibility
LL | async fn inner_async4(u: &mut i32, v: &mut u32) {
| ^^^^^^^^ help: consider changing to: `&u32`
error: aborting due to 2 previous errors

View file

@ -228,12 +228,41 @@ fn needless_return_macro() -> String {
format!("Hello {}", "world!")
}
fn issue_9361() -> i32 {
let n = 1;
#[allow(clippy::arithmetic_side_effects)]
fn issue_9361(n: i32) -> i32 {
#[expect(clippy::arithmetic_side_effects)]
return n + n;
}
mod issue_12998 {
fn expect_lint() -> i32 {
let x = 1;
#[expect(clippy::needless_return)]
return x;
}
fn expect_group() -> i32 {
let x = 1;
#[expect(clippy::style)]
return x;
}
fn expect_all() -> i32 {
let x = 1;
#[expect(clippy::all)]
return x;
}
fn expect_warnings() -> i32 {
let x = 1;
#[expect(warnings)]
return x;
}
}
fn issue8336(x: i32) -> bool {
if x > 0 {
println!("something");

View file

@ -236,12 +236,41 @@ fn needless_return_macro() -> String {
return format!("Hello {}", "world!");
}
fn issue_9361() -> i32 {
let n = 1;
#[allow(clippy::arithmetic_side_effects)]
fn issue_9361(n: i32) -> i32 {
#[expect(clippy::arithmetic_side_effects)]
return n + n;
}
mod issue_12998 {
fn expect_lint() -> i32 {
let x = 1;
#[expect(clippy::needless_return)]
return x;
}
fn expect_group() -> i32 {
let x = 1;
#[expect(clippy::style)]
return x;
}
fn expect_all() -> i32 {
let x = 1;
#[expect(clippy::all)]
return x;
}
fn expect_warnings() -> i32 {
let x = 1;
#[expect(warnings)]
return x;
}
}
fn issue8336(x: i32) -> bool {
if x > 0 {
println!("something");

View file

@ -483,7 +483,7 @@ LL + format!("Hello {}", "world!")
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:248:9
--> tests/ui/needless_return.rs:277:9
|
LL | return true;
| ^^^^^^^^^^^
@ -497,7 +497,7 @@ LL ~ }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:250:9
--> tests/ui/needless_return.rs:279:9
|
LL | return false;
| ^^^^^^^^^^^^
@ -509,7 +509,7 @@ LL ~ }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:257:13
--> tests/ui/needless_return.rs:286:13
|
LL | return 10;
| ^^^^^^^^^
@ -524,7 +524,7 @@ LL ~ }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:260:13
--> tests/ui/needless_return.rs:289:13
|
LL | return 100;
| ^^^^^^^^^^
@ -537,7 +537,7 @@ LL ~ }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:268:9
--> tests/ui/needless_return.rs:297:9
|
LL | return 0;
| ^^^^^^^^
@ -549,7 +549,7 @@ LL ~ }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:275:13
--> tests/ui/needless_return.rs:304:13
|
LL | return *(x as *const isize);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -564,7 +564,7 @@ LL ~ }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:277:13
--> tests/ui/needless_return.rs:306:13
|
LL | return !*(x as *const isize);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -577,7 +577,7 @@ LL ~ }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:284:20
--> tests/ui/needless_return.rs:313:20
|
LL | let _ = 42;
| ____________________^
@ -594,7 +594,7 @@ LL + let _ = 42;
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:291:20
--> tests/ui/needless_return.rs:320:20
|
LL | let _ = 42; return;
| ^^^^^^^
@ -606,7 +606,7 @@ LL + let _ = 42;
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:303:9
--> tests/ui/needless_return.rs:332:9
|
LL | return Ok(format!("ok!"));
| ^^^^^^^^^^^^^^^^^^^^^^^^^
@ -618,7 +618,7 @@ LL + Ok(format!("ok!"))
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:305:9
--> tests/ui/needless_return.rs:334:9
|
LL | return Err(format!("err!"));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -630,7 +630,7 @@ LL + Err(format!("err!"))
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:311:9
--> tests/ui/needless_return.rs:340:9
|
LL | return if true { 1 } else { 2 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -642,7 +642,7 @@ LL + if true { 1 } else { 2 }
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:315:9
--> tests/ui/needless_return.rs:344:9
|
LL | return if b1 { 0 } else { 1 } | if b2 { 2 } else { 3 } | if b3 { 4 } else { 5 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -654,7 +654,7 @@ LL + (if b1 { 0 } else { 1 } | if b2 { 2 } else { 3 } | if b3 { 4 } else
|
error: unneeded `return` statement
--> tests/ui/needless_return.rs:336:5
--> tests/ui/needless_return.rs:365:5
|
LL | return { "a".to_string() } + "b" + { "c" };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -1,36 +0,0 @@
#![warn(clippy::overflow_check_conditional)]
#![allow(clippy::needless_if)]
fn test(a: u32, b: u32, c: u32) {
if a + b < a {}
//~^ ERROR: you are trying to use classic C overflow conditions that will fail in Rust
//~| NOTE: `-D clippy::overflow-check-conditional` implied by `-D warnings`
if a > a + b {}
//~^ ERROR: you are trying to use classic C overflow conditions that will fail in Rust
if a + b < b {}
//~^ ERROR: you are trying to use classic C overflow conditions that will fail in Rust
if b > a + b {}
//~^ ERROR: you are trying to use classic C overflow conditions that will fail in Rust
if a - b > b {}
//~^ ERROR: you are trying to use classic C underflow conditions that will fail in Rus
if b < a - b {}
//~^ ERROR: you are trying to use classic C underflow conditions that will fail in Rus
if a - b > a {}
//~^ ERROR: you are trying to use classic C underflow conditions that will fail in Rus
if a < a - b {}
//~^ ERROR: you are trying to use classic C underflow conditions that will fail in Rus
if a + b < c {}
if c > a + b {}
if a - b < c {}
if c > a - b {}
let i = 1.1;
let j = 2.2;
if i + j < i {}
if i - j < i {}
if i > i + j {}
if i - j < i {}
}
fn main() {
test(1, 2, 3)
}

View file

@ -1,53 +0,0 @@
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:5:8
|
LL | if a + b < a {}
| ^^^^^^^^^
|
= note: `-D clippy::overflow-check-conditional` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::overflow_check_conditional)]`
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:8:8
|
LL | if a > a + b {}
| ^^^^^^^^^
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:10:8
|
LL | if a + b < b {}
| ^^^^^^^^^
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:12:8
|
LL | if b > a + b {}
| ^^^^^^^^^
error: you are trying to use classic C underflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:14:8
|
LL | if a - b > b {}
| ^^^^^^^^^
error: you are trying to use classic C underflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:16:8
|
LL | if b < a - b {}
| ^^^^^^^^^
error: you are trying to use classic C underflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:18:8
|
LL | if a - b > a {}
| ^^^^^^^^^
error: you are trying to use classic C underflow conditions that will fail in Rust
--> tests/ui/overflow_check_conditional.rs:20:8
|
LL | if a < a - b {}
| ^^^^^^^^^
error: aborting due to 8 previous errors

View file

@ -0,0 +1,27 @@
#![warn(clippy::panicking_overflow_checks)]
#![allow(clippy::needless_if)]
fn test(a: u32, b: u32, c: u32) {
if a + b < a {} //~ panicking_overflow_checks
if a > a + b {} //~ panicking_overflow_checks
if a + b < b {} //~ panicking_overflow_checks
if b > a + b {} //~ panicking_overflow_checks
if a - b > b {}
if b < a - b {}
if a - b > a {} //~ panicking_overflow_checks
if a < a - b {} //~ panicking_overflow_checks
if a + b < c {}
if c > a + b {}
if a - b < c {}
if c > a - b {}
let i = 1.1;
let j = 2.2;
if i + j < i {}
if i - j < i {}
if i > i + j {}
if i - j < i {}
}
fn main() {
test(1, 2, 3)
}

View file

@ -0,0 +1,41 @@
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/panicking_overflow_checks.rs:5:8
|
LL | if a + b < a {}
| ^^^^^^^^^
|
= note: `-D clippy::panicking-overflow-checks` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::panicking_overflow_checks)]`
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/panicking_overflow_checks.rs:6:8
|
LL | if a > a + b {}
| ^^^^^^^^^
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/panicking_overflow_checks.rs:7:8
|
LL | if a + b < b {}
| ^^^^^^^^^
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/panicking_overflow_checks.rs:8:8
|
LL | if b > a + b {}
| ^^^^^^^^^
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/panicking_overflow_checks.rs:11:8
|
LL | if a - b > a {}
| ^^^^^^^^^
error: you are trying to use classic C overflow conditions that will fail in Rust
--> tests/ui/panicking_overflow_checks.rs:12:8
|
LL | if a < a - b {}
| ^^^^^^^^^
error: aborting due to 6 previous errors

View file

@ -1,4 +1,4 @@
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:18:33
|
LL | *unsafe { Box::from_raw(Box::into_raw(Box::new(o)) as *mut super::issue_11278_a::T<String>) }
@ -7,37 +7,37 @@ LL | *unsafe { Box::from_raw(Box::into_raw(Box::new(o)) as *mut super::i
= note: `-D clippy::ptr-as-ptr` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::ptr_as_ptr)]`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:27:13
|
LL | let _ = ptr as *const i32;
| ^^^^^^^^^^^^^^^^^ help: try `pointer::cast`, a safer alternative: `ptr.cast::<i32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:28:13
|
LL | let _ = mut_ptr as *mut i32;
| ^^^^^^^^^^^^^^^^^^^ help: try `pointer::cast`, a safer alternative: `mut_ptr.cast::<i32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:33:17
|
LL | let _ = *ptr_ptr as *const i32;
| ^^^^^^^^^^^^^^^^^^^^^^ help: try `pointer::cast`, a safer alternative: `(*ptr_ptr).cast::<i32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:46:25
|
LL | let _: *const i32 = ptr as *const _;
| ^^^^^^^^^^^^^^^ help: try `pointer::cast`, a safer alternative: `ptr.cast()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:47:23
|
LL | let _: *mut i32 = mut_ptr as _;
| ^^^^^^^^^^^^ help: try `pointer::cast`, a safer alternative: `mut_ptr.cast()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:50:21
|
LL | let _ = inline!($ptr as *const i32);
@ -45,157 +45,157 @@ LL | let _ = inline!($ptr as *const i32);
|
= note: this error originates in the macro `__inline_mac_fn_main` (in Nightly builds, run with -Z macro-backtrace for more info)
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:71:13
|
LL | let _ = ptr as *const i32;
| ^^^^^^^^^^^^^^^^^ help: try `pointer::cast`, a safer alternative: `ptr.cast::<i32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:72:13
|
LL | let _ = mut_ptr as *mut i32;
| ^^^^^^^^^^^^^^^^^^^ help: try `pointer::cast`, a safer alternative: `mut_ptr.cast::<i32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:79:9
|
LL | ptr::null_mut() as *mut u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null_mut::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:83:9
|
LL | std::ptr::null_mut() as *mut u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `std::ptr::null_mut::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:88:9
|
LL | ptr::null_mut() as *mut u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null_mut::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:92:9
|
LL | core::ptr::null_mut() as *mut u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `core::ptr::null_mut::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:97:9
|
LL | ptr::null() as *const u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:101:9
|
LL | std::ptr::null() as *const u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `std::ptr::null::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:106:9
|
LL | ptr::null() as *const u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:110:9
|
LL | core::ptr::null() as *const u32
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `core::ptr::null::<u32>()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:117:9
|
LL | ptr::null_mut() as *mut _
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:121:9
|
LL | std::ptr::null_mut() as *mut _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `std::ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:126:9
|
LL | ptr::null_mut() as *mut _
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:130:9
|
LL | core::ptr::null_mut() as *mut _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `core::ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:135:9
|
LL | ptr::null() as *const _
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:139:9
|
LL | std::ptr::null() as *const _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `std::ptr::null()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:144:9
|
LL | ptr::null() as *const _
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:148:9
|
LL | core::ptr::null() as *const _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `core::ptr::null()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:155:9
|
LL | ptr::null_mut() as _
| ^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:159:9
|
LL | std::ptr::null_mut() as _
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `std::ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:164:9
|
LL | ptr::null_mut() as _
| ^^^^^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:168:9
|
LL | core::ptr::null_mut() as _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `core::ptr::null_mut()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:173:9
|
LL | ptr::null() as _
| ^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:177:9
|
LL | std::ptr::null() as _
| ^^^^^^^^^^^^^^^^^^^^^ help: try call directly: `std::ptr::null()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:182:9
|
LL | ptr::null() as _
| ^^^^^^^^^^^^^^^^ help: try call directly: `ptr::null()`
error: `as` casting between raw pointers without changing its mutability
error: `as` casting between raw pointers without changing their constness
--> tests/ui/ptr_as_ptr.rs:186:9
|
LL | core::ptr::null() as _

View file

@ -24,9 +24,11 @@
#![allow(clippy::expect_used)]
#![allow(clippy::map_unwrap_or)]
#![allow(clippy::unwrap_used)]
#![allow(clippy::panicking_overflow_checks)]
#![allow(clippy::needless_borrow)]
#![allow(clippy::single_char_add_str)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::missing_const_for_thread_local)]
#![allow(clippy::recursive_format_impl)]
#![allow(clippy::unwrap_or_default)]
#![allow(clippy::invisible_characters)]
@ -77,12 +79,14 @@
#![warn(clippy::map_unwrap_or)]
#![warn(clippy::map_unwrap_or)]
#![warn(clippy::unwrap_used)]
#![warn(clippy::panicking_overflow_checks)]
#![warn(clippy::needless_borrow)]
#![warn(clippy::expect_used)]
#![warn(clippy::map_unwrap_or)]
#![warn(clippy::unwrap_used)]
#![warn(clippy::single_char_add_str)]
#![warn(clippy::module_name_repetitions)]
#![warn(clippy::missing_const_for_thread_local)]
#![warn(clippy::recursive_format_impl)]
#![warn(clippy::unwrap_or_default)]
#![warn(clippy::invisible_characters)]

View file

@ -24,9 +24,11 @@
#![allow(clippy::expect_used)]
#![allow(clippy::map_unwrap_or)]
#![allow(clippy::unwrap_used)]
#![allow(clippy::panicking_overflow_checks)]
#![allow(clippy::needless_borrow)]
#![allow(clippy::single_char_add_str)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::missing_const_for_thread_local)]
#![allow(clippy::recursive_format_impl)]
#![allow(clippy::unwrap_or_default)]
#![allow(clippy::invisible_characters)]
@ -77,12 +79,14 @@
#![warn(clippy::option_map_unwrap_or)]
#![warn(clippy::option_map_unwrap_or_else)]
#![warn(clippy::option_unwrap_used)]
#![warn(clippy::overflow_check_conditional)]
#![warn(clippy::ref_in_deref)]
#![warn(clippy::result_expect_used)]
#![warn(clippy::result_map_unwrap_or_else)]
#![warn(clippy::result_unwrap_used)]
#![warn(clippy::single_char_push_str)]
#![warn(clippy::stutter)]
#![warn(clippy::thread_local_initializer_can_be_made_const)]
#![warn(clippy::to_string_in_display)]
#![warn(clippy::unwrap_or_else_default)]
#![warn(clippy::zero_width_space)]

View file

@ -1,5 +1,5 @@
error: lint `clippy::almost_complete_letter_range` has been renamed to `clippy::almost_complete_range`
--> tests/ui/rename.rs:56:9
--> tests/ui/rename.rs:58:9
|
LL | #![warn(clippy::almost_complete_letter_range)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::almost_complete_range`
@ -8,346 +8,358 @@ LL | #![warn(clippy::almost_complete_letter_range)]
= help: to override `-D warnings` add `#[allow(renamed_and_removed_lints)]`
error: lint `clippy::blacklisted_name` has been renamed to `clippy::disallowed_names`
--> tests/ui/rename.rs:57:9
--> tests/ui/rename.rs:59:9
|
LL | #![warn(clippy::blacklisted_name)]
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::disallowed_names`
error: lint `clippy::block_in_if_condition_expr` has been renamed to `clippy::blocks_in_conditions`
--> tests/ui/rename.rs:58:9
--> tests/ui/rename.rs:60:9
|
LL | #![warn(clippy::block_in_if_condition_expr)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::blocks_in_conditions`
error: lint `clippy::block_in_if_condition_stmt` has been renamed to `clippy::blocks_in_conditions`
--> tests/ui/rename.rs:59:9
--> tests/ui/rename.rs:61:9
|
LL | #![warn(clippy::block_in_if_condition_stmt)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::blocks_in_conditions`
error: lint `clippy::blocks_in_if_conditions` has been renamed to `clippy::blocks_in_conditions`
--> tests/ui/rename.rs:60:9
--> tests/ui/rename.rs:62:9
|
LL | #![warn(clippy::blocks_in_if_conditions)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::blocks_in_conditions`
error: lint `clippy::box_vec` has been renamed to `clippy::box_collection`
--> tests/ui/rename.rs:61:9
--> tests/ui/rename.rs:63:9
|
LL | #![warn(clippy::box_vec)]
| ^^^^^^^^^^^^^^^ help: use the new name: `clippy::box_collection`
error: lint `clippy::const_static_lifetime` has been renamed to `clippy::redundant_static_lifetimes`
--> tests/ui/rename.rs:62:9
--> tests/ui/rename.rs:64:9
|
LL | #![warn(clippy::const_static_lifetime)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::redundant_static_lifetimes`
error: lint `clippy::cyclomatic_complexity` has been renamed to `clippy::cognitive_complexity`
--> tests/ui/rename.rs:63:9
--> tests/ui/rename.rs:65:9
|
LL | #![warn(clippy::cyclomatic_complexity)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::cognitive_complexity`
error: lint `clippy::derive_hash_xor_eq` has been renamed to `clippy::derived_hash_with_manual_eq`
--> tests/ui/rename.rs:64:9
--> tests/ui/rename.rs:66:9
|
LL | #![warn(clippy::derive_hash_xor_eq)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::derived_hash_with_manual_eq`
error: lint `clippy::disallowed_method` has been renamed to `clippy::disallowed_methods`
--> tests/ui/rename.rs:65:9
--> tests/ui/rename.rs:67:9
|
LL | #![warn(clippy::disallowed_method)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::disallowed_methods`
error: lint `clippy::disallowed_type` has been renamed to `clippy::disallowed_types`
--> tests/ui/rename.rs:66:9
--> tests/ui/rename.rs:68:9
|
LL | #![warn(clippy::disallowed_type)]
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::disallowed_types`
error: lint `clippy::eval_order_dependence` has been renamed to `clippy::mixed_read_write_in_expression`
--> tests/ui/rename.rs:67:9
--> tests/ui/rename.rs:69:9
|
LL | #![warn(clippy::eval_order_dependence)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::mixed_read_write_in_expression`
error: lint `clippy::identity_conversion` has been renamed to `clippy::useless_conversion`
--> tests/ui/rename.rs:68:9
--> tests/ui/rename.rs:70:9
|
LL | #![warn(clippy::identity_conversion)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::useless_conversion`
error: lint `clippy::if_let_some_result` has been renamed to `clippy::match_result_ok`
--> tests/ui/rename.rs:69:9
--> tests/ui/rename.rs:71:9
|
LL | #![warn(clippy::if_let_some_result)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::match_result_ok`
error: lint `clippy::incorrect_clone_impl_on_copy_type` has been renamed to `clippy::non_canonical_clone_impl`
--> tests/ui/rename.rs:70:9
--> tests/ui/rename.rs:72:9
|
LL | #![warn(clippy::incorrect_clone_impl_on_copy_type)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::non_canonical_clone_impl`
error: lint `clippy::incorrect_partial_ord_impl_on_ord_type` has been renamed to `clippy::non_canonical_partial_ord_impl`
--> tests/ui/rename.rs:71:9
--> tests/ui/rename.rs:73:9
|
LL | #![warn(clippy::incorrect_partial_ord_impl_on_ord_type)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::non_canonical_partial_ord_impl`
error: lint `clippy::integer_arithmetic` has been renamed to `clippy::arithmetic_side_effects`
--> tests/ui/rename.rs:72:9
--> tests/ui/rename.rs:74:9
|
LL | #![warn(clippy::integer_arithmetic)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::arithmetic_side_effects`
error: lint `clippy::logic_bug` has been renamed to `clippy::overly_complex_bool_expr`
--> tests/ui/rename.rs:73:9
--> tests/ui/rename.rs:75:9
|
LL | #![warn(clippy::logic_bug)]
| ^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::overly_complex_bool_expr`
error: lint `clippy::new_without_default_derive` has been renamed to `clippy::new_without_default`
--> tests/ui/rename.rs:74:9
--> tests/ui/rename.rs:76:9
|
LL | #![warn(clippy::new_without_default_derive)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::new_without_default`
error: lint `clippy::option_and_then_some` has been renamed to `clippy::bind_instead_of_map`
--> tests/ui/rename.rs:75:9
--> tests/ui/rename.rs:77:9
|
LL | #![warn(clippy::option_and_then_some)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::bind_instead_of_map`
error: lint `clippy::option_expect_used` has been renamed to `clippy::expect_used`
--> tests/ui/rename.rs:76:9
--> tests/ui/rename.rs:78:9
|
LL | #![warn(clippy::option_expect_used)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::expect_used`
error: lint `clippy::option_map_unwrap_or` has been renamed to `clippy::map_unwrap_or`
--> tests/ui/rename.rs:77:9
--> tests/ui/rename.rs:79:9
|
LL | #![warn(clippy::option_map_unwrap_or)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::map_unwrap_or`
error: lint `clippy::option_map_unwrap_or_else` has been renamed to `clippy::map_unwrap_or`
--> tests/ui/rename.rs:78:9
--> tests/ui/rename.rs:80:9
|
LL | #![warn(clippy::option_map_unwrap_or_else)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::map_unwrap_or`
error: lint `clippy::option_unwrap_used` has been renamed to `clippy::unwrap_used`
--> tests/ui/rename.rs:79:9
--> tests/ui/rename.rs:81:9
|
LL | #![warn(clippy::option_unwrap_used)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::unwrap_used`
error: lint `clippy::overflow_check_conditional` has been renamed to `clippy::panicking_overflow_checks`
--> tests/ui/rename.rs:82:9
|
LL | #![warn(clippy::overflow_check_conditional)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::panicking_overflow_checks`
error: lint `clippy::ref_in_deref` has been renamed to `clippy::needless_borrow`
--> tests/ui/rename.rs:80:9
--> tests/ui/rename.rs:83:9
|
LL | #![warn(clippy::ref_in_deref)]
| ^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::needless_borrow`
error: lint `clippy::result_expect_used` has been renamed to `clippy::expect_used`
--> tests/ui/rename.rs:81:9
--> tests/ui/rename.rs:84:9
|
LL | #![warn(clippy::result_expect_used)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::expect_used`
error: lint `clippy::result_map_unwrap_or_else` has been renamed to `clippy::map_unwrap_or`
--> tests/ui/rename.rs:82:9
--> tests/ui/rename.rs:85:9
|
LL | #![warn(clippy::result_map_unwrap_or_else)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::map_unwrap_or`
error: lint `clippy::result_unwrap_used` has been renamed to `clippy::unwrap_used`
--> tests/ui/rename.rs:83:9
--> tests/ui/rename.rs:86:9
|
LL | #![warn(clippy::result_unwrap_used)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::unwrap_used`
error: lint `clippy::single_char_push_str` has been renamed to `clippy::single_char_add_str`
--> tests/ui/rename.rs:84:9
--> tests/ui/rename.rs:87:9
|
LL | #![warn(clippy::single_char_push_str)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::single_char_add_str`
error: lint `clippy::stutter` has been renamed to `clippy::module_name_repetitions`
--> tests/ui/rename.rs:85:9
--> tests/ui/rename.rs:88:9
|
LL | #![warn(clippy::stutter)]
| ^^^^^^^^^^^^^^^ help: use the new name: `clippy::module_name_repetitions`
error: lint `clippy::thread_local_initializer_can_be_made_const` has been renamed to `clippy::missing_const_for_thread_local`
--> tests/ui/rename.rs:89:9
|
LL | #![warn(clippy::thread_local_initializer_can_be_made_const)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::missing_const_for_thread_local`
error: lint `clippy::to_string_in_display` has been renamed to `clippy::recursive_format_impl`
--> tests/ui/rename.rs:86:9
--> tests/ui/rename.rs:90:9
|
LL | #![warn(clippy::to_string_in_display)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::recursive_format_impl`
error: lint `clippy::unwrap_or_else_default` has been renamed to `clippy::unwrap_or_default`
--> tests/ui/rename.rs:87:9
--> tests/ui/rename.rs:91:9
|
LL | #![warn(clippy::unwrap_or_else_default)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::unwrap_or_default`
error: lint `clippy::zero_width_space` has been renamed to `clippy::invisible_characters`
--> tests/ui/rename.rs:88:9
--> tests/ui/rename.rs:92:9
|
LL | #![warn(clippy::zero_width_space)]
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::invisible_characters`
error: lint `clippy::cast_ref_to_mut` has been renamed to `invalid_reference_casting`
--> tests/ui/rename.rs:89:9
--> tests/ui/rename.rs:93:9
|
LL | #![warn(clippy::cast_ref_to_mut)]
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_reference_casting`
error: lint `clippy::clone_double_ref` has been renamed to `suspicious_double_ref_op`
--> tests/ui/rename.rs:90:9
--> tests/ui/rename.rs:94:9
|
LL | #![warn(clippy::clone_double_ref)]
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `suspicious_double_ref_op`
error: lint `clippy::cmp_nan` has been renamed to `invalid_nan_comparisons`
--> tests/ui/rename.rs:91:9
--> tests/ui/rename.rs:95:9
|
LL | #![warn(clippy::cmp_nan)]
| ^^^^^^^^^^^^^^^ help: use the new name: `invalid_nan_comparisons`
error: lint `clippy::drop_bounds` has been renamed to `drop_bounds`
--> tests/ui/rename.rs:92:9
--> tests/ui/rename.rs:96:9
|
LL | #![warn(clippy::drop_bounds)]
| ^^^^^^^^^^^^^^^^^^^ help: use the new name: `drop_bounds`
error: lint `clippy::drop_copy` has been renamed to `dropping_copy_types`
--> tests/ui/rename.rs:93:9
--> tests/ui/rename.rs:97:9
|
LL | #![warn(clippy::drop_copy)]
| ^^^^^^^^^^^^^^^^^ help: use the new name: `dropping_copy_types`
error: lint `clippy::drop_ref` has been renamed to `dropping_references`
--> tests/ui/rename.rs:94:9
--> tests/ui/rename.rs:98:9
|
LL | #![warn(clippy::drop_ref)]
| ^^^^^^^^^^^^^^^^ help: use the new name: `dropping_references`
error: lint `clippy::fn_null_check` has been renamed to `useless_ptr_null_checks`
--> tests/ui/rename.rs:95:9
--> tests/ui/rename.rs:99:9
|
LL | #![warn(clippy::fn_null_check)]
| ^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `useless_ptr_null_checks`
error: lint `clippy::for_loop_over_option` has been renamed to `for_loops_over_fallibles`
--> tests/ui/rename.rs:96:9
--> tests/ui/rename.rs:100:9
|
LL | #![warn(clippy::for_loop_over_option)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `for_loops_over_fallibles`
error: lint `clippy::for_loop_over_result` has been renamed to `for_loops_over_fallibles`
--> tests/ui/rename.rs:97:9
--> tests/ui/rename.rs:101:9
|
LL | #![warn(clippy::for_loop_over_result)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `for_loops_over_fallibles`
error: lint `clippy::for_loops_over_fallibles` has been renamed to `for_loops_over_fallibles`
--> tests/ui/rename.rs:98:9
--> tests/ui/rename.rs:102:9
|
LL | #![warn(clippy::for_loops_over_fallibles)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `for_loops_over_fallibles`
error: lint `clippy::forget_copy` has been renamed to `forgetting_copy_types`
--> tests/ui/rename.rs:99:9
--> tests/ui/rename.rs:103:9
|
LL | #![warn(clippy::forget_copy)]
| ^^^^^^^^^^^^^^^^^^^ help: use the new name: `forgetting_copy_types`
error: lint `clippy::forget_ref` has been renamed to `forgetting_references`
--> tests/ui/rename.rs:100:9
--> tests/ui/rename.rs:104:9
|
LL | #![warn(clippy::forget_ref)]
| ^^^^^^^^^^^^^^^^^^ help: use the new name: `forgetting_references`
error: lint `clippy::into_iter_on_array` has been renamed to `array_into_iter`
--> tests/ui/rename.rs:101:9
--> tests/ui/rename.rs:105:9
|
LL | #![warn(clippy::into_iter_on_array)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `array_into_iter`
error: lint `clippy::invalid_atomic_ordering` has been renamed to `invalid_atomic_ordering`
--> tests/ui/rename.rs:102:9
--> tests/ui/rename.rs:106:9
|
LL | #![warn(clippy::invalid_atomic_ordering)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_atomic_ordering`
error: lint `clippy::invalid_ref` has been renamed to `invalid_value`
--> tests/ui/rename.rs:103:9
--> tests/ui/rename.rs:107:9
|
LL | #![warn(clippy::invalid_ref)]
| ^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_value`
error: lint `clippy::invalid_utf8_in_unchecked` has been renamed to `invalid_from_utf8_unchecked`
--> tests/ui/rename.rs:104:9
--> tests/ui/rename.rs:108:9
|
LL | #![warn(clippy::invalid_utf8_in_unchecked)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_from_utf8_unchecked`
error: lint `clippy::let_underscore_drop` has been renamed to `let_underscore_drop`
--> tests/ui/rename.rs:105:9
--> tests/ui/rename.rs:109:9
|
LL | #![warn(clippy::let_underscore_drop)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `let_underscore_drop`
error: lint `clippy::mem_discriminant_non_enum` has been renamed to `enum_intrinsics_non_enums`
--> tests/ui/rename.rs:106:9
--> tests/ui/rename.rs:110:9
|
LL | #![warn(clippy::mem_discriminant_non_enum)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `enum_intrinsics_non_enums`
error: lint `clippy::panic_params` has been renamed to `non_fmt_panics`
--> tests/ui/rename.rs:107:9
--> tests/ui/rename.rs:111:9
|
LL | #![warn(clippy::panic_params)]
| ^^^^^^^^^^^^^^^^^^^^ help: use the new name: `non_fmt_panics`
error: lint `clippy::positional_named_format_parameters` has been renamed to `named_arguments_used_positionally`
--> tests/ui/rename.rs:108:9
--> tests/ui/rename.rs:112:9
|
LL | #![warn(clippy::positional_named_format_parameters)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `named_arguments_used_positionally`
error: lint `clippy::temporary_cstring_as_ptr` has been renamed to `temporary_cstring_as_ptr`
--> tests/ui/rename.rs:109:9
--> tests/ui/rename.rs:113:9
|
LL | #![warn(clippy::temporary_cstring_as_ptr)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `temporary_cstring_as_ptr`
error: lint `clippy::undropped_manually_drops` has been renamed to `undropped_manually_drops`
--> tests/ui/rename.rs:110:9
--> tests/ui/rename.rs:114:9
|
LL | #![warn(clippy::undropped_manually_drops)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `undropped_manually_drops`
error: lint `clippy::unknown_clippy_lints` has been renamed to `unknown_lints`
--> tests/ui/rename.rs:111:9
--> tests/ui/rename.rs:115:9
|
LL | #![warn(clippy::unknown_clippy_lints)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `unknown_lints`
error: lint `clippy::unused_label` has been renamed to `unused_labels`
--> tests/ui/rename.rs:112:9
--> tests/ui/rename.rs:116:9
|
LL | #![warn(clippy::unused_label)]
| ^^^^^^^^^^^^^^^^^^^^ help: use the new name: `unused_labels`
error: lint `clippy::vtable_address_comparisons` has been renamed to `ambiguous_wide_pointer_comparisons`
--> tests/ui/rename.rs:113:9
--> tests/ui/rename.rs:117:9
|
LL | #![warn(clippy::vtable_address_comparisons)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `ambiguous_wide_pointer_comparisons`
error: aborting due to 58 previous errors
error: aborting due to 60 previous errors

View file

@ -0,0 +1,83 @@
#![allow(unused)]
#![allow(clippy::nonminimal_bool)]
#![allow(clippy::needless_borrow)]
#![warn(clippy::set_contains_or_insert)]
use std::collections::HashSet;
fn main() {
should_warn_cases();
should_not_warn_cases();
}
fn should_warn_cases() {
let mut set = HashSet::new();
let value = 5;
if !set.contains(&value) {
set.insert(value);
println!("Just a comment");
}
if set.contains(&value) {
set.insert(value);
println!("Just a comment");
}
if !set.contains(&value) {
set.insert(value);
}
if !!set.contains(&value) {
set.insert(value);
println!("Just a comment");
}
if (&set).contains(&value) {
set.insert(value);
}
let borrow_value = &6;
if !set.contains(borrow_value) {
set.insert(*borrow_value);
}
let borrow_set = &mut set;
if !borrow_set.contains(&value) {
borrow_set.insert(value);
}
}
fn should_not_warn_cases() {
let mut set = HashSet::new();
let value = 5;
let another_value = 6;
if !set.contains(&value) {
set.insert(another_value);
}
if !set.contains(&value) {
println!("Just a comment");
}
if simply_true() {
set.insert(value);
}
if !set.contains(&value) {
set.replace(value); //it is not insert
println!("Just a comment");
}
if set.contains(&value) {
println!("value is already in set");
} else {
set.insert(value);
}
}
fn simply_true() -> bool {
true
}

View file

@ -0,0 +1,61 @@
error: usage of `HashSet::insert` after `HashSet::contains`
--> tests/ui/set_contains_or_insert.rs:18:13
|
LL | if !set.contains(&value) {
| ^^^^^^^^^^^^^^^^
LL | set.insert(value);
| ^^^^^^^^^^^^^
|
= note: `-D clippy::set-contains-or-insert` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::set_contains_or_insert)]`
error: usage of `HashSet::insert` after `HashSet::contains`
--> tests/ui/set_contains_or_insert.rs:23:12
|
LL | if set.contains(&value) {
| ^^^^^^^^^^^^^^^^
LL | set.insert(value);
| ^^^^^^^^^^^^^
error: usage of `HashSet::insert` after `HashSet::contains`
--> tests/ui/set_contains_or_insert.rs:28:13
|
LL | if !set.contains(&value) {
| ^^^^^^^^^^^^^^^^
LL | set.insert(value);
| ^^^^^^^^^^^^^
error: usage of `HashSet::insert` after `HashSet::contains`
--> tests/ui/set_contains_or_insert.rs:32:14
|
LL | if !!set.contains(&value) {
| ^^^^^^^^^^^^^^^^
LL | set.insert(value);
| ^^^^^^^^^^^^^
error: usage of `HashSet::insert` after `HashSet::contains`
--> tests/ui/set_contains_or_insert.rs:37:15
|
LL | if (&set).contains(&value) {
| ^^^^^^^^^^^^^^^^
LL | set.insert(value);
| ^^^^^^^^^^^^^
error: usage of `HashSet::insert` after `HashSet::contains`
--> tests/ui/set_contains_or_insert.rs:42:13
|
LL | if !set.contains(borrow_value) {
| ^^^^^^^^^^^^^^^^^^^^^^
LL | set.insert(*borrow_value);
| ^^^^^^^^^^^^^^^^^^^^^
error: usage of `HashSet::insert` after `HashSet::contains`
--> tests/ui/set_contains_or_insert.rs:47:20
|
LL | if !borrow_set.contains(&value) {
| ^^^^^^^^^^^^^^^^
LL | borrow_set.insert(value);
| ^^^^^^^^^^^^^
error: aborting due to 7 previous errors

View file

@ -801,4 +801,30 @@ fn should_not_trigger_lint_with_explicit_drop() {
}
}
fn should_trigger_lint_in_if_let() {
let mutex = Mutex::new(vec![1]);
if let Some(val) = mutex.lock().unwrap().first().copied() {
//~^ ERROR: temporary with significant `Drop` in `if let` scrutinee will live until the
//~| NOTE: this might lead to deadlocks or other unexpected behavior
println!("{}", val);
}
// Should not trigger lint without the final `copied()`, because we actually hold a reference
// (i.e., the `val`) to the locked data.
if let Some(val) = mutex.lock().unwrap().first() {
println!("{}", val);
};
}
fn should_trigger_lint_in_while_let() {
let mutex = Mutex::new(vec![1]);
while let Some(val) = mutex.lock().unwrap().pop() {
//~^ ERROR: temporary with significant `Drop` in `while let` scrutinee will live until the
//~| NOTE: this might lead to deadlocks or other unexpected behavior
println!("{}", val);
}
}
fn main() {}

View file

@ -541,5 +541,32 @@ LL ~ let value = mutex.lock().unwrap()[0];
LL ~ for val in [value, 2] {
|
error: aborting due to 27 previous errors
error: temporary with significant `Drop` in `if let` scrutinee will live until the end of the `if let` expression
--> tests/ui/significant_drop_in_scrutinee.rs:807:24
|
LL | if let Some(val) = mutex.lock().unwrap().first().copied() {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | }
| - temporary lives until here
|
= note: this might lead to deadlocks or other unexpected behavior
help: try moving the temporary above the match
|
LL ~ let value = mutex.lock().unwrap().first().copied();
LL ~ if let Some(val) = value {
|
error: temporary with significant `Drop` in `while let` scrutinee will live until the end of the `while let` expression
--> tests/ui/significant_drop_in_scrutinee.rs:823:27
|
LL | while let Some(val) = mutex.lock().unwrap().pop() {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | }
| - temporary lives until here
|
= note: this might lead to deadlocks or other unexpected behavior
error: aborting due to 29 previous errors

View file

@ -43,7 +43,7 @@ fn get_number() -> i32 {
0
}
fn get_usize() -> usize {
const fn get_usize() -> usize {
0
}
fn get_struct() -> Struct {
@ -113,4 +113,16 @@ fn main() {
'label: {
break 'label
};
let () = const {
[42, 55][get_usize()];
};
}
const _: () = {
[42, 55][get_usize()];
};
const fn foo() {
assert!([42, 55].len() > get_usize());
//~^ ERROR: unnecessary operation
}

View file

@ -43,7 +43,7 @@ fn get_number() -> i32 {
0
}
fn get_usize() -> usize {
const fn get_usize() -> usize {
0
}
fn get_struct() -> Struct {
@ -117,4 +117,16 @@ fn main() {
'label: {
break 'label
};
let () = const {
[42, 55][get_usize()];
};
}
const _: () = {
[42, 55][get_usize()];
};
const fn foo() {
[42, 55][get_usize()];
//~^ ERROR: unnecessary operation
}

View file

@ -119,5 +119,11 @@ LL | | s: String::from("blah"),
LL | | };
| |______^ help: statement can be reduced to: `String::from("blah");`
error: aborting due to 19 previous errors
error: unnecessary operation
--> tests/ui/unnecessary_operation.rs:130:5
|
LL | [42, 55][get_usize()];
| ^^^^^^^^^^^^^^^^^^^^^^ help: statement can be written as: `assert!([42, 55].len() > get_usize());`
error: aborting due to 20 previous errors

View file

@ -157,6 +157,25 @@ fn main() {
require_path(&std::path::PathBuf::from("x"));
require_str(&String::from("x"));
require_slice(&[String::from("x")]);
let slice = [0u8; 1024];
let _ref_str: &str = core::str::from_utf8(&slice).expect("not UTF-8");
let _ref_str: &str = core::str::from_utf8(b"foo").unwrap();
let _ref_str: &str = core::str::from_utf8(b"foo".as_slice()).unwrap();
// Expression is of type `&String`, can't suggest `str::from_utf8` here
let _ref_string = &String::from_utf8(b"foo".to_vec()).unwrap();
macro_rules! arg_from_macro {
() => {
b"foo".to_vec()
};
}
macro_rules! string_from_utf8_from_macro {
() => {
&String::from_utf8(b"foo".to_vec()).unwrap()
};
}
let _ref_str: &str = &String::from_utf8(arg_from_macro!()).unwrap();
let _ref_str: &str = string_from_utf8_from_macro!();
}
fn require_c_str(_: &CStr) {}

View file

@ -157,6 +157,25 @@ fn main() {
require_path(&std::path::PathBuf::from("x").to_path_buf());
require_str(&String::from("x").to_string());
require_slice(&[String::from("x")].to_owned());
let slice = [0u8; 1024];
let _ref_str: &str = &String::from_utf8(slice.to_vec()).expect("not UTF-8");
let _ref_str: &str = &String::from_utf8(b"foo".to_vec()).unwrap();
let _ref_str: &str = &String::from_utf8(b"foo".as_slice().to_owned()).unwrap();
// Expression is of type `&String`, can't suggest `str::from_utf8` here
let _ref_string = &String::from_utf8(b"foo".to_vec()).unwrap();
macro_rules! arg_from_macro {
() => {
b"foo".to_vec()
};
}
macro_rules! string_from_utf8_from_macro {
() => {
&String::from_utf8(b"foo".to_vec()).unwrap()
};
}
let _ref_str: &str = &String::from_utf8(arg_from_macro!()).unwrap();
let _ref_str: &str = string_from_utf8_from_macro!();
}
fn require_c_str(_: &CStr) {}

View file

@ -477,8 +477,44 @@ error: unnecessary use of `to_owned`
LL | let _ = IntoIterator::into_iter([std::path::PathBuf::new()][..].to_owned());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `[std::path::PathBuf::new()][..].iter().cloned()`
error: allocating a new `String` only to create a temporary `&str` from it
--> tests/ui/unnecessary_to_owned.rs:162:26
|
LL | let _ref_str: &str = &String::from_utf8(slice.to_vec()).expect("not UTF-8");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: convert from `&[u8]` to `&str` directly
|
LL - let _ref_str: &str = &String::from_utf8(slice.to_vec()).expect("not UTF-8");
LL + let _ref_str: &str = core::str::from_utf8(&slice).expect("not UTF-8");
|
error: allocating a new `String` only to create a temporary `&str` from it
--> tests/ui/unnecessary_to_owned.rs:163:26
|
LL | let _ref_str: &str = &String::from_utf8(b"foo".to_vec()).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: convert from `&[u8]` to `&str` directly
|
LL - let _ref_str: &str = &String::from_utf8(b"foo".to_vec()).unwrap();
LL + let _ref_str: &str = core::str::from_utf8(b"foo").unwrap();
|
error: allocating a new `String` only to create a temporary `&str` from it
--> tests/ui/unnecessary_to_owned.rs:164:26
|
LL | let _ref_str: &str = &String::from_utf8(b"foo".as_slice().to_owned()).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: convert from `&[u8]` to `&str` directly
|
LL - let _ref_str: &str = &String::from_utf8(b"foo".as_slice().to_owned()).unwrap();
LL + let _ref_str: &str = core::str::from_utf8(b"foo".as_slice()).unwrap();
|
error: unnecessary use of `to_vec`
--> tests/ui/unnecessary_to_owned.rs:202:14
--> tests/ui/unnecessary_to_owned.rs:221:14
|
LL | for t in file_types.to_vec() {
| ^^^^^^^^^^^^^^^^^^^
@ -494,64 +530,64 @@ LL + let path = match get_file_path(t) {
|
error: unnecessary use of `to_vec`
--> tests/ui/unnecessary_to_owned.rs:225:14
--> tests/ui/unnecessary_to_owned.rs:244:14
|
LL | let _ = &["x"][..].to_vec().into_iter();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `["x"][..].iter().cloned()`
error: unnecessary use of `to_vec`
--> tests/ui/unnecessary_to_owned.rs:230:14
--> tests/ui/unnecessary_to_owned.rs:249:14
|
LL | let _ = &["x"][..].to_vec().into_iter();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `["x"][..].iter().copied()`
error: unnecessary use of `to_string`
--> tests/ui/unnecessary_to_owned.rs:278:24
--> tests/ui/unnecessary_to_owned.rs:297:24
|
LL | Box::new(build(y.to_string()))
| ^^^^^^^^^^^^^ help: use: `y`
error: unnecessary use of `to_string`
--> tests/ui/unnecessary_to_owned.rs:387:12
--> tests/ui/unnecessary_to_owned.rs:406:12
|
LL | id("abc".to_string())
| ^^^^^^^^^^^^^^^^^ help: use: `"abc"`
error: unnecessary use of `to_vec`
--> tests/ui/unnecessary_to_owned.rs:530:37
--> tests/ui/unnecessary_to_owned.rs:549:37
|
LL | IntoFuture::into_future(foo([].to_vec(), &0));
| ^^^^^^^^^^^ help: use: `[]`
error: unnecessary use of `to_vec`
--> tests/ui/unnecessary_to_owned.rs:540:18
--> tests/ui/unnecessary_to_owned.rs:559:18
|
LL | s.remove(&a.to_vec());
| ^^^^^^^^^^^ help: replace it with: `a`
error: unnecessary use of `to_owned`
--> tests/ui/unnecessary_to_owned.rs:544:14
--> tests/ui/unnecessary_to_owned.rs:563:14
|
LL | s.remove(&"b".to_owned());
| ^^^^^^^^^^^^^^^ help: replace it with: `"b"`
error: unnecessary use of `to_string`
--> tests/ui/unnecessary_to_owned.rs:545:14
--> tests/ui/unnecessary_to_owned.rs:564:14
|
LL | s.remove(&"b".to_string());
| ^^^^^^^^^^^^^^^^ help: replace it with: `"b"`
error: unnecessary use of `to_vec`
--> tests/ui/unnecessary_to_owned.rs:550:14
--> tests/ui/unnecessary_to_owned.rs:569:14
|
LL | s.remove(&["b"].to_vec());
| ^^^^^^^^^^^^^^^ help: replace it with: `["b"].as_slice()`
error: unnecessary use of `to_vec`
--> tests/ui/unnecessary_to_owned.rs:551:14
--> tests/ui/unnecessary_to_owned.rs:570:14
|
LL | s.remove(&(&["b"]).to_vec());
| ^^^^^^^^^^^^^^^^^^ help: replace it with: `(&["b"]).as_slice()`
error: aborting due to 85 previous errors
error: aborting due to 88 previous errors

View file

@ -204,6 +204,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass {
use super::*;
@ -212,6 +213,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_inside_function {
fn with_super_inside_function() {
use super::*;
@ -219,6 +221,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_further_inside {
fn insidefoo() {}
mod inner {

View file

@ -205,6 +205,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass {
use super::*;
@ -213,6 +214,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_inside_function {
fn with_super_inside_function() {
use super::*;
@ -220,6 +222,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_further_inside {
fn insidefoo() {}
mod inner {

View file

@ -106,31 +106,31 @@ LL | use super::*;
| ^^^^^^^^ help: try: `super::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports.rs:236:17
--> tests/ui/wildcard_imports.rs:239:17
|
LL | use super::*;
| ^^^^^^^^ help: try: `super::insidefoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports.rs:244:13
--> tests/ui/wildcard_imports.rs:247:13
|
LL | use crate::super_imports::*;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `crate::super_imports::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports.rs:253:17
--> tests/ui/wildcard_imports.rs:256:17
|
LL | use super::super::*;
| ^^^^^^^^^^^^^^^ help: try: `super::super::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports.rs:262:13
--> tests/ui/wildcard_imports.rs:265:13
|
LL | use super::super::super_imports::*;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `super::super::super_imports::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports.rs:270:13
--> tests/ui/wildcard_imports.rs:273:13
|
LL | use super::*;
| ^^^^^^^^ help: try: `super::foofoo`

View file

@ -198,6 +198,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass {
use super::*;
@ -206,6 +207,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_inside_function {
fn with_super_inside_function() {
use super::*;
@ -213,6 +215,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_further_inside {
fn insidefoo() {}
mod inner {

View file

@ -106,31 +106,31 @@ LL | use super::*;
| ^^^^^^^^ help: try: `super::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:230:17
--> tests/ui/wildcard_imports_2021.rs:233:17
|
LL | use super::*;
| ^^^^^^^^ help: try: `super::insidefoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:238:13
--> tests/ui/wildcard_imports_2021.rs:241:13
|
LL | use crate::super_imports::*;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `crate::super_imports::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:247:17
--> tests/ui/wildcard_imports_2021.rs:250:17
|
LL | use super::super::*;
| ^^^^^^^^^^^^^^^ help: try: `super::super::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:256:13
--> tests/ui/wildcard_imports_2021.rs:259:13
|
LL | use super::super::super_imports::*;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `super::super::super_imports::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:264:13
--> tests/ui/wildcard_imports_2021.rs:267:13
|
LL | use super::*;
| ^^^^^^^^ help: try: `super::foofoo`

View file

@ -198,6 +198,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass {
use super::*;
@ -206,6 +207,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_inside_function {
fn with_super_inside_function() {
use super::*;
@ -213,6 +215,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_further_inside {
fn insidefoo() {}
mod inner {

View file

@ -106,31 +106,31 @@ LL | use super::*;
| ^^^^^^^^ help: try: `super::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:230:17
--> tests/ui/wildcard_imports_2021.rs:233:17
|
LL | use super::*;
| ^^^^^^^^ help: try: `super::insidefoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:238:13
--> tests/ui/wildcard_imports_2021.rs:241:13
|
LL | use crate::super_imports::*;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `crate::super_imports::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:247:17
--> tests/ui/wildcard_imports_2021.rs:250:17
|
LL | use super::super::*;
| ^^^^^^^^^^^^^^^ help: try: `super::super::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:256:13
--> tests/ui/wildcard_imports_2021.rs:259:13
|
LL | use super::super::super_imports::*;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `super::super::super_imports::foofoo`
error: usage of wildcard import
--> tests/ui/wildcard_imports_2021.rs:264:13
--> tests/ui/wildcard_imports_2021.rs:267:13
|
LL | use super::*;
| ^^^^^^^^ help: try: `super::foofoo`

View file

@ -199,6 +199,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass {
use super::*;
@ -207,6 +208,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_inside_function {
fn with_super_inside_function() {
use super::*;
@ -214,6 +216,7 @@ mod super_imports {
}
}
#[cfg(test)]
mod test_should_pass_further_inside {
fn insidefoo() {}
mod inner {