Merge commit '149392b0ba' into clippyup
This commit is contained in:
parent
e5df17aae5
commit
0413fb35ba
131 changed files with 3025 additions and 630 deletions
|
|
@ -1,8 +1,9 @@
|
|||
// rustc-env:RUST_BACKTRACE=0
|
||||
// normalize-stderr-test: "Clippy version: .*" -> "Clippy version: foo"
|
||||
// normalize-stderr-test: "internal_lints.rs:\d*:\d*" -> "internal_lints.rs"
|
||||
// normalize-stderr-test: "produce_ice.rs:\d*:\d*" -> "produce_ice.rs"
|
||||
// normalize-stderr-test: "', .*clippy_lints" -> "', clippy_lints"
|
||||
// normalize-stderr-test: "'rustc'" -> "'<unnamed>'"
|
||||
// normalize-stderr-test: "(?ms)query stack during panic:\n.*end of query stack\n" -> ""
|
||||
|
||||
#![deny(clippy::internal)]
|
||||
#![allow(clippy::missing_clippy_version_attribute)]
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
thread '<unnamed>' panicked at 'Would you like some help with that?', clippy_lints/src/utils/internal_lints/produce_ice.rs:28:9
|
||||
thread '<unnamed>' panicked at 'Would you like some help with that?', clippy_lints/src/utils/internal_lints/produce_ice.rs
|
||||
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
||||
|
||||
error: internal compiler error: unexpected panic
|
||||
|
|
@ -9,5 +9,3 @@ note: we would appreciate a bug report: https://github.com/rust-lang/rust-clippy
|
|||
|
||||
note: Clippy version: foo
|
||||
|
||||
query stack during panic:
|
||||
end of query stack
|
||||
|
|
|
|||
|
|
@ -1,12 +1,3 @@
|
|||
error: hardcoded path to a diagnostic item
|
||||
--> $DIR/unnecessary_def_path_hardcoded_path.rs:12:43
|
||||
|
|
||||
LL | const DEREF_TRAIT_METHOD: [&str; 5] = ["core", "ops", "deref", "Deref", "deref"];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: convert all references to use `sym::deref_method`
|
||||
= note: `-D clippy::unnecessary-def-path` implied by `-D warnings`
|
||||
|
||||
error: hardcoded path to a diagnostic item
|
||||
--> $DIR/unnecessary_def_path_hardcoded_path.rs:10:36
|
||||
|
|
||||
|
|
@ -14,6 +5,7 @@ LL | const DEREF_TRAIT: [&str; 4] = ["core", "ops", "deref", "Deref"];
|
|||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: convert all references to use `sym::Deref`
|
||||
= note: `-D clippy::unnecessary-def-path` implied by `-D warnings`
|
||||
|
||||
error: hardcoded path to a language item
|
||||
--> $DIR/unnecessary_def_path_hardcoded_path.rs:11:40
|
||||
|
|
@ -23,5 +15,13 @@ LL | const DEREF_MUT_TRAIT: [&str; 4] = ["core", "ops", "deref", "DerefMut"]
|
|||
|
|
||||
= help: convert all references to use `LangItem::DerefMut`
|
||||
|
||||
error: hardcoded path to a diagnostic item
|
||||
--> $DIR/unnecessary_def_path_hardcoded_path.rs:12:43
|
||||
|
|
||||
LL | const DEREF_TRAIT_METHOD: [&str; 5] = ["core", "ops", "deref", "Deref", "deref"];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: convert all references to use `sym::deref_method`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,18 @@ fn main() {
|
|||
expect_result();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_expect_option() {
|
||||
let opt = Some(0);
|
||||
let _ = opt.expect("");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_expect_result() {
|
||||
let res: Result<u8, ()> = Ok(0);
|
||||
let _ = res.expect("");
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod issue9612 {
|
||||
// should not lint in `#[cfg(test)]` modules
|
||||
|
|
|
|||
1
tests/ui-toml/pub_crate_missing_docs/clippy.toml
Normal file
1
tests/ui-toml/pub_crate_missing_docs/clippy.toml
Normal file
|
|
@ -0,0 +1 @@
|
|||
missing-docs-in-crate-items = true
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
//! this is crate
|
||||
#![allow(missing_docs)]
|
||||
#![warn(clippy::missing_docs_in_private_items)]
|
||||
|
||||
/// this is mod
|
||||
mod my_mod {
|
||||
/// some docs
|
||||
fn priv_with_docs() {}
|
||||
fn priv_no_docs() {}
|
||||
/// some docs
|
||||
pub(crate) fn crate_with_docs() {}
|
||||
pub(crate) fn crate_no_docs() {}
|
||||
/// some docs
|
||||
pub(super) fn super_with_docs() {}
|
||||
pub(super) fn super_no_docs() {}
|
||||
|
||||
mod my_sub {
|
||||
/// some docs
|
||||
fn sub_priv_with_docs() {}
|
||||
fn sub_priv_no_docs() {}
|
||||
/// some docs
|
||||
pub(crate) fn sub_crate_with_docs() {}
|
||||
pub(crate) fn sub_crate_no_docs() {}
|
||||
/// some docs
|
||||
pub(super) fn sub_super_with_docs() {}
|
||||
pub(super) fn sub_super_no_docs() {}
|
||||
}
|
||||
|
||||
/// some docs
|
||||
pub(crate) struct CrateStructWithDocs {
|
||||
/// some docs
|
||||
pub(crate) crate_field_with_docs: (),
|
||||
pub(crate) crate_field_no_docs: (),
|
||||
/// some docs
|
||||
priv_field_with_docs: (),
|
||||
priv_field_no_docs: (),
|
||||
}
|
||||
|
||||
pub(crate) struct CrateStructNoDocs {
|
||||
/// some docs
|
||||
pub(crate) crate_field_with_docs: (),
|
||||
pub(crate) crate_field_no_docs: (),
|
||||
/// some docs
|
||||
priv_field_with_docs: (),
|
||||
priv_field_no_docs: (),
|
||||
}
|
||||
}
|
||||
|
||||
/// some docs
|
||||
type CrateTypedefWithDocs = String;
|
||||
type CrateTypedefNoDocs = String;
|
||||
/// some docs
|
||||
pub type PubTypedefWithDocs = String;
|
||||
pub type PubTypedefNoDocs = String;
|
||||
|
||||
fn main() {
|
||||
my_mod::crate_with_docs();
|
||||
my_mod::crate_no_docs();
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
error: missing documentation for a function
|
||||
--> $DIR/pub_crate_missing_doc.rs:12:5
|
||||
|
|
||||
LL | pub(crate) fn crate_no_docs() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::missing-docs-in-private-items` implied by `-D warnings`
|
||||
|
||||
error: missing documentation for a function
|
||||
--> $DIR/pub_crate_missing_doc.rs:15:5
|
||||
|
|
||||
LL | pub(super) fn super_no_docs() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: missing documentation for a function
|
||||
--> $DIR/pub_crate_missing_doc.rs:23:9
|
||||
|
|
||||
LL | pub(crate) fn sub_crate_no_docs() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: missing documentation for a struct field
|
||||
--> $DIR/pub_crate_missing_doc.rs:33:9
|
||||
|
|
||||
LL | pub(crate) crate_field_no_docs: (),
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: missing documentation for a struct
|
||||
--> $DIR/pub_crate_missing_doc.rs:39:5
|
||||
|
|
||||
LL | / pub(crate) struct CrateStructNoDocs {
|
||||
LL | | /// some docs
|
||||
LL | | pub(crate) crate_field_with_docs: (),
|
||||
LL | | pub(crate) crate_field_no_docs: (),
|
||||
... |
|
||||
LL | | priv_field_no_docs: (),
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
||||
error: missing documentation for a struct field
|
||||
--> $DIR/pub_crate_missing_doc.rs:42:9
|
||||
|
|
||||
LL | pub(crate) crate_field_no_docs: (),
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: missing documentation for a type alias
|
||||
--> $DIR/pub_crate_missing_doc.rs:51:1
|
||||
|
|
||||
LL | type CrateTypedefNoDocs = String;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
|
|
@ -33,6 +33,7 @@ error: error reading Clippy's configuration file `$DIR/clippy.toml`: unknown fie
|
|||
max-struct-bools
|
||||
max-suggested-slice-pattern-length
|
||||
max-trait-bounds
|
||||
missing-docs-in-crate-items
|
||||
msrv
|
||||
pass-by-value-size-limit
|
||||
single-char-binding-names-threshold
|
||||
|
|
|
|||
|
|
@ -66,6 +66,12 @@ fn main() {
|
|||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
let boxed_slice: Box<[u8]> = Box::new([0, 1, 2, 3]);
|
||||
let _ = boxed_slice.get(1).unwrap();
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod issue9612 {
|
||||
// should not lint in `#[cfg(test)]` modules
|
||||
|
|
|
|||
|
|
@ -188,10 +188,16 @@ LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec();
|
|||
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
|
||||
|
||||
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise
|
||||
--> $DIR/unwrap_used.rs:84:17
|
||||
--> $DIR/unwrap_used.rs:72:13
|
||||
|
|
||||
LL | let _ = boxed_slice.get(1).unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&boxed_slice[1]`
|
||||
|
||||
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise
|
||||
--> $DIR/unwrap_used.rs:90:17
|
||||
|
|
||||
LL | let _ = Box::new([0]).get(1).unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&Box::new([0])[1]`
|
||||
|
||||
error: aborting due to 27 previous errors
|
||||
error: aborting due to 28 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
|
||||
use core::num::{Saturating, Wrapping};
|
||||
|
||||
const ONE: i32 = 1;
|
||||
const ZERO: i32 = 0;
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct Custom;
|
||||
|
||||
|
|
@ -182,6 +185,10 @@ pub fn non_overflowing_ops_or_ops_already_handled_by_the_compiler_should_not_tri
|
|||
_n += &0;
|
||||
_n -= 0;
|
||||
_n -= &0;
|
||||
_n += ZERO;
|
||||
_n += &ZERO;
|
||||
_n -= ZERO;
|
||||
_n -= &ZERO;
|
||||
_n /= 99;
|
||||
_n /= &99;
|
||||
_n %= 99;
|
||||
|
|
@ -190,10 +197,18 @@ pub fn non_overflowing_ops_or_ops_already_handled_by_the_compiler_should_not_tri
|
|||
_n *= &0;
|
||||
_n *= 1;
|
||||
_n *= &1;
|
||||
_n *= ZERO;
|
||||
_n *= &ZERO;
|
||||
_n *= ONE;
|
||||
_n *= &ONE;
|
||||
_n += -0;
|
||||
_n += &-0;
|
||||
_n -= -0;
|
||||
_n -= &-0;
|
||||
_n += -ZERO;
|
||||
_n += &-ZERO;
|
||||
_n -= -ZERO;
|
||||
_n -= &-ZERO;
|
||||
_n /= -99;
|
||||
_n /= &-99;
|
||||
_n %= -99;
|
||||
|
|
@ -208,10 +223,18 @@ pub fn non_overflowing_ops_or_ops_already_handled_by_the_compiler_should_not_tri
|
|||
_n = _n + &0;
|
||||
_n = 0 + _n;
|
||||
_n = &0 + _n;
|
||||
_n = _n + ZERO;
|
||||
_n = _n + &ZERO;
|
||||
_n = ZERO + _n;
|
||||
_n = &ZERO + _n;
|
||||
_n = _n - 0;
|
||||
_n = _n - &0;
|
||||
_n = 0 - _n;
|
||||
_n = &0 - _n;
|
||||
_n = _n - ZERO;
|
||||
_n = _n - &ZERO;
|
||||
_n = ZERO - _n;
|
||||
_n = &ZERO - _n;
|
||||
_n = _n / 99;
|
||||
_n = _n / &99;
|
||||
_n = _n % 99;
|
||||
|
|
@ -222,6 +245,10 @@ pub fn non_overflowing_ops_or_ops_already_handled_by_the_compiler_should_not_tri
|
|||
_n = &0 * _n;
|
||||
_n = _n * 1;
|
||||
_n = _n * &1;
|
||||
_n = ZERO * _n;
|
||||
_n = &ZERO * _n;
|
||||
_n = _n * ONE;
|
||||
_n = _n * &ONE;
|
||||
_n = 1 * _n;
|
||||
_n = &1 * _n;
|
||||
_n = 23 + 85;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:243:5
|
||||
--> $DIR/arithmetic_side_effects.rs:270:5
|
||||
|
|
||||
LL | _n += 1;
|
||||
| ^^^^^^^
|
||||
|
|
@ -7,589 +7,589 @@ LL | _n += 1;
|
|||
= note: `-D clippy::arithmetic-side-effects` implied by `-D warnings`
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:244:5
|
||||
--> $DIR/arithmetic_side_effects.rs:271:5
|
||||
|
|
||||
LL | _n += &1;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:245:5
|
||||
--> $DIR/arithmetic_side_effects.rs:272:5
|
||||
|
|
||||
LL | _n -= 1;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:246:5
|
||||
--> $DIR/arithmetic_side_effects.rs:273:5
|
||||
|
|
||||
LL | _n -= &1;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:247:5
|
||||
--> $DIR/arithmetic_side_effects.rs:274:5
|
||||
|
|
||||
LL | _n /= 0;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:248:5
|
||||
--> $DIR/arithmetic_side_effects.rs:275:5
|
||||
|
|
||||
LL | _n /= &0;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:249:5
|
||||
--> $DIR/arithmetic_side_effects.rs:276:5
|
||||
|
|
||||
LL | _n %= 0;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:250:5
|
||||
--> $DIR/arithmetic_side_effects.rs:277:5
|
||||
|
|
||||
LL | _n %= &0;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:251:5
|
||||
--> $DIR/arithmetic_side_effects.rs:278:5
|
||||
|
|
||||
LL | _n *= 2;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:252:5
|
||||
--> $DIR/arithmetic_side_effects.rs:279:5
|
||||
|
|
||||
LL | _n *= &2;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:253:5
|
||||
--> $DIR/arithmetic_side_effects.rs:280:5
|
||||
|
|
||||
LL | _n += -1;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:254:5
|
||||
--> $DIR/arithmetic_side_effects.rs:281:5
|
||||
|
|
||||
LL | _n += &-1;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:255:5
|
||||
--> $DIR/arithmetic_side_effects.rs:282:5
|
||||
|
|
||||
LL | _n -= -1;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:256:5
|
||||
--> $DIR/arithmetic_side_effects.rs:283:5
|
||||
|
|
||||
LL | _n -= &-1;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:257:5
|
||||
--> $DIR/arithmetic_side_effects.rs:284:5
|
||||
|
|
||||
LL | _n /= -0;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:258:5
|
||||
--> $DIR/arithmetic_side_effects.rs:285:5
|
||||
|
|
||||
LL | _n /= &-0;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:259:5
|
||||
--> $DIR/arithmetic_side_effects.rs:286:5
|
||||
|
|
||||
LL | _n %= -0;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:260:5
|
||||
--> $DIR/arithmetic_side_effects.rs:287:5
|
||||
|
|
||||
LL | _n %= &-0;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:261:5
|
||||
--> $DIR/arithmetic_side_effects.rs:288:5
|
||||
|
|
||||
LL | _n *= -2;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:262:5
|
||||
--> $DIR/arithmetic_side_effects.rs:289:5
|
||||
|
|
||||
LL | _n *= &-2;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:263:5
|
||||
--> $DIR/arithmetic_side_effects.rs:290:5
|
||||
|
|
||||
LL | _custom += Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:264:5
|
||||
--> $DIR/arithmetic_side_effects.rs:291:5
|
||||
|
|
||||
LL | _custom += &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:265:5
|
||||
--> $DIR/arithmetic_side_effects.rs:292:5
|
||||
|
|
||||
LL | _custom -= Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:266:5
|
||||
--> $DIR/arithmetic_side_effects.rs:293:5
|
||||
|
|
||||
LL | _custom -= &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:267:5
|
||||
--> $DIR/arithmetic_side_effects.rs:294:5
|
||||
|
|
||||
LL | _custom /= Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:268:5
|
||||
--> $DIR/arithmetic_side_effects.rs:295:5
|
||||
|
|
||||
LL | _custom /= &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:269:5
|
||||
--> $DIR/arithmetic_side_effects.rs:296:5
|
||||
|
|
||||
LL | _custom %= Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:270:5
|
||||
--> $DIR/arithmetic_side_effects.rs:297:5
|
||||
|
|
||||
LL | _custom %= &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:271:5
|
||||
--> $DIR/arithmetic_side_effects.rs:298:5
|
||||
|
|
||||
LL | _custom *= Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:272:5
|
||||
--> $DIR/arithmetic_side_effects.rs:299:5
|
||||
|
|
||||
LL | _custom *= &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:273:5
|
||||
--> $DIR/arithmetic_side_effects.rs:300:5
|
||||
|
|
||||
LL | _custom += -Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:274:5
|
||||
--> $DIR/arithmetic_side_effects.rs:301:5
|
||||
|
|
||||
LL | _custom += &-Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:275:5
|
||||
--> $DIR/arithmetic_side_effects.rs:302:5
|
||||
|
|
||||
LL | _custom -= -Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:276:5
|
||||
--> $DIR/arithmetic_side_effects.rs:303:5
|
||||
|
|
||||
LL | _custom -= &-Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:277:5
|
||||
--> $DIR/arithmetic_side_effects.rs:304:5
|
||||
|
|
||||
LL | _custom /= -Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:278:5
|
||||
--> $DIR/arithmetic_side_effects.rs:305:5
|
||||
|
|
||||
LL | _custom /= &-Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:279:5
|
||||
--> $DIR/arithmetic_side_effects.rs:306:5
|
||||
|
|
||||
LL | _custom %= -Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:280:5
|
||||
--> $DIR/arithmetic_side_effects.rs:307:5
|
||||
|
|
||||
LL | _custom %= &-Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:281:5
|
||||
--> $DIR/arithmetic_side_effects.rs:308:5
|
||||
|
|
||||
LL | _custom *= -Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:282:5
|
||||
--> $DIR/arithmetic_side_effects.rs:309:5
|
||||
|
|
||||
LL | _custom *= &-Custom;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:285:10
|
||||
--> $DIR/arithmetic_side_effects.rs:312:10
|
||||
|
|
||||
LL | _n = _n + 1;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:286:10
|
||||
--> $DIR/arithmetic_side_effects.rs:313:10
|
||||
|
|
||||
LL | _n = _n + &1;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:287:10
|
||||
--> $DIR/arithmetic_side_effects.rs:314:10
|
||||
|
|
||||
LL | _n = 1 + _n;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:288:10
|
||||
--> $DIR/arithmetic_side_effects.rs:315:10
|
||||
|
|
||||
LL | _n = &1 + _n;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:289:10
|
||||
--> $DIR/arithmetic_side_effects.rs:316:10
|
||||
|
|
||||
LL | _n = _n - 1;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:290:10
|
||||
--> $DIR/arithmetic_side_effects.rs:317:10
|
||||
|
|
||||
LL | _n = _n - &1;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:291:10
|
||||
--> $DIR/arithmetic_side_effects.rs:318:10
|
||||
|
|
||||
LL | _n = 1 - _n;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:292:10
|
||||
--> $DIR/arithmetic_side_effects.rs:319:10
|
||||
|
|
||||
LL | _n = &1 - _n;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:293:10
|
||||
--> $DIR/arithmetic_side_effects.rs:320:10
|
||||
|
|
||||
LL | _n = _n / 0;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:294:10
|
||||
--> $DIR/arithmetic_side_effects.rs:321:10
|
||||
|
|
||||
LL | _n = _n / &0;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:295:10
|
||||
--> $DIR/arithmetic_side_effects.rs:322:10
|
||||
|
|
||||
LL | _n = _n % 0;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:296:10
|
||||
--> $DIR/arithmetic_side_effects.rs:323:10
|
||||
|
|
||||
LL | _n = _n % &0;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:297:10
|
||||
--> $DIR/arithmetic_side_effects.rs:324:10
|
||||
|
|
||||
LL | _n = _n * 2;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:298:10
|
||||
--> $DIR/arithmetic_side_effects.rs:325:10
|
||||
|
|
||||
LL | _n = _n * &2;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:299:10
|
||||
--> $DIR/arithmetic_side_effects.rs:326:10
|
||||
|
|
||||
LL | _n = 2 * _n;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:300:10
|
||||
--> $DIR/arithmetic_side_effects.rs:327:10
|
||||
|
|
||||
LL | _n = &2 * _n;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:301:10
|
||||
--> $DIR/arithmetic_side_effects.rs:328:10
|
||||
|
|
||||
LL | _n = 23 + &85;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:302:10
|
||||
--> $DIR/arithmetic_side_effects.rs:329:10
|
||||
|
|
||||
LL | _n = &23 + 85;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:303:10
|
||||
--> $DIR/arithmetic_side_effects.rs:330:10
|
||||
|
|
||||
LL | _n = &23 + &85;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:304:15
|
||||
--> $DIR/arithmetic_side_effects.rs:331:15
|
||||
|
|
||||
LL | _custom = _custom + _custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:305:15
|
||||
--> $DIR/arithmetic_side_effects.rs:332:15
|
||||
|
|
||||
LL | _custom = _custom + &_custom;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:306:15
|
||||
--> $DIR/arithmetic_side_effects.rs:333:15
|
||||
|
|
||||
LL | _custom = Custom + _custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:307:15
|
||||
--> $DIR/arithmetic_side_effects.rs:334:15
|
||||
|
|
||||
LL | _custom = &Custom + _custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:308:15
|
||||
--> $DIR/arithmetic_side_effects.rs:335:15
|
||||
|
|
||||
LL | _custom = _custom - Custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:309:15
|
||||
--> $DIR/arithmetic_side_effects.rs:336:15
|
||||
|
|
||||
LL | _custom = _custom - &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:310:15
|
||||
--> $DIR/arithmetic_side_effects.rs:337:15
|
||||
|
|
||||
LL | _custom = Custom - _custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:311:15
|
||||
--> $DIR/arithmetic_side_effects.rs:338:15
|
||||
|
|
||||
LL | _custom = &Custom - _custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:312:15
|
||||
--> $DIR/arithmetic_side_effects.rs:339:15
|
||||
|
|
||||
LL | _custom = _custom / Custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:313:15
|
||||
--> $DIR/arithmetic_side_effects.rs:340:15
|
||||
|
|
||||
LL | _custom = _custom / &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:314:15
|
||||
--> $DIR/arithmetic_side_effects.rs:341:15
|
||||
|
|
||||
LL | _custom = _custom % Custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:315:15
|
||||
--> $DIR/arithmetic_side_effects.rs:342:15
|
||||
|
|
||||
LL | _custom = _custom % &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:316:15
|
||||
--> $DIR/arithmetic_side_effects.rs:343:15
|
||||
|
|
||||
LL | _custom = _custom * Custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:317:15
|
||||
--> $DIR/arithmetic_side_effects.rs:344:15
|
||||
|
|
||||
LL | _custom = _custom * &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:318:15
|
||||
--> $DIR/arithmetic_side_effects.rs:345:15
|
||||
|
|
||||
LL | _custom = Custom * _custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:319:15
|
||||
--> $DIR/arithmetic_side_effects.rs:346:15
|
||||
|
|
||||
LL | _custom = &Custom * _custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:320:15
|
||||
--> $DIR/arithmetic_side_effects.rs:347:15
|
||||
|
|
||||
LL | _custom = Custom + &Custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:321:15
|
||||
--> $DIR/arithmetic_side_effects.rs:348:15
|
||||
|
|
||||
LL | _custom = &Custom + Custom;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:322:15
|
||||
--> $DIR/arithmetic_side_effects.rs:349:15
|
||||
|
|
||||
LL | _custom = &Custom + &Custom;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:325:10
|
||||
--> $DIR/arithmetic_side_effects.rs:352:10
|
||||
|
|
||||
LL | _n = -_n;
|
||||
| ^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:326:10
|
||||
--> $DIR/arithmetic_side_effects.rs:353:10
|
||||
|
|
||||
LL | _n = -&_n;
|
||||
| ^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:327:15
|
||||
--> $DIR/arithmetic_side_effects.rs:354:15
|
||||
|
|
||||
LL | _custom = -_custom;
|
||||
| ^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:328:15
|
||||
--> $DIR/arithmetic_side_effects.rs:355:15
|
||||
|
|
||||
LL | _custom = -&_custom;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:337:5
|
||||
--> $DIR/arithmetic_side_effects.rs:364:5
|
||||
|
|
||||
LL | 1 + i;
|
||||
| ^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:338:5
|
||||
--> $DIR/arithmetic_side_effects.rs:365:5
|
||||
|
|
||||
LL | i * 2;
|
||||
| ^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:340:5
|
||||
--> $DIR/arithmetic_side_effects.rs:367:5
|
||||
|
|
||||
LL | i - 2 + 2 - i;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:341:5
|
||||
--> $DIR/arithmetic_side_effects.rs:368:5
|
||||
|
|
||||
LL | -i;
|
||||
| ^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:342:5
|
||||
--> $DIR/arithmetic_side_effects.rs:369:5
|
||||
|
|
||||
LL | i >> 1;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:343:5
|
||||
--> $DIR/arithmetic_side_effects.rs:370:5
|
||||
|
|
||||
LL | i << 1;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:352:5
|
||||
--> $DIR/arithmetic_side_effects.rs:379:5
|
||||
|
|
||||
LL | i += 1;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:353:5
|
||||
--> $DIR/arithmetic_side_effects.rs:380:5
|
||||
|
|
||||
LL | i -= 1;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:354:5
|
||||
--> $DIR/arithmetic_side_effects.rs:381:5
|
||||
|
|
||||
LL | i *= 2;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:356:5
|
||||
--> $DIR/arithmetic_side_effects.rs:383:5
|
||||
|
|
||||
LL | i /= 0;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:358:5
|
||||
--> $DIR/arithmetic_side_effects.rs:385:5
|
||||
|
|
||||
LL | i /= var1;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:359:5
|
||||
--> $DIR/arithmetic_side_effects.rs:386:5
|
||||
|
|
||||
LL | i /= var2;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:361:5
|
||||
--> $DIR/arithmetic_side_effects.rs:388:5
|
||||
|
|
||||
LL | i %= 0;
|
||||
| ^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:363:5
|
||||
--> $DIR/arithmetic_side_effects.rs:390:5
|
||||
|
|
||||
LL | i %= var1;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:364:5
|
||||
--> $DIR/arithmetic_side_effects.rs:391:5
|
||||
|
|
||||
LL | i %= var2;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:365:5
|
||||
--> $DIR/arithmetic_side_effects.rs:392:5
|
||||
|
|
||||
LL | i <<= 3;
|
||||
| ^^^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> $DIR/arithmetic_side_effects.rs:366:5
|
||||
--> $DIR/arithmetic_side_effects.rs:393:5
|
||||
|
|
||||
LL | i >>= 2;
|
||||
| ^^^^^^^
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ fn main() {
|
|||
let _vec4: Box<_> = Box::<Vec<bool>>::default();
|
||||
let _more = ret_ty_fn();
|
||||
call_ty_fn(Box::default());
|
||||
issue_10381();
|
||||
}
|
||||
|
||||
fn ret_ty_fn() -> Box<bool> {
|
||||
|
|
@ -65,3 +66,20 @@ fn issue_10089() {
|
|||
let _ = Box::<WeirdPathed>::default();
|
||||
};
|
||||
}
|
||||
|
||||
fn issue_10381() {
|
||||
#[derive(Default)]
|
||||
pub struct Foo {}
|
||||
pub trait Bar {}
|
||||
impl Bar for Foo {}
|
||||
|
||||
fn maybe_get_bar(i: u32) -> Option<Box<dyn Bar>> {
|
||||
if i % 2 == 0 {
|
||||
Some(Box::<Foo>::default())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
assert!(maybe_get_bar(2).is_some());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ fn main() {
|
|||
let _vec4: Box<_> = Box::new(Vec::from([false; 0]));
|
||||
let _more = ret_ty_fn();
|
||||
call_ty_fn(Box::new(u8::default()));
|
||||
issue_10381();
|
||||
}
|
||||
|
||||
fn ret_ty_fn() -> Box<bool> {
|
||||
|
|
@ -65,3 +66,20 @@ fn issue_10089() {
|
|||
let _ = Box::new(WeirdPathed::default());
|
||||
};
|
||||
}
|
||||
|
||||
fn issue_10381() {
|
||||
#[derive(Default)]
|
||||
pub struct Foo {}
|
||||
pub trait Bar {}
|
||||
impl Bar for Foo {}
|
||||
|
||||
fn maybe_get_bar(i: u32) -> Option<Box<dyn Bar>> {
|
||||
if i % 2 == 0 {
|
||||
Some(Box::new(Foo::default()))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
assert!(maybe_get_bar(2).is_some());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,22 +73,28 @@ LL | call_ty_fn(Box::new(u8::default()));
|
|||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Box::default()`
|
||||
|
||||
error: `Box::new(_)` of default value
|
||||
--> $DIR/box_default.rs:39:5
|
||||
--> $DIR/box_default.rs:40:5
|
||||
|
|
||||
LL | Box::new(bool::default())
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Box::<bool>::default()`
|
||||
|
||||
error: `Box::new(_)` of default value
|
||||
--> $DIR/box_default.rs:56:28
|
||||
--> $DIR/box_default.rs:57:28
|
||||
|
|
||||
LL | let _: Box<dyn Read> = Box::new(ImplementsDefault::default());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Box::<ImplementsDefault>::default()`
|
||||
|
||||
error: `Box::new(_)` of default value
|
||||
--> $DIR/box_default.rs:65:17
|
||||
--> $DIR/box_default.rs:66:17
|
||||
|
|
||||
LL | let _ = Box::new(WeirdPathed::default());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Box::<WeirdPathed>::default()`
|
||||
|
||||
error: aborting due to 15 previous errors
|
||||
error: `Box::new(_)` of default value
|
||||
--> $DIR/box_default.rs:78:18
|
||||
|
|
||||
LL | Some(Box::new(Foo::default()))
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Box::<Foo>::default()`
|
||||
|
||||
error: aborting due to 16 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
fn main() {
|
||||
let s = String::from("String");
|
||||
let _ = s.as_bytes().get(3);
|
||||
let _ = &s.as_bytes().get(3);
|
||||
let _ = s[..].as_bytes().get(3);
|
||||
let _ = s.as_bytes().get(3).copied();
|
||||
let _ = &s.as_bytes()[3];
|
||||
let _ = s[..].as_bytes().get(3).copied();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,6 @@
|
|||
fn main() {
|
||||
let s = String::from("String");
|
||||
let _ = s.bytes().nth(3);
|
||||
let _ = &s.bytes().nth(3);
|
||||
let _ = &s.bytes().nth(3).unwrap();
|
||||
let _ = s[..].bytes().nth(3);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,21 +2,21 @@ error: called `.bytes().nth()` on a `String`
|
|||
--> $DIR/bytes_nth.rs:8:13
|
||||
|
|
||||
LL | let _ = s.bytes().nth(3);
|
||||
| ^^^^^^^^^^^^^^^^ help: try: `s.as_bytes().get(3)`
|
||||
| ^^^^^^^^^^^^^^^^ help: try: `s.as_bytes().get(3).copied()`
|
||||
|
|
||||
= note: `-D clippy::bytes-nth` implied by `-D warnings`
|
||||
|
||||
error: called `.bytes().nth()` on a `String`
|
||||
error: called `.bytes().nth().unwrap()` on a `String`
|
||||
--> $DIR/bytes_nth.rs:9:14
|
||||
|
|
||||
LL | let _ = &s.bytes().nth(3);
|
||||
| ^^^^^^^^^^^^^^^^ help: try: `s.as_bytes().get(3)`
|
||||
LL | let _ = &s.bytes().nth(3).unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `s.as_bytes()[3]`
|
||||
|
||||
error: called `.bytes().nth()` on a `str`
|
||||
--> $DIR/bytes_nth.rs:10:13
|
||||
|
|
||||
LL | let _ = s[..].bytes().nth(3);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: try: `s[..].as_bytes().get(3)`
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: try: `s[..].as_bytes().get(3).copied()`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ error: casting `f32` to `i32` may truncate the value
|
|||
LL | 1f32 as i32;
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
= note: `-D clippy::cast-possible-truncation` implied by `-D warnings`
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
|
|
@ -55,7 +55,7 @@ error: casting `f32` to `u32` may truncate the value
|
|||
LL | 1f32 as u32;
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | u32::try_from(1f32);
|
||||
|
|
@ -75,7 +75,7 @@ error: casting `f64` to `f32` may truncate the value
|
|||
LL | 1f64 as f32;
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | f32::try_from(1f64);
|
||||
|
|
@ -87,7 +87,7 @@ error: casting `i32` to `i8` may truncate the value
|
|||
LL | 1i32 as i8;
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | i8::try_from(1i32);
|
||||
|
|
@ -99,7 +99,7 @@ error: casting `i32` to `u8` may truncate the value
|
|||
LL | 1i32 as u8;
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | u8::try_from(1i32);
|
||||
|
|
@ -111,7 +111,7 @@ error: casting `f64` to `isize` may truncate the value
|
|||
LL | 1f64 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | isize::try_from(1f64);
|
||||
|
|
@ -123,7 +123,7 @@ error: casting `f64` to `usize` may truncate the value
|
|||
LL | 1f64 as usize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | usize::try_from(1f64);
|
||||
|
|
@ -141,7 +141,7 @@ error: casting `u32` to `u16` may truncate the value
|
|||
LL | 1f32 as u32 as u16;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | u16::try_from(1f32 as u32);
|
||||
|
|
@ -153,7 +153,7 @@ error: casting `f32` to `u32` may truncate the value
|
|||
LL | 1f32 as u32 as u16;
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | u32::try_from(1f32) as u16;
|
||||
|
|
@ -215,7 +215,7 @@ error: casting `i64` to `i8` may truncate the value
|
|||
LL | (-99999999999i64).min(1) as i8; // should be linted because signed
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | i8::try_from((-99999999999i64).min(1)); // should be linted because signed
|
||||
|
|
@ -227,7 +227,7 @@ error: casting `u64` to `u8` may truncate the value
|
|||
LL | 999999u64.clamp(0, 256) as u8; // should still be linted
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | u8::try_from(999999u64.clamp(0, 256)); // should still be linted
|
||||
|
|
@ -239,7 +239,7 @@ error: casting `main::E2` to `u8` may truncate the value
|
|||
LL | let _ = self as u8;
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | let _ = u8::try_from(self);
|
||||
|
|
@ -259,7 +259,7 @@ error: casting `main::E5` to `i8` may truncate the value
|
|||
LL | let _ = self as i8;
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | let _ = i8::try_from(self);
|
||||
|
|
@ -277,7 +277,7 @@ error: casting `main::E6` to `i16` may truncate the value
|
|||
LL | let _ = self as i16;
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | let _ = i16::try_from(self);
|
||||
|
|
@ -289,7 +289,7 @@ error: casting `main::E7` to `usize` may truncate the value on targets with 32-b
|
|||
LL | let _ = self as usize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | let _ = usize::try_from(self);
|
||||
|
|
@ -301,7 +301,7 @@ error: casting `main::E10` to `u16` may truncate the value
|
|||
LL | let _ = self as u16;
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | let _ = u16::try_from(self);
|
||||
|
|
@ -313,7 +313,7 @@ error: casting `u32` to `u8` may truncate the value
|
|||
LL | let c = (q >> 16) as u8;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | let c = u8::try_from((q >> 16));
|
||||
|
|
@ -325,7 +325,7 @@ error: casting `u32` to `u8` may truncate the value
|
|||
LL | let c = (q / 1000) as u8;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | let c = u8::try_from((q / 1000));
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error: casting `isize` to `i8` may truncate the value
|
|||
LL | 1isize as i8;
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
= note: `-D clippy::cast-possible-truncation` implied by `-D warnings`
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
|
|
@ -43,7 +43,7 @@ error: casting `isize` to `i32` may truncate the value on targets with 64-bit wi
|
|||
LL | 1isize as i32;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | i32::try_from(1isize);
|
||||
|
|
@ -55,7 +55,7 @@ error: casting `isize` to `u32` may truncate the value on targets with 64-bit wi
|
|||
LL | 1isize as u32;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | u32::try_from(1isize);
|
||||
|
|
@ -67,7 +67,7 @@ error: casting `usize` to `u32` may truncate the value on targets with 64-bit wi
|
|||
LL | 1usize as u32;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | u32::try_from(1usize);
|
||||
|
|
@ -79,7 +79,7 @@ error: casting `usize` to `i32` may truncate the value on targets with 64-bit wi
|
|||
LL | 1usize as i32;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | i32::try_from(1usize);
|
||||
|
|
@ -99,7 +99,7 @@ error: casting `i64` to `isize` may truncate the value on targets with 32-bit wi
|
|||
LL | 1i64 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | isize::try_from(1i64);
|
||||
|
|
@ -111,7 +111,7 @@ error: casting `i64` to `usize` may truncate the value on targets with 32-bit wi
|
|||
LL | 1i64 as usize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | usize::try_from(1i64);
|
||||
|
|
@ -123,7 +123,7 @@ error: casting `u64` to `isize` may truncate the value on targets with 32-bit wi
|
|||
LL | 1u64 as isize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | isize::try_from(1u64);
|
||||
|
|
@ -141,7 +141,7 @@ error: casting `u64` to `usize` may truncate the value on targets with 32-bit wi
|
|||
LL | 1u64 as usize;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_precision_loss)]` ...
|
||||
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
|
||||
help: ... or use `try_from` and handle the error accordingly
|
||||
|
|
||||
LL | usize::try_from(1u64);
|
||||
|
|
|
|||
9
tests/ui/crashes/needless_pass_by_value-w-late-bound.rs
Normal file
9
tests/ui/crashes/needless_pass_by_value-w-late-bound.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// https://github.com/rust-lang/rust/issues/107147
|
||||
|
||||
#![warn(clippy::needless_pass_by_value)]
|
||||
|
||||
struct Foo<'a>(&'a [(); 100]);
|
||||
|
||||
fn test(x: Foo<'_>) {}
|
||||
|
||||
fn main() {}
|
||||
15
tests/ui/crashes/needless_pass_by_value-w-late-bound.stderr
Normal file
15
tests/ui/crashes/needless_pass_by_value-w-late-bound.stderr
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
error: this argument is passed by value, but not consumed in the function body
|
||||
--> $DIR/needless_pass_by_value-w-late-bound.rs:7:12
|
||||
|
|
||||
LL | fn test(x: Foo<'_>) {}
|
||||
| ^^^^^^^ help: consider taking a reference instead: `&Foo<'_>`
|
||||
|
|
||||
help: consider marking this type as `Copy`
|
||||
--> $DIR/needless_pass_by_value-w-late-bound.rs:5:1
|
||||
|
|
||||
LL | struct Foo<'a>(&'a [(); 100]);
|
||||
| ^^^^^^^^^^^^^^
|
||||
= note: `-D clippy::needless-pass-by-value` implied by `-D warnings`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
@ -78,7 +78,7 @@ fn test_allowed() {
|
|||
/// This test has [a `link_with_underscores`][chunked-example] inside it. See #823.
|
||||
/// See also [the issue tracker](https://github.com/rust-lang/rust-clippy/search?q=clippy::doc_markdown&type=Issues)
|
||||
/// on GitHub (which is a camel-cased word, but is OK). And here is another [inline link][inline_link].
|
||||
/// It can also be [`inline_link2`].
|
||||
/// It can also be [inline_link2]. A link to [StackOverflow](https://stackoverflow.com) is also acceptable.
|
||||
///
|
||||
/// [chunked-example]: https://en.wikipedia.org/wiki/Chunked_transfer_encoding#Example
|
||||
/// [inline_link]: https://foobar
|
||||
|
|
|
|||
|
|
@ -75,10 +75,10 @@ fn test_units() {
|
|||
fn test_allowed() {
|
||||
}
|
||||
|
||||
/// This test has [a link_with_underscores][chunked-example] inside it. See #823.
|
||||
/// This test has [a `link_with_underscores`][chunked-example] inside it. See #823.
|
||||
/// See also [the issue tracker](https://github.com/rust-lang/rust-clippy/search?q=clippy::doc_markdown&type=Issues)
|
||||
/// on GitHub (which is a camel-cased word, but is OK). And here is another [inline link][inline_link].
|
||||
/// It can also be [inline_link2].
|
||||
/// It can also be [inline_link2]. A link to [StackOverflow](https://stackoverflow.com) is also acceptable.
|
||||
///
|
||||
/// [chunked-example]: https://en.wikipedia.org/wiki/Chunked_transfer_encoding#Example
|
||||
/// [inline_link]: https://foobar
|
||||
|
|
|
|||
|
|
@ -142,28 +142,6 @@ help: try
|
|||
LL | /// `be_sure_we_got_to_the_end_of_it`
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: item in documentation is missing backticks
|
||||
--> $DIR/doc-fixable.rs:78:22
|
||||
|
|
||||
LL | /// This test has [a link_with_underscores][chunked-example] inside it. See #823.
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: try
|
||||
|
|
||||
LL | /// This test has [a `link_with_underscores`][chunked-example] inside it. See #823.
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: item in documentation is missing backticks
|
||||
--> $DIR/doc-fixable.rs:81:21
|
||||
|
|
||||
LL | /// It can also be [inline_link2].
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
help: try
|
||||
|
|
||||
LL | /// It can also be [`inline_link2`].
|
||||
| ~~~~~~~~~~~~~~
|
||||
|
||||
error: item in documentation is missing backticks
|
||||
--> $DIR/doc-fixable.rs:91:5
|
||||
|
|
||||
|
|
@ -329,5 +307,5 @@ help: try
|
|||
LL | /// An iterator over `mycrate::Collection`'s values.
|
||||
| ~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to 30 previous errors
|
||||
error: aborting due to 28 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -152,4 +152,18 @@ fn hash_map<K: Eq + Hash + Copy, V: Copy>(m: &mut HashMap<K, V>, m2: &mut HashMa
|
|||
});
|
||||
}
|
||||
|
||||
// Issue 10331
|
||||
// do not suggest a bad expansion because the compiler unrolls the first
|
||||
// occurrence of the loop
|
||||
pub fn issue_10331() {
|
||||
let mut m = HashMap::new();
|
||||
let mut i = 0;
|
||||
let mut x = 0;
|
||||
while !m.contains_key(&x) {
|
||||
m.insert(x, i);
|
||||
i += 1;
|
||||
x += 1;
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -156,4 +156,18 @@ fn hash_map<K: Eq + Hash + Copy, V: Copy>(m: &mut HashMap<K, V>, m2: &mut HashMa
|
|||
}
|
||||
}
|
||||
|
||||
// Issue 10331
|
||||
// do not suggest a bad expansion because the compiler unrolls the first
|
||||
// occurrence of the loop
|
||||
pub fn issue_10331() {
|
||||
let mut m = HashMap::new();
|
||||
let mut i = 0;
|
||||
let mut x = 0;
|
||||
while !m.contains_key(&x) {
|
||||
m.insert(x, i);
|
||||
i += 1;
|
||||
x += 1;
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -269,6 +269,9 @@ fn main() {
|
|||
|
||||
trait WithAssoc {
|
||||
type Assoc: ?Sized;
|
||||
fn to_assoc(&self) -> &Self::Assoc {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
impl WithAssoc for String {
|
||||
type Assoc = str;
|
||||
|
|
@ -281,4 +284,15 @@ fn main() {
|
|||
// Issue #9901
|
||||
fn takes_ref(_: &i32) {}
|
||||
takes_ref(*Box::new(&0i32));
|
||||
|
||||
// Issue #10384
|
||||
impl<'a> WithAssoc for &'a u32 {
|
||||
type Assoc = dyn core::fmt::Display;
|
||||
fn to_assoc(&self) -> &Self::Assoc {
|
||||
*self
|
||||
}
|
||||
}
|
||||
fn return_dyn_assoc<'a>(x: &'a &'a u32) -> &'a <&'a u32 as WithAssoc>::Assoc {
|
||||
*x
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -269,6 +269,9 @@ fn main() {
|
|||
|
||||
trait WithAssoc {
|
||||
type Assoc: ?Sized;
|
||||
fn to_assoc(&self) -> &Self::Assoc {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
impl WithAssoc for String {
|
||||
type Assoc = str;
|
||||
|
|
@ -281,4 +284,15 @@ fn main() {
|
|||
// Issue #9901
|
||||
fn takes_ref(_: &i32) {}
|
||||
takes_ref(*Box::new(&0i32));
|
||||
|
||||
// Issue #10384
|
||||
impl<'a> WithAssoc for &'a u32 {
|
||||
type Assoc = dyn core::fmt::Display;
|
||||
fn to_assoc(&self) -> &Self::Assoc {
|
||||
*self
|
||||
}
|
||||
}
|
||||
fn return_dyn_assoc<'a>(x: &'a &'a u32) -> &'a <&'a u32 as WithAssoc>::Assoc {
|
||||
*x
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,17 @@
|
|||
#![allow(unused, clippy::needless_lifetimes)]
|
||||
#![warn(clippy::extra_unused_type_parameters)]
|
||||
|
||||
fn unused_ty<T>(x: u8) {}
|
||||
fn unused_ty<T>(x: u8) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn unused_multi<T, U>(x: u8) {}
|
||||
fn unused_multi<T, U>(x: u8) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn unused_with_lt<'a, T>(x: &'a u8) {}
|
||||
fn unused_with_lt<'a, T>(x: &'a u8) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn used_ty<T>(x: T, y: u8) {}
|
||||
|
||||
|
|
@ -15,15 +21,20 @@ fn used_ret<T: Default>(x: u8) -> T {
|
|||
T::default()
|
||||
}
|
||||
|
||||
fn unused_bounded<T: Default, U>(x: U) {}
|
||||
fn unused_bounded<T: Default, U>(x: U) {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
fn unused_where_clause<T, U>(x: U)
|
||||
where
|
||||
T: Default,
|
||||
{
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
fn some_unused<A, B, C, D: Iterator<Item = (B, C)>, E>(b: B, c: C) {}
|
||||
fn some_unused<A, B, C, D: Iterator<Item = (B, C)>, E>(b: B, c: C) {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
fn used_opaque<A>(iter: impl Iterator<Item = A>) -> usize {
|
||||
iter.count()
|
||||
|
|
@ -46,7 +57,9 @@ fn used_closure<T: Default + ToString>() -> impl Fn() {
|
|||
struct S;
|
||||
|
||||
impl S {
|
||||
fn unused_ty_impl<T>(&self) {}
|
||||
fn unused_ty_impl<T>(&self) {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
|
||||
// Don't lint on trait methods
|
||||
|
|
@ -66,4 +79,32 @@ where
|
|||
.filter_map(move |(i, a)| if i == index { None } else { Some(a) })
|
||||
}
|
||||
|
||||
fn unused_opaque<A, B>(dummy: impl Default) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
mod unexported_trait_bounds {
|
||||
mod private {
|
||||
pub trait Private {}
|
||||
}
|
||||
|
||||
fn priv_trait_bound<T: private::Private>() {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
fn unused_with_priv_trait_bound<T: private::Private, U>() {
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
|
||||
mod issue10319 {
|
||||
fn assert_send<T: Send>() {}
|
||||
|
||||
fn assert_send_where<T>()
|
||||
where
|
||||
T: Send,
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,38 +1,38 @@
|
|||
error: type parameter goes unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:4:13
|
||||
|
|
||||
LL | fn unused_ty<T>(x: u8) {}
|
||||
LL | fn unused_ty<T>(x: u8) {
|
||||
| ^^^
|
||||
|
|
||||
= help: consider removing the parameter
|
||||
= note: `-D clippy::extra-unused-type-parameters` implied by `-D warnings`
|
||||
|
||||
error: type parameters go unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:6:16
|
||||
--> $DIR/extra_unused_type_parameters.rs:8:16
|
||||
|
|
||||
LL | fn unused_multi<T, U>(x: u8) {}
|
||||
LL | fn unused_multi<T, U>(x: u8) {
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: consider removing the parameters
|
||||
|
||||
error: type parameter goes unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:8:23
|
||||
--> $DIR/extra_unused_type_parameters.rs:12:23
|
||||
|
|
||||
LL | fn unused_with_lt<'a, T>(x: &'a u8) {}
|
||||
LL | fn unused_with_lt<'a, T>(x: &'a u8) {
|
||||
| ^
|
||||
|
|
||||
= help: consider removing the parameter
|
||||
|
||||
error: type parameter goes unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:18:19
|
||||
--> $DIR/extra_unused_type_parameters.rs:24:19
|
||||
|
|
||||
LL | fn unused_bounded<T: Default, U>(x: U) {}
|
||||
LL | fn unused_bounded<T: Default, U>(x: U) {
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: consider removing the parameter
|
||||
|
||||
error: type parameter goes unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:20:24
|
||||
--> $DIR/extra_unused_type_parameters.rs:28:24
|
||||
|
|
||||
LL | fn unused_where_clause<T, U>(x: U)
|
||||
| ^^
|
||||
|
|
@ -40,20 +40,36 @@ LL | fn unused_where_clause<T, U>(x: U)
|
|||
= help: consider removing the parameter
|
||||
|
||||
error: type parameters go unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:26:16
|
||||
--> $DIR/extra_unused_type_parameters.rs:35:16
|
||||
|
|
||||
LL | fn some_unused<A, B, C, D: Iterator<Item = (B, C)>, E>(b: B, c: C) {}
|
||||
LL | fn some_unused<A, B, C, D: Iterator<Item = (B, C)>, E>(b: B, c: C) {
|
||||
| ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^
|
||||
|
|
||||
= help: consider removing the parameters
|
||||
|
||||
error: type parameter goes unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:49:22
|
||||
--> $DIR/extra_unused_type_parameters.rs:60:22
|
||||
|
|
||||
LL | fn unused_ty_impl<T>(&self) {}
|
||||
LL | fn unused_ty_impl<T>(&self) {
|
||||
| ^^^
|
||||
|
|
||||
= help: consider removing the parameter
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
error: type parameters go unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:82:17
|
||||
|
|
||||
LL | fn unused_opaque<A, B>(dummy: impl Default) {
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: consider removing the parameters
|
||||
|
||||
error: type parameter goes unused in function definition
|
||||
--> $DIR/extra_unused_type_parameters.rs:95:58
|
||||
|
|
||||
LL | fn unused_with_priv_trait_bound<T: private::Private, U>() {
|
||||
| ^
|
||||
|
|
||||
= help: consider removing the parameter
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
// run-rustfix
|
||||
// aux-build: proc_macro_with_span.rs
|
||||
#![warn(clippy::useless_format)]
|
||||
#![allow(
|
||||
unused_tuple_struct_fields,
|
||||
|
|
@ -9,6 +10,8 @@
|
|||
clippy::uninlined_format_args
|
||||
)]
|
||||
|
||||
extern crate proc_macro_with_span;
|
||||
|
||||
struct Foo(pub String);
|
||||
|
||||
macro_rules! foo {
|
||||
|
|
@ -87,4 +90,7 @@ fn main() {
|
|||
let _ = abc.to_string();
|
||||
let xx = "xx";
|
||||
let _ = xx.to_string();
|
||||
|
||||
// Issue #10148
|
||||
println!(proc_macro_with_span::with_span!(""something ""));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
// run-rustfix
|
||||
// aux-build: proc_macro_with_span.rs
|
||||
#![warn(clippy::useless_format)]
|
||||
#![allow(
|
||||
unused_tuple_struct_fields,
|
||||
|
|
@ -9,6 +10,8 @@
|
|||
clippy::uninlined_format_args
|
||||
)]
|
||||
|
||||
extern crate proc_macro_with_span;
|
||||
|
||||
struct Foo(pub String);
|
||||
|
||||
macro_rules! foo {
|
||||
|
|
@ -89,4 +92,7 @@ fn main() {
|
|||
let _ = format!("{abc}");
|
||||
let xx = "xx";
|
||||
let _ = format!("{xx}");
|
||||
|
||||
// Issue #10148
|
||||
println!(proc_macro_with_span::with_span!(""something ""));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:19:5
|
||||
--> $DIR/format.rs:22:5
|
||||
|
|
||||
LL | format!("foo");
|
||||
| ^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"foo".to_string()`
|
||||
|
|
@ -7,19 +7,19 @@ LL | format!("foo");
|
|||
= note: `-D clippy::useless-format` implied by `-D warnings`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:20:5
|
||||
--> $DIR/format.rs:23:5
|
||||
|
|
||||
LL | format!("{{}}");
|
||||
| ^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"{}".to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:21:5
|
||||
--> $DIR/format.rs:24:5
|
||||
|
|
||||
LL | format!("{{}} abc {{}}");
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"{} abc {}".to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:22:5
|
||||
--> $DIR/format.rs:25:5
|
||||
|
|
||||
LL | / format!(
|
||||
LL | | r##"foo {{}}
|
||||
|
|
@ -34,67 +34,67 @@ LL ~ " bar"##.to_string();
|
|||
|
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:27:13
|
||||
--> $DIR/format.rs:30:13
|
||||
|
|
||||
LL | let _ = format!("");
|
||||
| ^^^^^^^^^^^ help: consider using `String::new()`: `String::new()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:29:5
|
||||
--> $DIR/format.rs:32:5
|
||||
|
|
||||
LL | format!("{}", "foo");
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"foo".to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:37:5
|
||||
--> $DIR/format.rs:40:5
|
||||
|
|
||||
LL | format!("{}", arg);
|
||||
| ^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `arg.to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:67:5
|
||||
--> $DIR/format.rs:70:5
|
||||
|
|
||||
LL | format!("{}", 42.to_string());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `42.to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:69:5
|
||||
--> $DIR/format.rs:72:5
|
||||
|
|
||||
LL | format!("{}", x.display().to_string());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `x.display().to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:73:18
|
||||
--> $DIR/format.rs:76:18
|
||||
|
|
||||
LL | let _ = Some(format!("{}", a + "bar"));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `a + "bar"`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:77:22
|
||||
--> $DIR/format.rs:80:22
|
||||
|
|
||||
LL | let _s: String = format!("{}", &*v.join("/n"));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `(&*v.join("/n")).to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:83:13
|
||||
--> $DIR/format.rs:86:13
|
||||
|
|
||||
LL | let _ = format!("{x}");
|
||||
| ^^^^^^^^^^^^^^ help: consider using `.to_string()`: `x.to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:85:13
|
||||
--> $DIR/format.rs:88:13
|
||||
|
|
||||
LL | let _ = format!("{y}", y = x);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `x.to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:89:13
|
||||
--> $DIR/format.rs:92:13
|
||||
|
|
||||
LL | let _ = format!("{abc}");
|
||||
| ^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `abc.to_string()`
|
||||
|
||||
error: useless use of `format!`
|
||||
--> $DIR/format.rs:91:13
|
||||
--> $DIR/format.rs:94:13
|
||||
|
|
||||
LL | let _ = format!("{xx}");
|
||||
| ^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `xx.to_string()`
|
||||
|
|
|
|||
17
tests/ui/impl_trait_in_params.rs
Normal file
17
tests/ui/impl_trait_in_params.rs
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#![allow(unused)]
|
||||
#![warn(clippy::impl_trait_in_params)]
|
||||
|
||||
pub trait Trait {}
|
||||
pub trait AnotherTrait<T> {}
|
||||
|
||||
// Should warn
|
||||
pub fn a(_: impl Trait) {}
|
||||
pub fn c<C: Trait>(_: C, _: impl Trait) {}
|
||||
fn d(_: impl AnotherTrait<u32>) {}
|
||||
|
||||
// Shouldn't warn
|
||||
|
||||
pub fn b<B: Trait>(_: B) {}
|
||||
fn e<T: AnotherTrait<u32>>(_: T) {}
|
||||
|
||||
fn main() {}
|
||||
25
tests/ui/impl_trait_in_params.stderr
Normal file
25
tests/ui/impl_trait_in_params.stderr
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
error: '`impl Trait` used as a function parameter'
|
||||
--> $DIR/impl_trait_in_params.rs:8:13
|
||||
|
|
||||
LL | pub fn a(_: impl Trait) {}
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::impl-trait-in-params` implied by `-D warnings`
|
||||
help: add a type paremeter
|
||||
|
|
||||
LL | pub fn a<{ /* Generic name */ }: Trait>(_: impl Trait) {}
|
||||
| +++++++++++++++++++++++++++++++
|
||||
|
||||
error: '`impl Trait` used as a function parameter'
|
||||
--> $DIR/impl_trait_in_params.rs:9:29
|
||||
|
|
||||
LL | pub fn c<C: Trait>(_: C, _: impl Trait) {}
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
help: add a type paremeter
|
||||
|
|
||||
LL | pub fn c<C: Trait, { /* Generic name */ }: Trait>(_: C, _: impl Trait) {}
|
||||
| +++++++++++++++++++++++++++++++
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
@ -11,7 +11,7 @@ fn main() {
|
|||
let _good = (
|
||||
0b1011_i64,
|
||||
0o1_234_u32,
|
||||
0x0123_4567,
|
||||
0x1_234_567,
|
||||
1_2345_6789,
|
||||
1234_f32,
|
||||
1_234.12_f32,
|
||||
|
|
@ -19,7 +19,7 @@ fn main() {
|
|||
1.123_4_f32,
|
||||
);
|
||||
let _bad = (
|
||||
0b11_0110_i64,
|
||||
0b1_10110_i64,
|
||||
0xdead_beef_usize,
|
||||
123_456_f32,
|
||||
123_456.12_f32,
|
||||
|
|
|
|||
|
|
@ -1,22 +1,10 @@
|
|||
error: digits of hex or binary literal not grouped by four
|
||||
--> $DIR/large_digit_groups.rs:14:9
|
||||
|
|
||||
LL | 0x1_234_567,
|
||||
| ^^^^^^^^^^^ help: consider: `0x0123_4567`
|
||||
|
|
||||
= note: `-D clippy::unusual-byte-groupings` implied by `-D warnings`
|
||||
|
||||
error: digits of hex or binary literal not grouped by four
|
||||
--> $DIR/large_digit_groups.rs:22:9
|
||||
|
|
||||
LL | 0b1_10110_i64,
|
||||
| ^^^^^^^^^^^^^ help: consider: `0b11_0110_i64`
|
||||
|
||||
error: digits of hex or binary literal not grouped by four
|
||||
error: digits of hex, binary or octal literal not in groups of equal size
|
||||
--> $DIR/large_digit_groups.rs:23:9
|
||||
|
|
||||
LL | 0xd_e_adbee_f_usize,
|
||||
| ^^^^^^^^^^^^^^^^^^^ help: consider: `0xdead_beef_usize`
|
||||
|
|
||||
= note: `-D clippy::unusual-byte-groupings` implied by `-D warnings`
|
||||
|
||||
error: digit groups should be smaller
|
||||
--> $DIR/large_digit_groups.rs:24:9
|
||||
|
|
@ -44,5 +32,5 @@ error: digit groups should be smaller
|
|||
LL | 1_23456.12345_6_f64,
|
||||
| ^^^^^^^^^^^^^^^^^^^ help: consider: `123_456.123_456_f64`
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
|
|
|
|||
54
tests/ui/let_underscore_untyped.rs
Normal file
54
tests/ui/let_underscore_untyped.rs
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
#![allow(unused)]
|
||||
#![warn(clippy::let_underscore_untyped)]
|
||||
|
||||
use std::future::Future;
|
||||
use std::{boxed::Box, fmt::Display};
|
||||
|
||||
fn a() -> u32 {
|
||||
1
|
||||
}
|
||||
|
||||
fn b<T>(x: T) -> T {
|
||||
x
|
||||
}
|
||||
|
||||
fn c() -> impl Display {
|
||||
1
|
||||
}
|
||||
|
||||
fn d(x: &u32) -> &u32 {
|
||||
x
|
||||
}
|
||||
|
||||
fn e() -> Result<u32, ()> {
|
||||
Ok(1)
|
||||
}
|
||||
|
||||
fn f() -> Box<dyn Display> {
|
||||
Box::new(1)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _ = a();
|
||||
let _ = b(1);
|
||||
let _ = c();
|
||||
let _ = d(&1);
|
||||
let _ = e();
|
||||
let _ = f();
|
||||
|
||||
_ = a();
|
||||
_ = b(1);
|
||||
_ = c();
|
||||
_ = d(&1);
|
||||
_ = e();
|
||||
_ = f();
|
||||
|
||||
let _: u32 = a();
|
||||
let _: u32 = b(1);
|
||||
let _: &u32 = d(&1);
|
||||
let _: Result<_, _> = e();
|
||||
let _: Box<_> = f();
|
||||
|
||||
#[allow(clippy::let_underscore_untyped)]
|
||||
let _ = a();
|
||||
}
|
||||
51
tests/ui/let_underscore_untyped.stderr
Normal file
51
tests/ui/let_underscore_untyped.stderr
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
error: non-binding `let` without a type annotation
|
||||
--> $DIR/let_underscore_untyped.rs:32:5
|
||||
|
|
||||
LL | let _ = a();
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider adding a type annotation or removing the `let` keyword
|
||||
= note: `-D clippy::let-underscore-untyped` implied by `-D warnings`
|
||||
|
||||
error: non-binding `let` without a type annotation
|
||||
--> $DIR/let_underscore_untyped.rs:33:5
|
||||
|
|
||||
LL | let _ = b(1);
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider adding a type annotation or removing the `let` keyword
|
||||
|
||||
error: non-binding `let` without a type annotation
|
||||
--> $DIR/let_underscore_untyped.rs:34:5
|
||||
|
|
||||
LL | let _ = c();
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider adding a type annotation or removing the `let` keyword
|
||||
|
||||
error: non-binding `let` without a type annotation
|
||||
--> $DIR/let_underscore_untyped.rs:35:5
|
||||
|
|
||||
LL | let _ = d(&1);
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider adding a type annotation or removing the `let` keyword
|
||||
|
||||
error: non-binding `let` without a type annotation
|
||||
--> $DIR/let_underscore_untyped.rs:36:5
|
||||
|
|
||||
LL | let _ = e();
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider adding a type annotation or removing the `let` keyword
|
||||
|
||||
error: non-binding `let` without a type annotation
|
||||
--> $DIR/let_underscore_untyped.rs:37:5
|
||||
|
|
||||
LL | let _ = f();
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider adding a type annotation or removing the `let` keyword
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ error: digits grouped inconsistently by underscores
|
|||
LL | let fail23 = 3__16___23;
|
||||
| ^^^^^^^^^^ help: consider: `31_623`
|
||||
|
||||
error: digits of hex or binary literal not grouped by four
|
||||
error: digits of hex, binary or octal literal not in groups of equal size
|
||||
--> $DIR/literals.rs:38:18
|
||||
|
|
||||
LL | let fail24 = 0xAB_ABC_AB;
|
||||
|
|
@ -129,12 +129,6 @@ LL | let fail24 = 0xAB_ABC_AB;
|
|||
|
|
||||
= note: `-D clippy::unusual-byte-groupings` implied by `-D warnings`
|
||||
|
||||
error: digits of hex or binary literal not grouped by four
|
||||
--> $DIR/literals.rs:39:18
|
||||
|
|
||||
LL | let fail25 = 0b01_100_101;
|
||||
| ^^^^^^^^^^^^ help: consider: `0b0110_0101`
|
||||
|
||||
error: this is a decimal constant
|
||||
--> $DIR/literals.rs:46:13
|
||||
|
|
||||
|
|
@ -168,5 +162,5 @@ help: if you mean to use a decimal constant, remove the `0` to avoid confusion
|
|||
LL | let _ = 89;
|
||||
| ~~
|
||||
|
||||
error: aborting due to 21 previous errors
|
||||
error: aborting due to 20 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -248,4 +248,15 @@ fn not_fire() {
|
|||
Some(value) => value,
|
||||
_ => macro_call!(),
|
||||
};
|
||||
|
||||
// Issue 10296
|
||||
// The let/else block in the else part is not divergent despite the presence of return
|
||||
let _x = if let Some(x) = Some(1) {
|
||||
x
|
||||
} else {
|
||||
let Some(_z) = Some(3) else {
|
||||
return
|
||||
};
|
||||
1
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,13 +42,13 @@ fn fire() {
|
|||
loop {
|
||||
// More complex pattern for the identity arm and diverging arm
|
||||
let v = match h() {
|
||||
(Some(_), Some(_)) | (None, None) => continue,
|
||||
(Some(v), None) | (None, Some(v)) => v,
|
||||
(Some(_), Some(_)) | (None, None) => continue,
|
||||
};
|
||||
// Custom enums are supported as long as the "else" arm is a simple _
|
||||
let v = match build_enum() {
|
||||
_ => continue,
|
||||
Variant::Bar(v) | Variant::Baz(v) => v,
|
||||
_ => continue,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -71,6 +71,12 @@ fn fire() {
|
|||
Variant::Bar(_) | Variant::Baz(_) => (),
|
||||
_ => return,
|
||||
};
|
||||
|
||||
let data = [1_u8, 2, 3, 4, 0, 0, 0, 0];
|
||||
let data = match data.as_slice() {
|
||||
[data @ .., 0, 0, 0, 0] | [data @ .., 0, 0] | [data @ .., 0] => data,
|
||||
_ => return,
|
||||
};
|
||||
}
|
||||
|
||||
fn not_fire() {
|
||||
|
|
@ -125,4 +131,23 @@ fn not_fire() {
|
|||
Ok(v) | Err(Variant::Bar(v) | Variant::Baz(v)) => v,
|
||||
Err(Variant::Foo) => return,
|
||||
};
|
||||
|
||||
// Issue 10241
|
||||
// The non-divergent arm arrives in second position and
|
||||
// may cover values already matched in the first arm.
|
||||
let v = match h() {
|
||||
(Some(_), Some(_)) | (None, None) => return,
|
||||
(Some(v), _) | (None, Some(v)) => v,
|
||||
};
|
||||
|
||||
let v = match build_enum() {
|
||||
_ => return,
|
||||
Variant::Bar(v) | Variant::Baz(v) => v,
|
||||
};
|
||||
|
||||
let data = [1_u8, 2, 3, 4, 0, 0, 0, 0];
|
||||
let data = match data.as_slice() {
|
||||
[] | [0, 0] => return,
|
||||
[data @ .., 0, 0, 0, 0] | [data @ .., 0, 0] | [data @ ..] => data,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ error: this could be rewritten as `let...else`
|
|||
--> $DIR/manual_let_else_match.rs:44:9
|
||||
|
|
||||
LL | / let v = match h() {
|
||||
LL | | (Some(_), Some(_)) | (None, None) => continue,
|
||||
LL | | (Some(v), None) | (None, Some(v)) => v,
|
||||
LL | | (Some(_), Some(_)) | (None, None) => continue,
|
||||
LL | | };
|
||||
| |__________^ help: consider writing: `let ((Some(v), None) | (None, Some(v))) = h() else { continue };`
|
||||
|
||||
|
|
@ -31,8 +31,8 @@ error: this could be rewritten as `let...else`
|
|||
--> $DIR/manual_let_else_match.rs:49:9
|
||||
|
|
||||
LL | / let v = match build_enum() {
|
||||
LL | | _ => continue,
|
||||
LL | | Variant::Bar(v) | Variant::Baz(v) => v,
|
||||
LL | | _ => continue,
|
||||
LL | | };
|
||||
| |__________^ help: consider writing: `let (Variant::Bar(v) | Variant::Baz(v)) = build_enum() else { continue };`
|
||||
|
||||
|
|
@ -63,5 +63,14 @@ LL | | _ => return,
|
|||
LL | | };
|
||||
| |______^ help: consider writing: `let (Variant::Bar(_) | Variant::Baz(_)) = f else { return };`
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
error: this could be rewritten as `let...else`
|
||||
--> $DIR/manual_let_else_match.rs:76:5
|
||||
|
|
||||
LL | / let data = match data.as_slice() {
|
||||
LL | | [data @ .., 0, 0, 0, 0] | [data @ .., 0, 0] | [data @ .., 0] => data,
|
||||
LL | | _ => return,
|
||||
LL | | };
|
||||
| |______^ help: consider writing: `let ([data @ .., 0, 0, 0, 0] | [data @ .., 0, 0] | [data @ .., 0]) = data.as_slice() else { return };`
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
// run-rustfix
|
||||
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::let_underscore_untyped)]
|
||||
#![allow(clippy::missing_docs_in_private_items)]
|
||||
#![allow(clippy::map_identity)]
|
||||
#![allow(clippy::redundant_closure)]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
// run-rustfix
|
||||
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::let_underscore_untyped)]
|
||||
#![allow(clippy::missing_docs_in_private_items)]
|
||||
#![allow(clippy::map_identity)]
|
||||
#![allow(clippy::redundant_closure)]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: called `map(..).flatten()` on `Iterator`
|
||||
--> $DIR/map_flatten_fixable.rs:17:47
|
||||
--> $DIR/map_flatten_fixable.rs:18:47
|
||||
|
|
||||
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id).flatten().collect();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(option_id)`
|
||||
|
|
@ -7,43 +7,43 @@ LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id).flatten().coll
|
|||
= note: `-D clippy::map-flatten` implied by `-D warnings`
|
||||
|
||||
error: called `map(..).flatten()` on `Iterator`
|
||||
--> $DIR/map_flatten_fixable.rs:18:47
|
||||
--> $DIR/map_flatten_fixable.rs:19:47
|
||||
|
|
||||
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id_ref).flatten().collect();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(option_id_ref)`
|
||||
|
||||
error: called `map(..).flatten()` on `Iterator`
|
||||
--> $DIR/map_flatten_fixable.rs:19:47
|
||||
--> $DIR/map_flatten_fixable.rs:20:47
|
||||
|
|
||||
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id_closure).flatten().collect();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(option_id_closure)`
|
||||
|
||||
error: called `map(..).flatten()` on `Iterator`
|
||||
--> $DIR/map_flatten_fixable.rs:20:47
|
||||
--> $DIR/map_flatten_fixable.rs:21:47
|
||||
|
|
||||
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(|x| x.checked_add(1)).flatten().collect();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(|x| x.checked_add(1))`
|
||||
|
||||
error: called `map(..).flatten()` on `Iterator`
|
||||
--> $DIR/map_flatten_fixable.rs:23:47
|
||||
--> $DIR/map_flatten_fixable.rs:24:47
|
||||
|
|
||||
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(|x| 0..x).flatten().collect();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `flat_map` and remove the `.flatten()`: `flat_map(|x| 0..x)`
|
||||
|
||||
error: called `map(..).flatten()` on `Option`
|
||||
--> $DIR/map_flatten_fixable.rs:26:40
|
||||
--> $DIR/map_flatten_fixable.rs:27:40
|
||||
|
|
||||
LL | let _: Option<_> = (Some(Some(1))).map(|x| x).flatten();
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `and_then` and remove the `.flatten()`: `and_then(|x| x)`
|
||||
|
||||
error: called `map(..).flatten()` on `Result`
|
||||
--> $DIR/map_flatten_fixable.rs:29:42
|
||||
--> $DIR/map_flatten_fixable.rs:30:42
|
||||
|
|
||||
LL | let _: Result<_, &str> = (Ok(Ok(1))).map(|x| x).flatten();
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `and_then` and remove the `.flatten()`: `and_then(|x| x)`
|
||||
|
||||
error: called `map(..).flatten()` on `Iterator`
|
||||
--> $DIR/map_flatten_fixable.rs:38:10
|
||||
--> $DIR/map_flatten_fixable.rs:39:10
|
||||
|
|
||||
LL | .map(|n| match n {
|
||||
| __________^
|
||||
|
|
@ -72,7 +72,7 @@ LL ~ });
|
|||
|
|
||||
|
||||
error: called `map(..).flatten()` on `Option`
|
||||
--> $DIR/map_flatten_fixable.rs:58:10
|
||||
--> $DIR/map_flatten_fixable.rs:59:10
|
||||
|
|
||||
LL | .map(|_| {
|
||||
| __________^
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#![allow(
|
||||
clippy::disallowed_names,
|
||||
clippy::default_trait_access,
|
||||
clippy::let_underscore_untyped,
|
||||
clippy::missing_docs_in_private_items,
|
||||
clippy::missing_safety_doc,
|
||||
clippy::non_ascii_literal,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: methods called `new` usually return `Self`
|
||||
--> $DIR/methods.rs:104:5
|
||||
--> $DIR/methods.rs:105:5
|
||||
|
|
||||
LL | / fn new() -> i32 {
|
||||
LL | | 0
|
||||
|
|
@ -9,7 +9,7 @@ LL | | }
|
|||
= note: `-D clippy::new-ret-no-self` implied by `-D warnings`
|
||||
|
||||
error: called `filter(..).next()` on an `Iterator`. This is more succinctly expressed by calling `.find(..)` instead
|
||||
--> $DIR/methods.rs:125:13
|
||||
--> $DIR/methods.rs:126:13
|
||||
|
|
||||
LL | let _ = v.iter().filter(|&x| {
|
||||
| _____________^
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ pub unsafe fn mutates_static() -> usize {
|
|||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn unmangled(i: bool) -> bool {
|
||||
pub extern "C" fn unmangled(i: bool) -> bool {
|
||||
!i
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ pub unsafe fn mutates_static() -> usize {
|
|||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn unmangled(i: bool) -> bool {
|
||||
pub extern "C" fn unmangled(i: bool) -> bool {
|
||||
!i
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -516,6 +516,16 @@ mod in_macro {
|
|||
|
||||
// no lint on external macro
|
||||
macro_rules::needless_lifetime!();
|
||||
|
||||
macro_rules! expanded_lifetime {
|
||||
($l:lifetime) => {
|
||||
fn f<$l>(arg: &$l str) -> &$l str {
|
||||
arg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expanded_lifetime!('a);
|
||||
}
|
||||
|
||||
mod issue5787 {
|
||||
|
|
|
|||
|
|
@ -516,6 +516,16 @@ mod in_macro {
|
|||
|
||||
// no lint on external macro
|
||||
macro_rules::needless_lifetime!();
|
||||
|
||||
macro_rules! expanded_lifetime {
|
||||
($l:lifetime) => {
|
||||
fn f<$l>(arg: &$l str) -> &$l str {
|
||||
arg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expanded_lifetime!('a);
|
||||
}
|
||||
|
||||
mod issue5787 {
|
||||
|
|
|
|||
|
|
@ -297,4 +297,14 @@ fn issue10051() -> Result<String, String> {
|
|||
}
|
||||
}
|
||||
|
||||
mod issue10049 {
|
||||
fn single() -> u32 {
|
||||
if true { 1 } else { 2 }
|
||||
}
|
||||
|
||||
fn multiple(b1: bool, b2: bool, b3: bool) -> u32 {
|
||||
(if b1 { 0 } else { 1 } | if b2 { 2 } else { 3 } | if b3 { 4 } else { 5 })
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -307,4 +307,14 @@ fn issue10051() -> Result<String, String> {
|
|||
}
|
||||
}
|
||||
|
||||
mod issue10049 {
|
||||
fn single() -> u32 {
|
||||
return if true { 1 } else { 2 };
|
||||
}
|
||||
|
||||
fn multiple(b1: bool, b2: bool, b3: bool) -> u32 {
|
||||
return if b1 { 0 } else { 1 } | if b2 { 2 } else { 3 } | if b3 { 4 } else { 5 };
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -418,5 +418,21 @@ LL | return Err(format!("err!"));
|
|||
|
|
||||
= help: remove `return`
|
||||
|
||||
error: aborting due to 50 previous errors
|
||||
error: unneeded `return` statement
|
||||
--> $DIR/needless_return.rs:312:9
|
||||
|
|
||||
LL | return if true { 1 } else { 2 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove `return`
|
||||
|
||||
error: unneeded `return` statement
|
||||
--> $DIR/needless_return.rs:316:9
|
||||
|
|
||||
LL | return if b1 { 0 } else { 1 } | if b2 { 2 } else { 3 } | if b3 { 4 } else { 5 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove `return` and wrap the sequence with parentheses
|
||||
|
||||
error: aborting due to 52 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -250,6 +250,51 @@ pub fn test20() {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn test21() {
|
||||
loop {
|
||||
'a: {
|
||||
{}
|
||||
break 'a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Issue 10304: code after break from block was not considered
|
||||
// unreachable code and was considered for further analysis of
|
||||
// whether the loop would ever be executed or not.
|
||||
pub fn test22() {
|
||||
for _ in 0..10 {
|
||||
'block: {
|
||||
break 'block;
|
||||
return;
|
||||
}
|
||||
println!("looped");
|
||||
}
|
||||
}
|
||||
|
||||
pub fn test23() {
|
||||
for _ in 0..10 {
|
||||
'block: {
|
||||
for _ in 0..20 {
|
||||
break 'block;
|
||||
}
|
||||
}
|
||||
println!("looped");
|
||||
}
|
||||
}
|
||||
|
||||
pub fn test24() {
|
||||
'a: for _ in 0..10 {
|
||||
'b: {
|
||||
let x = Some(1);
|
||||
match x {
|
||||
None => break 'a,
|
||||
Some(_) => break 'b,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
test1();
|
||||
test2();
|
||||
|
|
|
|||
|
|
@ -126,5 +126,18 @@ LL | | }
|
|||
LL | | }
|
||||
| |_____^
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:278:13
|
||||
|
|
||||
LL | / for _ in 0..20 {
|
||||
LL | | break 'block;
|
||||
LL | | }
|
||||
| |_____________^
|
||||
|
|
||||
help: if you need the first element of the iterator, try writing
|
||||
|
|
||||
LL | if let Some(_) = (0..20).next() {
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
|
||||
|
|
|
|||
48
tests/ui/no_mangle_with_rust_abi.fixed
Normal file
48
tests/ui/no_mangle_with_rust_abi.fixed
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
// run-rustfix
|
||||
|
||||
#![allow(unused)]
|
||||
#![warn(clippy::no_mangle_with_rust_abi)]
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn rust_abi_fn_one(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn rust_abi_fn_two(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
/// # Safety
|
||||
/// This function shouldn't be called unless the horsemen are ready
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn rust_abi_fn_three(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
/// # Safety
|
||||
/// This function shouldn't be called unless the horsemen are ready
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn rust_abi_fn_four(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn rust_abi_multiline_function_really_long_name_to_overflow_args_to_multiple_lines(
|
||||
arg_one: u32,
|
||||
arg_two: usize,
|
||||
) -> u32 {
|
||||
0
|
||||
}
|
||||
|
||||
// Must not run on functions that explicitly opt in to Rust ABI with `extern "Rust"`
|
||||
#[no_mangle]
|
||||
#[rustfmt::skip]
|
||||
extern "Rust" fn rust_abi_fn_explicit_opt_in(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
fn rust_abi_fn_again(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn c_abi_fn(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
extern "C" fn c_abi_fn_again(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
extern "C" {
|
||||
fn c_abi_in_block(arg_one: u32, arg_two: usize);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// test code goes here
|
||||
}
|
||||
48
tests/ui/no_mangle_with_rust_abi.rs
Normal file
48
tests/ui/no_mangle_with_rust_abi.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
// run-rustfix
|
||||
|
||||
#![allow(unused)]
|
||||
#![warn(clippy::no_mangle_with_rust_abi)]
|
||||
|
||||
#[no_mangle]
|
||||
fn rust_abi_fn_one(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn rust_abi_fn_two(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
/// # Safety
|
||||
/// This function shouldn't be called unless the horsemen are ready
|
||||
#[no_mangle]
|
||||
pub unsafe fn rust_abi_fn_three(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
/// # Safety
|
||||
/// This function shouldn't be called unless the horsemen are ready
|
||||
#[no_mangle]
|
||||
unsafe fn rust_abi_fn_four(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
#[no_mangle]
|
||||
fn rust_abi_multiline_function_really_long_name_to_overflow_args_to_multiple_lines(
|
||||
arg_one: u32,
|
||||
arg_two: usize,
|
||||
) -> u32 {
|
||||
0
|
||||
}
|
||||
|
||||
// Must not run on functions that explicitly opt in to Rust ABI with `extern "Rust"`
|
||||
#[no_mangle]
|
||||
#[rustfmt::skip]
|
||||
extern "Rust" fn rust_abi_fn_explicit_opt_in(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
fn rust_abi_fn_again(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn c_abi_fn(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
extern "C" fn c_abi_fn_again(arg_one: u32, arg_two: usize) {}
|
||||
|
||||
extern "C" {
|
||||
fn c_abi_in_block(arg_one: u32, arg_two: usize);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// test code goes here
|
||||
}
|
||||
45
tests/ui/no_mangle_with_rust_abi.stderr
Normal file
45
tests/ui/no_mangle_with_rust_abi.stderr
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
error: attribute #[no_mangle] set on a Rust ABI function
|
||||
--> $DIR/no_mangle_with_rust_abi.rs:7:1
|
||||
|
|
||||
LL | fn rust_abi_fn_one(arg_one: u32, arg_two: usize) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `extern "C" fn rust_abi_fn_one(arg_one: u32, arg_two: usize)`
|
||||
|
|
||||
= note: `-D clippy::no-mangle-with-rust-abi` implied by `-D warnings`
|
||||
|
||||
error: attribute #[no_mangle] set on a Rust ABI function
|
||||
--> $DIR/no_mangle_with_rust_abi.rs:10:1
|
||||
|
|
||||
LL | pub fn rust_abi_fn_two(arg_one: u32, arg_two: usize) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `pub extern "C" fn rust_abi_fn_two(arg_one: u32, arg_two: usize)`
|
||||
|
||||
error: attribute #[no_mangle] set on a Rust ABI function
|
||||
--> $DIR/no_mangle_with_rust_abi.rs:15:1
|
||||
|
|
||||
LL | pub unsafe fn rust_abi_fn_three(arg_one: u32, arg_two: usize) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `pub unsafe extern "C" fn rust_abi_fn_three(arg_one: u32, arg_two: usize)`
|
||||
|
||||
error: attribute #[no_mangle] set on a Rust ABI function
|
||||
--> $DIR/no_mangle_with_rust_abi.rs:20:1
|
||||
|
|
||||
LL | unsafe fn rust_abi_fn_four(arg_one: u32, arg_two: usize) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unsafe extern "C" fn rust_abi_fn_four(arg_one: u32, arg_two: usize)`
|
||||
|
||||
error: attribute #[no_mangle] set on a Rust ABI function
|
||||
--> $DIR/no_mangle_with_rust_abi.rs:23:1
|
||||
|
|
||||
LL | / fn rust_abi_multiline_function_really_long_name_to_overflow_args_to_multiple_lines(
|
||||
LL | | arg_one: u32,
|
||||
LL | | arg_two: usize,
|
||||
LL | | ) -> u32 {
|
||||
| |________^
|
||||
|
|
||||
help: try
|
||||
|
|
||||
LL + extern "C" fn rust_abi_multiline_function_really_long_name_to_overflow_args_to_multiple_lines(
|
||||
LL + arg_one: u32,
|
||||
LL + arg_two: usize,
|
||||
LL ~ ) -> u32 {
|
||||
|
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
15
tests/ui/question_mark_used.rs
Normal file
15
tests/ui/question_mark_used.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// non rustfixable
|
||||
#![allow(unreachable_code)]
|
||||
#![allow(dead_code)]
|
||||
#![warn(clippy::question_mark_used)]
|
||||
|
||||
fn other_function() -> Option<i32> {
|
||||
Some(32)
|
||||
}
|
||||
|
||||
fn my_function() -> Option<i32> {
|
||||
other_function()?;
|
||||
None
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
11
tests/ui/question_mark_used.stderr
Normal file
11
tests/ui/question_mark_used.stderr
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
error: question mark operator was used
|
||||
--> $DIR/question_mark_used.rs:11:5
|
||||
|
|
||||
LL | other_function()?;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a custom macro or match expression
|
||||
= note: `-D clippy::question-mark-used` implied by `-D warnings`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
84
tests/ui/significant_drop_tightening.fixed
Normal file
84
tests/ui/significant_drop_tightening.fixed
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
// run-rustfix
|
||||
|
||||
#![warn(clippy::significant_drop_tightening)]
|
||||
|
||||
use std::sync::Mutex;
|
||||
|
||||
pub fn complex_return_triggers_the_lint() -> i32 {
|
||||
fn foo() -> i32 {
|
||||
1
|
||||
}
|
||||
let mutex = Mutex::new(1);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let _ = *lock;
|
||||
let _ = *lock;
|
||||
drop(lock);
|
||||
foo()
|
||||
}
|
||||
|
||||
pub fn path_return_can_be_ignored() -> i32 {
|
||||
let mutex = Mutex::new(1);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let rslt = *lock;
|
||||
let _ = *lock;
|
||||
rslt
|
||||
}
|
||||
|
||||
pub fn post_bindings_can_be_ignored() {
|
||||
let mutex = Mutex::new(1);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let rslt = *lock;
|
||||
let another = rslt;
|
||||
let _ = another;
|
||||
}
|
||||
|
||||
pub fn unnecessary_contention_with_multiple_owned_results() {
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let _ = lock.abs();
|
||||
let _ = lock.is_positive();
|
||||
}
|
||||
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let rslt0 = lock.abs();
|
||||
let rslt1 = lock.is_positive();
|
||||
drop(lock);
|
||||
do_heavy_computation_that_takes_time((rslt0, rslt1));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn unnecessary_contention_with_single_owned_results() {
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let _ = lock.abs();
|
||||
}
|
||||
{
|
||||
let mutex = Mutex::new(vec![1i32]);
|
||||
let mut lock = mutex.lock().unwrap();
|
||||
lock.clear();
|
||||
}
|
||||
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
|
||||
let rslt0 = mutex.lock().unwrap().abs();
|
||||
|
||||
do_heavy_computation_that_takes_time(rslt0);
|
||||
}
|
||||
{
|
||||
let mutex = Mutex::new(vec![1i32]);
|
||||
|
||||
mutex.lock().unwrap().clear();
|
||||
|
||||
do_heavy_computation_that_takes_time(());
|
||||
}
|
||||
}
|
||||
|
||||
// Marker used for illustration purposes.
|
||||
pub fn do_heavy_computation_that_takes_time<T>(_: T) {}
|
||||
|
||||
fn main() {}
|
||||
80
tests/ui/significant_drop_tightening.rs
Normal file
80
tests/ui/significant_drop_tightening.rs
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
// run-rustfix
|
||||
|
||||
#![warn(clippy::significant_drop_tightening)]
|
||||
|
||||
use std::sync::Mutex;
|
||||
|
||||
pub fn complex_return_triggers_the_lint() -> i32 {
|
||||
fn foo() -> i32 {
|
||||
1
|
||||
}
|
||||
let mutex = Mutex::new(1);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let _ = *lock;
|
||||
let _ = *lock;
|
||||
foo()
|
||||
}
|
||||
|
||||
pub fn path_return_can_be_ignored() -> i32 {
|
||||
let mutex = Mutex::new(1);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let rslt = *lock;
|
||||
let _ = *lock;
|
||||
rslt
|
||||
}
|
||||
|
||||
pub fn post_bindings_can_be_ignored() {
|
||||
let mutex = Mutex::new(1);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let rslt = *lock;
|
||||
let another = rslt;
|
||||
let _ = another;
|
||||
}
|
||||
|
||||
pub fn unnecessary_contention_with_multiple_owned_results() {
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let _ = lock.abs();
|
||||
let _ = lock.is_positive();
|
||||
}
|
||||
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let rslt0 = lock.abs();
|
||||
let rslt1 = lock.is_positive();
|
||||
do_heavy_computation_that_takes_time((rslt0, rslt1));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn unnecessary_contention_with_single_owned_results() {
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let _ = lock.abs();
|
||||
}
|
||||
{
|
||||
let mutex = Mutex::new(vec![1i32]);
|
||||
let mut lock = mutex.lock().unwrap();
|
||||
lock.clear();
|
||||
}
|
||||
|
||||
{
|
||||
let mutex = Mutex::new(1i32);
|
||||
let lock = mutex.lock().unwrap();
|
||||
let rslt0 = lock.abs();
|
||||
do_heavy_computation_that_takes_time(rslt0);
|
||||
}
|
||||
{
|
||||
let mutex = Mutex::new(vec![1i32]);
|
||||
let mut lock = mutex.lock().unwrap();
|
||||
lock.clear();
|
||||
do_heavy_computation_that_takes_time(());
|
||||
}
|
||||
}
|
||||
|
||||
// Marker used for illustration purposes.
|
||||
pub fn do_heavy_computation_that_takes_time<T>(_: T) {}
|
||||
|
||||
fn main() {}
|
||||
94
tests/ui/significant_drop_tightening.stderr
Normal file
94
tests/ui/significant_drop_tightening.stderr
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
error: temporary with significant `Drop` can be early dropped
|
||||
--> $DIR/significant_drop_tightening.rs:12:9
|
||||
|
|
||||
LL | pub fn complex_return_triggers_the_lint() -> i32 {
|
||||
| __________________________________________________-
|
||||
LL | | fn foo() -> i32 {
|
||||
LL | | 1
|
||||
LL | | }
|
||||
LL | | let mutex = Mutex::new(1);
|
||||
LL | | let lock = mutex.lock().unwrap();
|
||||
| | ^^^^
|
||||
... |
|
||||
LL | | foo()
|
||||
LL | | }
|
||||
| |_- temporary `lock` is currently being dropped at the end of its contained scope
|
||||
|
|
||||
= note: this might lead to unnecessary resource contention
|
||||
= note: `-D clippy::significant-drop-tightening` implied by `-D warnings`
|
||||
help: drop the temporary after the end of its last usage
|
||||
|
|
||||
LL ~ let _ = *lock;
|
||||
LL + drop(lock);
|
||||
|
|
||||
|
||||
error: temporary with significant `Drop` can be early dropped
|
||||
--> $DIR/significant_drop_tightening.rs:44:13
|
||||
|
|
||||
LL | / {
|
||||
LL | | let mutex = Mutex::new(1i32);
|
||||
LL | | let lock = mutex.lock().unwrap();
|
||||
| | ^^^^
|
||||
LL | | let rslt0 = lock.abs();
|
||||
LL | | let rslt1 = lock.is_positive();
|
||||
LL | | do_heavy_computation_that_takes_time((rslt0, rslt1));
|
||||
LL | | }
|
||||
| |_____- temporary `lock` is currently being dropped at the end of its contained scope
|
||||
|
|
||||
= note: this might lead to unnecessary resource contention
|
||||
help: drop the temporary after the end of its last usage
|
||||
|
|
||||
LL ~ let rslt1 = lock.is_positive();
|
||||
LL + drop(lock);
|
||||
|
|
||||
|
||||
error: temporary with significant `Drop` can be early dropped
|
||||
--> $DIR/significant_drop_tightening.rs:65:13
|
||||
|
|
||||
LL | / {
|
||||
LL | | let mutex = Mutex::new(1i32);
|
||||
LL | | let lock = mutex.lock().unwrap();
|
||||
| | ^^^^
|
||||
LL | | let rslt0 = lock.abs();
|
||||
LL | | do_heavy_computation_that_takes_time(rslt0);
|
||||
LL | | }
|
||||
| |_____- temporary `lock` is currently being dropped at the end of its contained scope
|
||||
|
|
||||
= note: this might lead to unnecessary resource contention
|
||||
help: merge the temporary construction with its single usage
|
||||
|
|
||||
LL ~
|
||||
LL + let rslt0 = mutex.lock().unwrap().abs();
|
||||
|
|
||||
help: remove separated single usage
|
||||
|
|
||||
LL - let rslt0 = lock.abs();
|
||||
LL +
|
||||
|
|
||||
|
||||
error: temporary with significant `Drop` can be early dropped
|
||||
--> $DIR/significant_drop_tightening.rs:71:17
|
||||
|
|
||||
LL | / {
|
||||
LL | | let mutex = Mutex::new(vec![1i32]);
|
||||
LL | | let mut lock = mutex.lock().unwrap();
|
||||
| | ^^^^
|
||||
LL | | lock.clear();
|
||||
LL | | do_heavy_computation_that_takes_time(());
|
||||
LL | | }
|
||||
| |_____- temporary `lock` is currently being dropped at the end of its contained scope
|
||||
|
|
||||
= note: this might lead to unnecessary resource contention
|
||||
help: merge the temporary construction with its single usage
|
||||
|
|
||||
LL ~
|
||||
LL + mutex.lock().unwrap().clear();
|
||||
|
|
||||
help: remove separated single usage
|
||||
|
|
||||
LL - lock.clear();
|
||||
LL +
|
||||
|
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
10
tests/ui/suspicious_command_arg_space.rs
Normal file
10
tests/ui/suspicious_command_arg_space.rs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
fn main() {
|
||||
// Things it should warn about:
|
||||
std::process::Command::new("echo").arg("-n hello").spawn().unwrap();
|
||||
std::process::Command::new("cat").arg("--number file").spawn().unwrap();
|
||||
|
||||
// Things it should not warn about:
|
||||
std::process::Command::new("echo").arg("hello world").spawn().unwrap();
|
||||
std::process::Command::new("a").arg("--fmt=%a %b %c").spawn().unwrap();
|
||||
std::process::Command::new("b").arg("-ldflags=-s -w").spawn().unwrap();
|
||||
}
|
||||
25
tests/ui/suspicious_command_arg_space.stderr
Normal file
25
tests/ui/suspicious_command_arg_space.stderr
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
error: single argument that looks like it should be multiple arguments
|
||||
--> $DIR/suspicious_command_arg_space.rs:3:44
|
||||
|
|
||||
LL | std::process::Command::new("echo").arg("-n hello").spawn().unwrap();
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::suspicious-command-arg-space` implied by `-D warnings`
|
||||
help: consider splitting the argument
|
||||
|
|
||||
LL | std::process::Command::new("echo").args(["-n", "hello"]).spawn().unwrap();
|
||||
| ~~~~ ~~~~~~~~~~~~~~~
|
||||
|
||||
error: single argument that looks like it should be multiple arguments
|
||||
--> $DIR/suspicious_command_arg_space.rs:4:43
|
||||
|
|
||||
LL | std::process::Command::new("cat").arg("--number file").spawn().unwrap();
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: consider splitting the argument
|
||||
|
|
||||
LL | std::process::Command::new("cat").args(["--number", "file"]).spawn().unwrap();
|
||||
| ~~~~ ~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
@ -7,7 +7,8 @@
|
|||
clippy::redundant_clone,
|
||||
redundant_semicolons,
|
||||
dead_code,
|
||||
unused_assignments
|
||||
unused_assignments,
|
||||
unused_variables
|
||||
)]
|
||||
|
||||
struct Foo(u32);
|
||||
|
|
@ -121,6 +122,27 @@ fn main() {
|
|||
std::mem::swap(&mut c.0, &mut a);
|
||||
|
||||
; std::mem::swap(&mut c.0, &mut a);
|
||||
|
||||
std::mem::swap(&mut a, &mut b);
|
||||
|
||||
let mut c = 1;
|
||||
let mut d = 2;
|
||||
std::mem::swap(&mut d, &mut c);
|
||||
|
||||
let mut b = 1;
|
||||
std::mem::swap(&mut a, &mut b);
|
||||
|
||||
let b = 1;
|
||||
let a = 2;
|
||||
|
||||
let t = b;
|
||||
let b = a;
|
||||
let a = t;
|
||||
|
||||
let mut b = 1;
|
||||
let mut a = 2;
|
||||
|
||||
std::mem::swap(&mut b, &mut a);
|
||||
}
|
||||
|
||||
fn issue_8154() {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@
|
|||
clippy::redundant_clone,
|
||||
redundant_semicolons,
|
||||
dead_code,
|
||||
unused_assignments
|
||||
unused_assignments,
|
||||
unused_variables
|
||||
)]
|
||||
|
||||
struct Foo(u32);
|
||||
|
|
@ -143,6 +144,32 @@ fn main() {
|
|||
; let t = c.0;
|
||||
c.0 = a;
|
||||
a = t;
|
||||
|
||||
let a = b;
|
||||
let b = a;
|
||||
|
||||
let mut c = 1;
|
||||
let mut d = 2;
|
||||
d = c;
|
||||
c = d;
|
||||
|
||||
let mut b = 1;
|
||||
let a = b;
|
||||
b = a;
|
||||
|
||||
let b = 1;
|
||||
let a = 2;
|
||||
|
||||
let t = b;
|
||||
let b = a;
|
||||
let a = t;
|
||||
|
||||
let mut b = 1;
|
||||
let mut a = 2;
|
||||
|
||||
let t = b;
|
||||
b = a;
|
||||
a = t;
|
||||
}
|
||||
|
||||
fn issue_8154() {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: this looks like you are swapping `bar.a` and `bar.b` manually
|
||||
--> $DIR/swap.rs:24:5
|
||||
--> $DIR/swap.rs:25:5
|
||||
|
|
||||
LL | / let temp = bar.a;
|
||||
LL | | bar.a = bar.b;
|
||||
|
|
@ -10,7 +10,7 @@ LL | | bar.b = temp;
|
|||
= note: `-D clippy::manual-swap` implied by `-D warnings`
|
||||
|
||||
error: this looks like you are swapping elements of `foo` manually
|
||||
--> $DIR/swap.rs:36:5
|
||||
--> $DIR/swap.rs:37:5
|
||||
|
|
||||
LL | / let temp = foo[0];
|
||||
LL | | foo[0] = foo[1];
|
||||
|
|
@ -18,7 +18,7 @@ LL | | foo[1] = temp;
|
|||
| |_________________^ help: try: `foo.swap(0, 1)`
|
||||
|
||||
error: this looks like you are swapping elements of `foo` manually
|
||||
--> $DIR/swap.rs:45:5
|
||||
--> $DIR/swap.rs:46:5
|
||||
|
|
||||
LL | / let temp = foo[0];
|
||||
LL | | foo[0] = foo[1];
|
||||
|
|
@ -26,7 +26,7 @@ LL | | foo[1] = temp;
|
|||
| |_________________^ help: try: `foo.swap(0, 1)`
|
||||
|
||||
error: this looks like you are swapping elements of `foo` manually
|
||||
--> $DIR/swap.rs:64:5
|
||||
--> $DIR/swap.rs:65:5
|
||||
|
|
||||
LL | / let temp = foo[0];
|
||||
LL | | foo[0] = foo[1];
|
||||
|
|
@ -34,7 +34,7 @@ LL | | foo[1] = temp;
|
|||
| |_________________^ help: try: `foo.swap(0, 1)`
|
||||
|
||||
error: this looks like you are swapping `a` and `b` manually
|
||||
--> $DIR/swap.rs:75:5
|
||||
--> $DIR/swap.rs:76:5
|
||||
|
|
||||
LL | / a ^= b;
|
||||
LL | | b ^= a;
|
||||
|
|
@ -42,7 +42,7 @@ LL | | a ^= b;
|
|||
| |___________^ help: try: `std::mem::swap(&mut a, &mut b)`
|
||||
|
||||
error: this looks like you are swapping `bar.a` and `bar.b` manually
|
||||
--> $DIR/swap.rs:83:5
|
||||
--> $DIR/swap.rs:84:5
|
||||
|
|
||||
LL | / bar.a ^= bar.b;
|
||||
LL | | bar.b ^= bar.a;
|
||||
|
|
@ -50,7 +50,7 @@ LL | | bar.a ^= bar.b;
|
|||
| |___________________^ help: try: `std::mem::swap(&mut bar.a, &mut bar.b)`
|
||||
|
||||
error: this looks like you are swapping elements of `foo` manually
|
||||
--> $DIR/swap.rs:91:5
|
||||
--> $DIR/swap.rs:92:5
|
||||
|
|
||||
LL | / foo[0] ^= foo[1];
|
||||
LL | | foo[1] ^= foo[0];
|
||||
|
|
@ -58,7 +58,7 @@ LL | | foo[0] ^= foo[1];
|
|||
| |_____________________^ help: try: `foo.swap(0, 1)`
|
||||
|
||||
error: this looks like you are swapping `foo[0][1]` and `bar[1][0]` manually
|
||||
--> $DIR/swap.rs:120:5
|
||||
--> $DIR/swap.rs:121:5
|
||||
|
|
||||
LL | / let temp = foo[0][1];
|
||||
LL | | foo[0][1] = bar[1][0];
|
||||
|
|
@ -68,7 +68,7 @@ LL | | bar[1][0] = temp;
|
|||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are swapping `a` and `b` manually
|
||||
--> $DIR/swap.rs:134:7
|
||||
--> $DIR/swap.rs:135:7
|
||||
|
|
||||
LL | ; let t = a;
|
||||
| _______^
|
||||
|
|
@ -79,7 +79,7 @@ LL | | b = t;
|
|||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are swapping `c.0` and `a` manually
|
||||
--> $DIR/swap.rs:143:7
|
||||
--> $DIR/swap.rs:144:7
|
||||
|
|
||||
LL | ; let t = c.0;
|
||||
| _______^
|
||||
|
|
@ -89,8 +89,18 @@ LL | | a = t;
|
|||
|
|
||||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are swapping `b` and `a` manually
|
||||
--> $DIR/swap.rs:170:5
|
||||
|
|
||||
LL | / let t = b;
|
||||
LL | | b = a;
|
||||
LL | | a = t;
|
||||
| |_________^ help: try: `std::mem::swap(&mut b, &mut a)`
|
||||
|
|
||||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are trying to swap `a` and `b`
|
||||
--> $DIR/swap.rs:131:5
|
||||
--> $DIR/swap.rs:132:5
|
||||
|
|
||||
LL | / a = b;
|
||||
LL | | b = a;
|
||||
|
|
@ -100,7 +110,7 @@ LL | | b = a;
|
|||
= note: `-D clippy::almost-swapped` implied by `-D warnings`
|
||||
|
||||
error: this looks like you are trying to swap `c.0` and `a`
|
||||
--> $DIR/swap.rs:140:5
|
||||
--> $DIR/swap.rs:141:5
|
||||
|
|
||||
LL | / c.0 = a;
|
||||
LL | | a = c.0;
|
||||
|
|
@ -108,8 +118,35 @@ LL | | a = c.0;
|
|||
|
|
||||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are trying to swap `a` and `b`
|
||||
--> $DIR/swap.rs:148:5
|
||||
|
|
||||
LL | / let a = b;
|
||||
LL | | let b = a;
|
||||
| |_____________^ help: try: `std::mem::swap(&mut a, &mut b)`
|
||||
|
|
||||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are trying to swap `d` and `c`
|
||||
--> $DIR/swap.rs:153:5
|
||||
|
|
||||
LL | / d = c;
|
||||
LL | | c = d;
|
||||
| |_________^ help: try: `std::mem::swap(&mut d, &mut c)`
|
||||
|
|
||||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are trying to swap `a` and `b`
|
||||
--> $DIR/swap.rs:157:5
|
||||
|
|
||||
LL | / let a = b;
|
||||
LL | | b = a;
|
||||
| |_________^ help: try: `std::mem::swap(&mut a, &mut b)`
|
||||
|
|
||||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: this looks like you are swapping `s.0.x` and `s.0.y` manually
|
||||
--> $DIR/swap.rs:178:5
|
||||
--> $DIR/swap.rs:205:5
|
||||
|
|
||||
LL | / let t = s.0.x;
|
||||
LL | | s.0.x = s.0.y;
|
||||
|
|
@ -118,5 +155,5 @@ LL | | s.0.y = t;
|
|||
|
|
||||
= note: or maybe you should use `std::mem::replace`?
|
||||
|
||||
error: aborting due to 13 previous errors
|
||||
error: aborting due to 17 previous errors
|
||||
|
||||
|
|
|
|||
41
tests/ui/transmute_int_to_non_zero.rs
Normal file
41
tests/ui/transmute_int_to_non_zero.rs
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
#![warn(clippy::transmute_int_to_non_zero)]
|
||||
|
||||
use core::num::*;
|
||||
|
||||
fn main() {
|
||||
let int_u8: u8 = 1;
|
||||
let int_u16: u16 = 1;
|
||||
let int_u32: u32 = 1;
|
||||
let int_u64: u64 = 1;
|
||||
let int_u128: u128 = 1;
|
||||
|
||||
let int_i8: i8 = 1;
|
||||
let int_i16: i16 = 1;
|
||||
let int_i32: i32 = 1;
|
||||
let int_i64: i64 = 1;
|
||||
let int_i128: i128 = 1;
|
||||
|
||||
let _: NonZeroU8 = unsafe { std::mem::transmute(int_u8) };
|
||||
let _: NonZeroU16 = unsafe { std::mem::transmute(int_u16) };
|
||||
let _: NonZeroU32 = unsafe { std::mem::transmute(int_u32) };
|
||||
let _: NonZeroU64 = unsafe { std::mem::transmute(int_u64) };
|
||||
let _: NonZeroU128 = unsafe { std::mem::transmute(int_u128) };
|
||||
|
||||
let _: NonZeroI8 = unsafe { std::mem::transmute(int_i8) };
|
||||
let _: NonZeroI16 = unsafe { std::mem::transmute(int_i16) };
|
||||
let _: NonZeroI32 = unsafe { std::mem::transmute(int_i32) };
|
||||
let _: NonZeroI64 = unsafe { std::mem::transmute(int_i64) };
|
||||
let _: NonZeroI128 = unsafe { std::mem::transmute(int_i128) };
|
||||
|
||||
let _: NonZeroU8 = unsafe { NonZeroU8::new_unchecked(int_u8) };
|
||||
let _: NonZeroU16 = unsafe { NonZeroU16::new_unchecked(int_u16) };
|
||||
let _: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(int_u32) };
|
||||
let _: NonZeroU64 = unsafe { NonZeroU64::new_unchecked(int_u64) };
|
||||
let _: NonZeroU128 = unsafe { NonZeroU128::new_unchecked(int_u128) };
|
||||
|
||||
let _: NonZeroI8 = unsafe { NonZeroI8::new_unchecked(int_i8) };
|
||||
let _: NonZeroI16 = unsafe { NonZeroI16::new_unchecked(int_i16) };
|
||||
let _: NonZeroI32 = unsafe { NonZeroI32::new_unchecked(int_i32) };
|
||||
let _: NonZeroI64 = unsafe { NonZeroI64::new_unchecked(int_i64) };
|
||||
let _: NonZeroI128 = unsafe { NonZeroI128::new_unchecked(int_i128) };
|
||||
}
|
||||
64
tests/ui/transmute_int_to_non_zero.stderr
Normal file
64
tests/ui/transmute_int_to_non_zero.stderr
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
error: transmute from a `u8` to a `NonZeroU8`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:18:33
|
||||
|
|
||||
LL | let _: NonZeroU8 = unsafe { std::mem::transmute(int_u8) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroU8::new_unchecked(int_u8)`
|
||||
|
|
||||
= note: `-D clippy::transmute-int-to-non-zero` implied by `-D warnings`
|
||||
|
||||
error: transmute from a `u16` to a `NonZeroU16`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:19:34
|
||||
|
|
||||
LL | let _: NonZeroU16 = unsafe { std::mem::transmute(int_u16) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroU16::new_unchecked(int_u16)`
|
||||
|
||||
error: transmute from a `u32` to a `NonZeroU32`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:20:34
|
||||
|
|
||||
LL | let _: NonZeroU32 = unsafe { std::mem::transmute(int_u32) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroU32::new_unchecked(int_u32)`
|
||||
|
||||
error: transmute from a `u64` to a `NonZeroU64`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:21:34
|
||||
|
|
||||
LL | let _: NonZeroU64 = unsafe { std::mem::transmute(int_u64) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroU64::new_unchecked(int_u64)`
|
||||
|
||||
error: transmute from a `u128` to a `NonZeroU128`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:22:35
|
||||
|
|
||||
LL | let _: NonZeroU128 = unsafe { std::mem::transmute(int_u128) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroU128::new_unchecked(int_u128)`
|
||||
|
||||
error: transmute from a `i8` to a `NonZeroI8`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:24:33
|
||||
|
|
||||
LL | let _: NonZeroI8 = unsafe { std::mem::transmute(int_i8) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroI8::new_unchecked(int_i8)`
|
||||
|
||||
error: transmute from a `i16` to a `NonZeroI16`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:25:34
|
||||
|
|
||||
LL | let _: NonZeroI16 = unsafe { std::mem::transmute(int_i16) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroI16::new_unchecked(int_i16)`
|
||||
|
||||
error: transmute from a `i32` to a `NonZeroI32`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:26:34
|
||||
|
|
||||
LL | let _: NonZeroI32 = unsafe { std::mem::transmute(int_i32) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroI32::new_unchecked(int_i32)`
|
||||
|
||||
error: transmute from a `i64` to a `NonZeroI64`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:27:34
|
||||
|
|
||||
LL | let _: NonZeroI64 = unsafe { std::mem::transmute(int_i64) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroI64::new_unchecked(int_i64)`
|
||||
|
||||
error: transmute from a `i128` to a `NonZeroI128`
|
||||
--> $DIR/transmute_int_to_non_zero.rs:28:35
|
||||
|
|
||||
LL | let _: NonZeroI128 = unsafe { std::mem::transmute(int_i128) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `NonZeroI128::new_unchecked(int_i128)`
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
|
|
@ -174,3 +174,7 @@ fn _meets_msrv() {
|
|||
let local_i32 = 1;
|
||||
println!("expand='{local_i32}'");
|
||||
}
|
||||
|
||||
fn _do_not_fire() {
|
||||
println!("{:?}", None::<()>);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -179,3 +179,7 @@ fn _meets_msrv() {
|
|||
let local_i32 = 1;
|
||||
println!("expand='{}'", local_i32);
|
||||
}
|
||||
|
||||
fn _do_not_fire() {
|
||||
println!("{:?}", None::<()>);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ fn main() {
|
|||
let _good = (
|
||||
0b1011_i64,
|
||||
0o1_234_u32,
|
||||
0x0123_4567,
|
||||
0x1_234_567,
|
||||
65536,
|
||||
1_2345_6789,
|
||||
1234_f32,
|
||||
|
|
|
|||
|
|
@ -1,11 +1,3 @@
|
|||
error: digits of hex or binary literal not grouped by four
|
||||
--> $DIR/unreadable_literal.rs:26:9
|
||||
|
|
||||
LL | 0x1_234_567,
|
||||
| ^^^^^^^^^^^ help: consider: `0x0123_4567`
|
||||
|
|
||||
= note: `-D clippy::unusual-byte-groupings` implied by `-D warnings`
|
||||
|
||||
error: long literal lacking separators
|
||||
--> $DIR/unreadable_literal.rs:34:17
|
||||
|
|
||||
|
|
@ -68,5 +60,5 @@ error: long literal lacking separators
|
|||
LL | let _fail5 = 1.100300400;
|
||||
| ^^^^^^^^^^^ help: consider: `1.100_300_400`
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue