Merge remote-tracking branch 'upstream/master' into rustup
This commit is contained in:
commit
95dc7be92f
358 changed files with 3171 additions and 2172 deletions
|
|
@ -11,6 +11,7 @@ edition = "2021"
|
|||
[dependencies]
|
||||
arrayvec = { version = "0.7", default-features = false }
|
||||
cargo_metadata = "0.15.3"
|
||||
clippy_config = { path = "../clippy_config" }
|
||||
clippy_utils = { path = "../clippy_utils" }
|
||||
declare_clippy_lint = { path = "../declare_clippy_lint" }
|
||||
if_chain = "1.0"
|
||||
|
|
@ -32,9 +33,9 @@ url = "2.2"
|
|||
walkdir = "2.3"
|
||||
|
||||
[features]
|
||||
deny-warnings = ["clippy_utils/deny-warnings"]
|
||||
deny-warnings = ["clippy_config/deny-warnings", "clippy_utils/deny-warnings"]
|
||||
# build clippy with internal lints enabled, off by default
|
||||
internal = ["clippy_utils/internal", "serde_json", "tempfile", "regex"]
|
||||
internal = ["serde_json", "tempfile", "regex"]
|
||||
|
||||
[package.metadata.rust-analyzer]
|
||||
# This crate uses #[feature(rustc_private)]
|
||||
|
|
|
|||
|
|
@ -24,11 +24,11 @@ declare_clippy_lint! {
|
|||
/// using absolute paths is the proper way of referencing items in one.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = std::f64::consts::PI;
|
||||
/// ```
|
||||
/// Use any of the below instead, or anything else:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::f64;
|
||||
/// use std::f64::consts;
|
||||
/// use std::f64::consts::PI;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::{trim_span, walk_span_to_context};
|
||||
use rustc_ast::ast::{Expr, ExprKind, LitKind, Pat, PatKind, RangeEnd, RangeLimits};
|
||||
use rustc_errors::Applicability;
|
||||
|
|
@ -17,11 +17,11 @@ declare_clippy_lint! {
|
|||
/// This (`'a'..'z'`) is almost certainly a typo meant to include all letters.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _ = 'a'..'z';
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _ = 'a'..='z';
|
||||
/// ```
|
||||
#[clippy::version = "1.68.0"]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_help;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use rustc_ast::ast::{FloatTy, LitFloatType, LitKind};
|
||||
use rustc_hir::{Expr, ExprKind};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
|
|
@ -24,12 +24,12 @@ declare_clippy_lint! {
|
|||
/// issue](https://github.com/rust-lang/rust/issues).
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = 3.14;
|
||||
/// let y = 1_f64 / x;
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = std::f32::consts::PI;
|
||||
/// let y = std::f64::consts::FRAC_1_PI;
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ declare_clippy_lint! {
|
|||
/// either `T` should be made `Send + Sync` or an `Rc` should be used instead of an `Arc`
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::cell::RefCell;
|
||||
/// # use std::sync::Arc;
|
||||
///
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ declare_clippy_lint! {
|
|||
/// An await is likely missing.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// async fn foo() {}
|
||||
///
|
||||
/// fn bar() {
|
||||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// async fn foo() {}
|
||||
///
|
||||
/// fn bar() {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
//! checks for attributes
|
||||
|
||||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::{span_lint, span_lint_and_help, span_lint_and_sugg, span_lint_and_then};
|
||||
use clippy_utils::is_from_proc_macro;
|
||||
use clippy_utils::macros::{is_panic, macro_backtrace};
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::{first_line_of_span, is_present_in_source, snippet_opt, without_block_comments};
|
||||
use if_chain::if_chain;
|
||||
use rustc_ast::token::{Token, TokenKind};
|
||||
|
|
@ -129,7 +129,7 @@ declare_clippy_lint! {
|
|||
/// a valid semver. Failing that, the contained information is useless.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[deprecated(since = "forever")]
|
||||
/// fn something_else() { /* ... */ }
|
||||
/// ```
|
||||
|
|
@ -156,14 +156,14 @@ declare_clippy_lint! {
|
|||
/// currently works for basic cases but is not perfect.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[allow(dead_code)]
|
||||
///
|
||||
/// fn not_quite_good_code() { }
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // Good (as inner attribute)
|
||||
/// #![allow(dead_code)]
|
||||
///
|
||||
|
|
@ -198,25 +198,25 @@ declare_clippy_lint! {
|
|||
/// Does not detect empty lines after doc attributes (e.g. `#[doc = ""]`).
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// Some doc comment with a blank line after it.
|
||||
///
|
||||
/// fn not_quite_good_code() { }
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// Good (no blank line)
|
||||
/// fn this_is_fine() { }
|
||||
/// ```
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // Good (convert to a regular comment)
|
||||
///
|
||||
/// fn this_is_fine_too() { }
|
||||
/// ```
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// //! Good (convert to a comment on an inner attribute)
|
||||
///
|
||||
/// fn this_is_fine_as_well() { }
|
||||
|
|
@ -236,12 +236,12 @@ declare_clippy_lint! {
|
|||
/// These lints should only be enabled on a lint-by-lint basis and with careful consideration.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #![deny(clippy::restriction)]
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #![deny(clippy::as_conversions)]
|
||||
/// ```
|
||||
#[clippy::version = "1.47.0"]
|
||||
|
|
@ -265,13 +265,13 @@ declare_clippy_lint! {
|
|||
/// [#3123](https://github.com/rust-lang/rust-clippy/pull/3123#issuecomment-422321765)
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
/// fn main() { }
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[rustfmt::skip]
|
||||
/// fn main() { }
|
||||
/// ```
|
||||
|
|
@ -290,13 +290,13 @@ declare_clippy_lint! {
|
|||
/// by the conditional compilation engine.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[cfg(linux)]
|
||||
/// fn conditional() { }
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # mod hidden {
|
||||
/// #[cfg(target_os = "linux")]
|
||||
/// fn conditional() { }
|
||||
|
|
@ -325,14 +325,14 @@ declare_clippy_lint! {
|
|||
/// ensure that others understand the reasoning
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #![feature(lint_reasons)]
|
||||
///
|
||||
/// #![allow(clippy::some_lint)]
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #![feature(lint_reasons)]
|
||||
///
|
||||
/// #![allow(clippy::some_lint, reason = "False positive rust-lang/rust-clippy#1002020")]
|
||||
|
|
@ -352,7 +352,7 @@ declare_clippy_lint! {
|
|||
/// panicking with the expected message, and not another unrelated panic.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn random() -> i32 { 0 }
|
||||
///
|
||||
/// #[should_panic]
|
||||
|
|
@ -363,7 +363,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn random() -> i32 { 0 }
|
||||
///
|
||||
/// #[should_panic = "attempt to divide by zero"]
|
||||
|
|
@ -386,13 +386,13 @@ declare_clippy_lint! {
|
|||
/// If there is only one condition, no need to wrap it into `any` or `all` combinators.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[cfg(any(unix))]
|
||||
/// pub struct Bar;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[cfg(unix)]
|
||||
/// pub struct Bar;
|
||||
/// ```
|
||||
|
|
@ -409,16 +409,16 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ### Why is this bad?
|
||||
/// Misspelling `feature` as `features` can be sometimes hard to spot. It
|
||||
/// may cause conditional compilation not work quitely.
|
||||
/// may cause conditional compilation not work quietly.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[cfg(features = "some-feature")]
|
||||
/// fn conditional() { }
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[cfg(feature = "some-feature")]
|
||||
/// fn conditional() { }
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
use clippy_config::types::DisallowedPath;
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::{match_def_path, paths};
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
|
|
@ -8,8 +9,6 @@ use rustc_middle::mir::CoroutineLayout;
|
|||
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
||||
use rustc_span::{sym, Span};
|
||||
|
||||
use crate::utils::conf::DisallowedPath;
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Checks for calls to await while holding a non-async-aware MutexGuard.
|
||||
|
|
@ -29,7 +28,7 @@ declare_clippy_lint! {
|
|||
/// to wrap the `.lock()` call in a block instead of explicitly dropping the guard.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::sync::Mutex;
|
||||
/// # async fn baz() {}
|
||||
/// async fn foo(x: &Mutex<u32>) {
|
||||
|
|
@ -47,7 +46,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::sync::Mutex;
|
||||
/// # async fn baz() {}
|
||||
/// async fn foo(x: &Mutex<u32>) {
|
||||
|
|
@ -87,7 +86,7 @@ declare_clippy_lint! {
|
|||
/// to wrap the `.borrow[_mut]()` call in a block instead of explicitly dropping the ref.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::cell::RefCell;
|
||||
/// # async fn baz() {}
|
||||
/// async fn foo(x: &RefCell<u32>) {
|
||||
|
|
@ -105,7 +104,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::cell::RefCell;
|
||||
/// # async fn baz() {}
|
||||
/// async fn foo(x: &RefCell<u32>) {
|
||||
|
|
@ -151,7 +150,7 @@ declare_clippy_lint! {
|
|||
/// ]
|
||||
/// ```
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # async fn baz() {}
|
||||
/// struct CustomLockType;
|
||||
/// struct OtherCustomLockType;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ declare_clippy_lint! {
|
|||
/// Style, using blocks in the condition makes it hard to read.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # fn somefunc() -> bool { true };
|
||||
/// if { true } { /* ... */ }
|
||||
///
|
||||
|
|
@ -29,7 +29,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # fn somefunc() -> bool { true };
|
||||
/// if true { /* ... */ }
|
||||
///
|
||||
|
|
|
|||
|
|
@ -18,13 +18,13 @@ declare_clippy_lint! {
|
|||
/// It is shorter to use the equivalent.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// assert_eq!("a".is_empty(), false);
|
||||
/// assert_ne!("a".is_empty(), true);
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// assert!(!"a".is_empty());
|
||||
/// ```
|
||||
#[clippy::version = "1.53.0"]
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ declare_clippy_lint! {
|
|||
/// See https://doc.rust-lang.org/std/primitive.bool.html#impl-From%3Cbool%3E
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let condition = false;
|
||||
/// if condition {
|
||||
/// 1_i64
|
||||
|
|
@ -30,12 +30,12 @@ declare_clippy_lint! {
|
|||
/// };
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let condition = false;
|
||||
/// i64::from(condition);
|
||||
/// ```
|
||||
/// or
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let condition = false;
|
||||
/// condition as i64;
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ### Known problems
|
||||
/// False negative on such code:
|
||||
/// ```
|
||||
/// ```no_run
|
||||
/// let x = &12;
|
||||
/// let addr_x = &x as *const _ as usize;
|
||||
/// let addr_y = &&*x as *const _ as usize; // assert ok now, and lint triggered.
|
||||
|
|
@ -28,14 +28,14 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let s = &String::new();
|
||||
///
|
||||
/// let a: &String = &* s;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let s = &String::new();
|
||||
/// let a: &String = s;
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -24,11 +24,11 @@ declare_clippy_lint! {
|
|||
/// [in certain cases](https://nnethercote.github.io/perf-book/standard-library-types.html#box).
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x: Box<String> = Box::new(Default::default());
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x: Box<String> = Box::default();
|
||||
/// ```
|
||||
#[clippy::version = "1.66.0"]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::sugg::Sugg;
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_hir::{Expr, ExprKind};
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::in_constant;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_opt;
|
||||
use clippy_utils::ty::is_isize_or_usize;
|
||||
use rustc_errors::Applicability;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source;
|
||||
use if_chain::if_chain;
|
||||
use rustc_ast::Mutability;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_with_context;
|
||||
use if_chain::if_chain;
|
||||
use rustc_errors::Applicability;
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ mod unnecessary_cast;
|
|||
mod utils;
|
||||
mod zero_ptr;
|
||||
|
||||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::is_hir_ty_cfg_dependant;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use rustc_hir::{Expr, ExprKind};
|
||||
use rustc_lint::{LateContext, LateLintPass, LintContext};
|
||||
use rustc_middle::lint::in_external_macro;
|
||||
|
|
@ -45,7 +45,7 @@ declare_clippy_lint! {
|
|||
/// those places in the code.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = u64::MAX;
|
||||
/// x as f64;
|
||||
/// ```
|
||||
|
|
@ -67,7 +67,7 @@ declare_clippy_lint! {
|
|||
/// as a one-time check to see where numerical wrapping can arise.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let y: i8 = -1;
|
||||
/// y as u128; // will return 18446744073709551615
|
||||
/// ```
|
||||
|
|
@ -90,13 +90,13 @@ declare_clippy_lint! {
|
|||
/// checks could be beneficial.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn as_u8(x: u64) -> u8 {
|
||||
/// x as u8
|
||||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```
|
||||
/// ```no_run
|
||||
/// fn as_u8(x: u64) -> u8 {
|
||||
/// if let Ok(x) = u8::try_from(x) {
|
||||
/// x
|
||||
|
|
@ -132,7 +132,7 @@ declare_clippy_lint! {
|
|||
/// example below.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// u32::MAX as i32; // will yield a value of `-1`
|
||||
/// ```
|
||||
#[clippy::version = "pre 1.29.0"]
|
||||
|
|
@ -155,7 +155,7 @@ declare_clippy_lint! {
|
|||
/// people reading the code to know that the conversion is lossless.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn as_u64(x: u8) -> u64 {
|
||||
/// x as u64
|
||||
/// }
|
||||
|
|
@ -163,7 +163,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// Using `::from` would look like this:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn as_u64(x: u8) -> u64 {
|
||||
/// u64::from(x)
|
||||
/// }
|
||||
|
|
@ -191,14 +191,14 @@ declare_clippy_lint! {
|
|||
/// intermediate references, raw pointers and trait objects may or may not work.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _ = 2i32 as i32;
|
||||
/// let _ = 0.5 as f32;
|
||||
/// ```
|
||||
///
|
||||
/// Better:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _ = 2_i32;
|
||||
/// let _ = 0.5_f32;
|
||||
/// ```
|
||||
|
|
@ -223,7 +223,7 @@ declare_clippy_lint! {
|
|||
/// u64-> u8 -> u16 can be fine. Miri is able to do a more in-depth analysis.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _ = (&1u8 as *const u8) as *const u16;
|
||||
/// let _ = (&mut 1u8 as *mut u8) as *mut u16;
|
||||
///
|
||||
|
|
@ -249,13 +249,13 @@ declare_clippy_lint! {
|
|||
/// Casting to isize also doesn't make sense since there are no signed addresses.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn fun() -> i32 { 1 }
|
||||
/// let _ = fun as i64;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # fn fun() -> i32 { 1 }
|
||||
/// let _ = fun as usize;
|
||||
/// ```
|
||||
|
|
@ -276,7 +276,7 @@ declare_clippy_lint! {
|
|||
/// a comment) to perform the truncation.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn fn1() -> i16 {
|
||||
/// 1
|
||||
/// };
|
||||
|
|
@ -284,7 +284,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // Cast to usize first, then comment with the reason for the truncation
|
||||
/// fn fn1() -> i16 {
|
||||
/// 1
|
||||
|
|
@ -310,7 +310,7 @@ declare_clippy_lint! {
|
|||
/// pointer casts in your code.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // fn1 is cast as `usize`
|
||||
/// fn fn1() -> u16 {
|
||||
/// 1
|
||||
|
|
@ -319,7 +319,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // maybe you intended to call the function?
|
||||
/// fn fn2() -> u16 {
|
||||
/// 1
|
||||
|
|
@ -378,14 +378,14 @@ declare_clippy_lint! {
|
|||
/// it cannot accidentally change the pointer's mutability nor cast the pointer to other types like `usize`.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let ptr: *const u32 = &42_u32;
|
||||
/// let mut_ptr: *mut u32 = &mut 42_u32;
|
||||
/// let _ = ptr as *const i32;
|
||||
/// let _ = mut_ptr as *mut i32;
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let ptr: *const u32 = &42_u32;
|
||||
/// let mut_ptr: *mut u32 = &mut 42_u32;
|
||||
/// let _ = ptr.cast::<i32>();
|
||||
|
|
@ -408,13 +408,13 @@ declare_clippy_lint! {
|
|||
/// type.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let ptr: *const u32 = &42_u32;
|
||||
/// let mut_ptr = ptr as *mut u32;
|
||||
/// let ptr = mut_ptr as *const u32;
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let ptr: *const u32 = &42_u32;
|
||||
/// let mut_ptr = ptr.cast_mut();
|
||||
/// let ptr = mut_ptr.cast_const();
|
||||
|
|
@ -434,7 +434,7 @@ declare_clippy_lint! {
|
|||
/// The resulting integral value will not match the value of the variant it came from.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum E { X = 256 };
|
||||
/// let _ = E::X as u8;
|
||||
/// ```
|
||||
|
|
@ -457,7 +457,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ### Example
|
||||
/// // Missing data
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a = [1_i32, 2, 3, 4];
|
||||
/// let p = &a as *const [i32] as *const [u8];
|
||||
/// unsafe {
|
||||
|
|
@ -465,7 +465,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// // Undefined Behavior (note: also potential alignment issues)
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a = [1_u8, 2, 3, 4];
|
||||
/// let p = &a as *const [u8] as *const [u32];
|
||||
/// unsafe {
|
||||
|
|
@ -473,7 +473,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Instead use `ptr::slice_from_raw_parts` to construct a slice from a data pointer and the correct length
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a = [1_i32, 2, 3, 4];
|
||||
/// let old_ptr = &a as *const [i32];
|
||||
/// // The data pointer is cast to a pointer to the target `u8` not `[u8]`
|
||||
|
|
@ -497,7 +497,7 @@ declare_clippy_lint! {
|
|||
/// The cast is easily confused with casting a c-like enum value to an integer.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum E { X(i32) };
|
||||
/// let _ = E::X as usize;
|
||||
/// ```
|
||||
|
|
@ -515,12 +515,12 @@ declare_clippy_lint! {
|
|||
/// The `unsigned_abs()` method avoids panic when called on the MIN value.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x: i32 = -42;
|
||||
/// let y: u32 = x.abs() as u32;
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x: i32 = -42;
|
||||
/// let y: u32 = x.unsigned_abs();
|
||||
/// ```
|
||||
|
|
@ -541,13 +541,13 @@ declare_clippy_lint! {
|
|||
/// The lint is allowed by default as using `_` is less wordy than always specifying the type.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo(n: usize) {}
|
||||
/// let n: u16 = 256;
|
||||
/// foo(n as _);
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo(n: usize) {}
|
||||
/// let n: u16 = 256;
|
||||
/// foo(n as usize);
|
||||
|
|
@ -570,7 +570,7 @@ declare_clippy_lint! {
|
|||
/// Read the `ptr::addr_of` docs for more information.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let val = 1;
|
||||
/// let p = &val as *const i32;
|
||||
///
|
||||
|
|
@ -578,7 +578,7 @@ declare_clippy_lint! {
|
|||
/// let p_mut = &mut val_mut as *mut i32;
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let val = 1;
|
||||
/// let p = std::ptr::addr_of!(val);
|
||||
///
|
||||
|
|
@ -627,13 +627,13 @@ declare_clippy_lint! {
|
|||
/// mutability is used, making it unlikely that having it as a mutable pointer is correct.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let mut vec = Vec::<u8>::with_capacity(1);
|
||||
/// let ptr = vec.as_ptr() as *mut u8;
|
||||
/// unsafe { ptr.write(4) }; // UNDEFINED BEHAVIOUR
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let mut vec = Vec::<u8>::with_capacity(1);
|
||||
/// let ptr = vec.as_mut_ptr();
|
||||
/// unsafe { ptr.write(4) };
|
||||
|
|
@ -675,12 +675,12 @@ declare_clippy_lint! {
|
|||
/// {`std`, `core`}`::ptr::`{`null`, `null_mut`}.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a = 0 as *const u32;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a = std::ptr::null::<u32>();
|
||||
/// ```
|
||||
#[clippy::version = "pre 1.29.0"]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_with_applicability;
|
||||
use clippy_utils::sugg::Sugg;
|
||||
use rustc_errors::Applicability;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::msrvs::{Msrv, POINTER_CAST_CONSTNESS};
|
||||
use clippy_utils::sugg::Sugg;
|
||||
use if_chain::if_chain;
|
||||
use rustc_errors::Applicability;
|
||||
|
|
@ -18,7 +18,7 @@ pub(super) fn check<'tcx>(
|
|||
msrv: &Msrv,
|
||||
) {
|
||||
if_chain! {
|
||||
if msrv.meets(POINTER_CAST_CONSTNESS);
|
||||
if msrv.meets(msrvs::POINTER_CAST_CONSTNESS);
|
||||
if let ty::RawPtr(TypeAndMut { mutbl: from_mutbl, ty: from_ty }) = cast_from.kind();
|
||||
if let ty::RawPtr(TypeAndMut { mutbl: to_mutbl, ty: to_ty }) = cast_to.kind();
|
||||
if matches!((from_mutbl, to_mutbl),
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
//! lint on manually implemented checked conversions that could be transformed into `try_from`
|
||||
|
||||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_with_applicability;
|
||||
use clippy_utils::{in_constant, is_integer_literal, SpanlessEq};
|
||||
use if_chain::if_chain;
|
||||
|
|
@ -19,13 +19,13 @@ declare_clippy_lint! {
|
|||
/// Reduces the readability of statements & is error prone.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let foo: u32 = 5;
|
||||
/// foo <= i32::MAX as u32;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let foo = 1;
|
||||
/// # #[allow(unused)]
|
||||
/// i32::try_from(foo).is_ok();
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ declare_clippy_lint! {
|
|||
/// makes code look more complex than it really is.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let (x, y) = (true, true);
|
||||
/// if x {
|
||||
/// if y {
|
||||
|
|
@ -42,7 +42,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let (x, y) = (true, true);
|
||||
/// if x && y {
|
||||
/// // …
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ declare_clippy_lint! {
|
|||
/// instead.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let samples = vec![3, 1, 2];
|
||||
/// let mut sorted_samples = samples.clone();
|
||||
/// sorted_samples.sort();
|
||||
|
|
@ -29,7 +29,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let samples = vec![3, 1, 2];
|
||||
/// let mut sorted_samples = samples.clone();
|
||||
/// sorted_samples.sort();
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ declare_clippy_lint! {
|
|||
/// https://doc.rust-lang.org/reference/macros-by-example.html#hygiene
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[macro_export]
|
||||
/// macro_rules! print_message {
|
||||
/// () => {
|
||||
|
|
@ -28,7 +28,7 @@ declare_clippy_lint! {
|
|||
/// pub const MESSAGE: &str = "Hello!";
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[macro_export]
|
||||
/// macro_rules! print_message {
|
||||
/// () => {
|
||||
|
|
|
|||
|
|
@ -6,8 +6,6 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
|
|||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::almost_standard_lint_formulation::ALMOST_STANDARD_LINT_FORMULATION_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::clippy_lints_internal::CLIPPY_LINTS_INTERNAL_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::collapsible_calls::COLLAPSIBLE_SPAN_LINT_CALLS_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::compiler_lint_functions::COMPILER_LINT_FUNCTIONS_INFO,
|
||||
|
|
@ -30,6 +28,8 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
|
|||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::lint_without_lint_pass::MISSING_CLIPPY_VERSION_ATTRIBUTE_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::metadata_collector::METADATA_COLLECTOR_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::msrv_attr_impl::MISSING_MSRV_ATTR_IMPL_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::outer_expn_data_pass::OUTER_EXPN_EXPN_DATA_INFO,
|
||||
|
|
@ -37,6 +37,8 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
|
|||
crate::utils::internal_lints::produce_ice::PRODUCE_ICE_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::unnecessary_def_path::UNNECESSARY_DEF_PATH_INFO,
|
||||
#[cfg(feature = "internal")]
|
||||
crate::utils::internal_lints::unsorted_clippy_utils_paths::UNSORTED_CLIPPY_UTILS_PATHS_INFO,
|
||||
crate::absolute_paths::ABSOLUTE_PATHS_INFO,
|
||||
crate::allow_attributes::ALLOW_ATTRIBUTES_INFO,
|
||||
crate::almost_complete_range::ALMOST_COMPLETE_RANGE_INFO,
|
||||
|
|
@ -272,6 +274,7 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
|
|||
crate::loops::NEVER_LOOP_INFO,
|
||||
crate::loops::SAME_ITEM_PUSH_INFO,
|
||||
crate::loops::SINGLE_ELEMENT_LOOP_INFO,
|
||||
crate::loops::UNUSED_ENUMERATE_INDEX_INFO,
|
||||
crate::loops::WHILE_IMMUTABLE_CONDITION_INFO,
|
||||
crate::loops::WHILE_LET_LOOP_INFO,
|
||||
crate::loops::WHILE_LET_ON_ITERATOR_INFO,
|
||||
|
|
@ -428,6 +431,7 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
|
|||
crate::methods::TYPE_ID_ON_BOX_INFO,
|
||||
crate::methods::UNINIT_ASSUMED_INIT_INFO,
|
||||
crate::methods::UNIT_HASH_INFO,
|
||||
crate::methods::UNNECESSARY_FALLIBLE_CONVERSIONS_INFO,
|
||||
crate::methods::UNNECESSARY_FILTER_MAP_INFO,
|
||||
crate::methods::UNNECESSARY_FIND_MAP_INFO,
|
||||
crate::methods::UNNECESSARY_FOLD_INFO,
|
||||
|
|
@ -441,6 +445,7 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
|
|||
crate::methods::USELESS_ASREF_INFO,
|
||||
crate::methods::VEC_RESIZE_TO_ZERO_INFO,
|
||||
crate::methods::VERBOSE_FILE_READS_INFO,
|
||||
crate::methods::WAKER_CLONE_WAKE_INFO,
|
||||
crate::methods::WRONG_SELF_CONVENTION_INFO,
|
||||
crate::methods::ZST_OFFSET_INFO,
|
||||
crate::min_ident_chars::MIN_IDENT_CHARS_INFO,
|
||||
|
|
|
|||
|
|
@ -23,12 +23,12 @@ declare_clippy_lint! {
|
|||
/// generic `Default`.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let s: String = Default::default();
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let s = String::default();
|
||||
/// ```
|
||||
#[clippy::version = "pre 1.29.0"]
|
||||
|
|
@ -49,7 +49,7 @@ declare_clippy_lint! {
|
|||
/// Assignments to patterns that are of tuple type are not linted.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```
|
||||
/// ```no_run
|
||||
/// # #[derive(Default)]
|
||||
/// # struct A { i: i32 }
|
||||
/// let mut a: A = Default::default();
|
||||
|
|
@ -57,7 +57,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```
|
||||
/// ```no_run
|
||||
/// # #[derive(Default)]
|
||||
/// # struct A { i: i32 }
|
||||
/// let a = A {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ declare_clippy_lint! {
|
|||
/// This adds code complexity and an unnecessary function call.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::marker::PhantomData;
|
||||
/// #[derive(Default)]
|
||||
/// struct S<T> {
|
||||
|
|
@ -29,7 +29,7 @@ declare_clippy_lint! {
|
|||
/// };
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::marker::PhantomData;
|
||||
/// struct S<T> {
|
||||
/// _marker: PhantomData<T>
|
||||
|
|
|
|||
|
|
@ -14,12 +14,12 @@ declare_clippy_lint! {
|
|||
/// ### Why is this bad?
|
||||
/// `std::iter::empty()` is the more idiomatic way.
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _ = std::iter::Empty::<usize>::default();
|
||||
/// let iter: std::iter::Empty<usize> = std::iter::Empty::default();
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _ = std::iter::empty::<usize>();
|
||||
/// let iter: std::iter::Empty<usize> = std::iter::empty();
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -31,13 +31,13 @@ declare_clippy_lint! {
|
|||
/// This lint can only be allowed at the function level or above.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let i = 10;
|
||||
/// let f = 1.23;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let i = 10i32;
|
||||
/// let f = 1.23f64;
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ declare_clippy_lint! {
|
|||
/// specified layout. These cases may lead to undefined behavior in unsafe blocks.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// union Foo {
|
||||
/// a: i32,
|
||||
/// b: u32,
|
||||
|
|
@ -30,7 +30,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[repr(C)]
|
||||
/// union Foo {
|
||||
/// a: i32,
|
||||
|
|
|
|||
|
|
@ -29,14 +29,14 @@ declare_clippy_lint! {
|
|||
/// when not part of a method chain.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::ops::Deref;
|
||||
/// let a: &mut String = &mut String::from("foo");
|
||||
/// let b: &str = a.deref();
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a: &mut String = &mut String::from("foo");
|
||||
/// let b = &*a;
|
||||
/// ```
|
||||
|
|
@ -68,7 +68,7 @@ declare_clippy_lint! {
|
|||
/// in such a case can change the semantics of the code.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn fun(_a: &i32) {}
|
||||
///
|
||||
/// let x: &i32 = &&&&&&5;
|
||||
|
|
@ -76,7 +76,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # fn fun(_a: &i32) {}
|
||||
/// let x: &i32 = &5;
|
||||
/// fun(x);
|
||||
|
|
@ -95,7 +95,7 @@ declare_clippy_lint! {
|
|||
/// The address-of operator at the use site is clearer about the need for a reference.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = Some("");
|
||||
/// if let Some(ref x) = x {
|
||||
/// // use `x` here
|
||||
|
|
@ -103,7 +103,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = Some("");
|
||||
/// if let Some(x) = x {
|
||||
/// // use `&x` here
|
||||
|
|
@ -123,12 +123,12 @@ declare_clippy_lint! {
|
|||
/// This unnecessarily complicates the code.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = String::new();
|
||||
/// let y: &str = &*x;
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x = String::new();
|
||||
/// let y: &str = &x;
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::indent_of;
|
||||
use clippy_utils::{is_default_equivalent, peel_blocks};
|
||||
use rustc_errors::Applicability;
|
||||
|
|
@ -21,7 +21,7 @@ declare_clippy_lint! {
|
|||
/// It is less concise.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Foo {
|
||||
/// bar: bool
|
||||
/// }
|
||||
|
|
@ -36,7 +36,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[derive(Default)]
|
||||
/// struct Foo {
|
||||
/// bar: bool
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ declare_clippy_lint! {
|
|||
/// `Eq` themselves.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[derive(PartialEq)]
|
||||
/// struct Foo {
|
||||
/// i_am_eq: i32,
|
||||
|
|
@ -181,7 +181,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[derive(PartialEq, Eq)]
|
||||
/// struct Foo {
|
||||
/// i_am_eq: i32,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
use clippy_config::types::DisallowedPath;
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::macros::macro_backtrace;
|
||||
use rustc_ast::Attribute;
|
||||
|
|
@ -8,8 +9,6 @@ use rustc_lint::{LateContext, LateLintPass};
|
|||
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
||||
use rustc_span::{ExpnId, Span};
|
||||
|
||||
use crate::utils::conf;
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Denies the configured macros in clippy.toml
|
||||
|
|
@ -35,7 +34,7 @@ declare_clippy_lint! {
|
|||
/// { path = "serde::Serialize", reason = "no serializing" },
|
||||
/// ]
|
||||
/// ```
|
||||
/// ```
|
||||
/// ```no_run
|
||||
/// use serde::Serialize;
|
||||
///
|
||||
/// // Example code where clippy issues a warning
|
||||
|
|
@ -55,13 +54,13 @@ declare_clippy_lint! {
|
|||
}
|
||||
|
||||
pub struct DisallowedMacros {
|
||||
conf_disallowed: Vec<conf::DisallowedPath>,
|
||||
conf_disallowed: Vec<DisallowedPath>,
|
||||
disallowed: DefIdMap<usize>,
|
||||
seen: FxHashSet<ExpnId>,
|
||||
}
|
||||
|
||||
impl DisallowedMacros {
|
||||
pub fn new(conf_disallowed: Vec<conf::DisallowedPath>) -> Self {
|
||||
pub fn new(conf_disallowed: Vec<DisallowedPath>) -> Self {
|
||||
Self {
|
||||
conf_disallowed,
|
||||
disallowed: DefIdMap::default(),
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
use clippy_config::types::DisallowedPath;
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::{fn_def_id, get_parent_expr, path_def_id};
|
||||
|
||||
use rustc_hir::def_id::DefIdMap;
|
||||
use rustc_hir::{Expr, ExprKind};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
||||
|
||||
use crate::utils::conf;
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Denies the configured methods and functions in clippy.toml
|
||||
|
|
@ -59,12 +57,12 @@ declare_clippy_lint! {
|
|||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct DisallowedMethods {
|
||||
conf_disallowed: Vec<conf::DisallowedPath>,
|
||||
conf_disallowed: Vec<DisallowedPath>,
|
||||
disallowed: DefIdMap<usize>,
|
||||
}
|
||||
|
||||
impl DisallowedMethods {
|
||||
pub fn new(conf_disallowed: Vec<conf::DisallowedPath>) -> Self {
|
||||
pub fn new(conf_disallowed: Vec<DisallowedPath>) -> Self {
|
||||
Self {
|
||||
conf_disallowed,
|
||||
disallowed: DefIdMap::default(),
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ declare_clippy_lint! {
|
|||
/// avoided.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let foo = 3.14;
|
||||
/// ```
|
||||
#[clippy::version = "pre 1.29.0"]
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ declare_clippy_lint! {
|
|||
/// [`non_ascii_idents`]: https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html#non-ascii-idents
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // Assuming that `clippy.toml` contains the following line:
|
||||
/// // allowed-scripts = ["Latin", "Cyrillic"]
|
||||
/// let counter = 10; // OK, latin is allowed.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::types::DisallowedPath;
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_hir::def::Res;
|
||||
use rustc_hir::def_id::DefId;
|
||||
|
|
@ -8,8 +8,6 @@ use rustc_lint::{LateContext, LateLintPass};
|
|||
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
||||
use rustc_span::Span;
|
||||
|
||||
use crate::utils::conf;
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Denies the configured types in clippy.toml.
|
||||
|
|
@ -50,15 +48,16 @@ declare_clippy_lint! {
|
|||
style,
|
||||
"use of disallowed types"
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct DisallowedTypes {
|
||||
conf_disallowed: Vec<conf::DisallowedPath>,
|
||||
conf_disallowed: Vec<DisallowedPath>,
|
||||
def_ids: FxHashMap<DefId, usize>,
|
||||
prim_tys: FxHashMap<PrimTy, usize>,
|
||||
}
|
||||
|
||||
impl DisallowedTypes {
|
||||
pub fn new(conf_disallowed: Vec<conf::DisallowedPath>) -> Self {
|
||||
pub fn new(conf_disallowed: Vec<DisallowedPath>) -> Self {
|
||||
Self {
|
||||
conf_disallowed,
|
||||
def_ids: FxHashMap::default(),
|
||||
|
|
@ -123,7 +122,7 @@ impl<'tcx> LateLintPass<'tcx> for DisallowedTypes {
|
|||
}
|
||||
}
|
||||
|
||||
fn emit(cx: &LateContext<'_>, name: &str, span: Span, conf: &conf::DisallowedPath) {
|
||||
fn emit(cx: &LateContext<'_>, name: &str, span: Span, conf: &DisallowedPath) {
|
||||
span_lint_and_then(
|
||||
cx,
|
||||
DISALLOWED_TYPES,
|
||||
|
|
|
|||
|
|
@ -58,14 +58,14 @@ declare_clippy_lint! {
|
|||
/// would fail.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// Do something with the foo_bar parameter. See also
|
||||
/// /// that::other::module::foo.
|
||||
/// // ^ `foo_bar` and `that::other::module::foo` should be ticked.
|
||||
/// fn doit(foo_bar: usize) {}
|
||||
/// ```
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // Link text with `[]` brackets should be written as following:
|
||||
/// /// Consume the array and return the inner
|
||||
/// /// [`SmallVec<[T; INLINE_CAPACITY]>`][SmallVec].
|
||||
|
|
@ -88,7 +88,7 @@ declare_clippy_lint! {
|
|||
/// preconditions, so that users can be sure they are using them safely.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
///# type Universe = ();
|
||||
/// /// This function should really be documented
|
||||
/// pub unsafe fn start_apocalypse(u: &mut Universe) {
|
||||
|
|
@ -98,7 +98,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// At least write a line about safety:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
///# type Universe = ();
|
||||
/// /// # Safety
|
||||
/// ///
|
||||
|
|
@ -126,7 +126,7 @@ declare_clippy_lint! {
|
|||
/// Since the following function returns a `Result` it has an `# Errors` section in
|
||||
/// its doc comment:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
///# use std::io;
|
||||
/// /// # Errors
|
||||
/// ///
|
||||
|
|
@ -155,7 +155,7 @@ declare_clippy_lint! {
|
|||
/// Since the following function may panic it has a `# Panics` section in
|
||||
/// its doc comment:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// # Panics
|
||||
/// ///
|
||||
/// /// Will panic if y is 0
|
||||
|
|
@ -182,7 +182,7 @@ declare_clippy_lint! {
|
|||
/// if the `fn main()` is left implicit.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// An example of a doctest with a `main()` function
|
||||
/// ///
|
||||
/// /// # Examples
|
||||
|
|
@ -210,12 +210,12 @@ declare_clippy_lint! {
|
|||
/// It is likely a typo when defining an intra-doc link
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// See also: ['foo']
|
||||
/// fn bar() {}
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// See also: [`foo`]
|
||||
/// fn bar() {}
|
||||
/// ```
|
||||
|
|
@ -235,7 +235,7 @@ declare_clippy_lint! {
|
|||
/// need to describe safety preconditions that users are required to uphold.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
///# type Universe = ();
|
||||
/// /// # Safety
|
||||
/// ///
|
||||
|
|
@ -248,7 +248,7 @@ declare_clippy_lint! {
|
|||
/// The function is safe, so there shouldn't be any preconditions
|
||||
/// that have to be explained for safety reasons.
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
///# type Universe = ();
|
||||
/// /// This function should really be documented
|
||||
/// pub fn start_apocalypse(u: &mut Universe) {
|
||||
|
|
@ -756,11 +756,12 @@ fn check_text(cx: &LateContext<'_>, valid_idents: &FxHashSet<String>, text: &str
|
|||
}
|
||||
|
||||
fn check_word(cx: &LateContext<'_>, word: &str, span: Span) {
|
||||
/// Checks if a string is camel-case, i.e., contains at least two uppercase
|
||||
/// letters (`Clippy` is ok) and one lower-case letter (`NASA` is ok).
|
||||
/// Checks if a string is upper-camel-case, i.e., starts with an uppercase and
|
||||
/// contains at least two uppercase letters (`Clippy` is ok) and one lower-case
|
||||
/// letter (`NASA` is ok).
|
||||
/// Plurals are also excluded (`IDs` is ok).
|
||||
fn is_camel_case(s: &str) -> bool {
|
||||
if s.starts_with(|c: char| c.is_ascii_digit()) {
|
||||
if s.starts_with(|c: char| c.is_ascii_digit() | c.is_ascii_lowercase()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ declare_clippy_lint! {
|
|||
/// mistake.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn simple_double_parens() -> i32 {
|
||||
/// ((0))
|
||||
/// }
|
||||
|
|
@ -22,7 +22,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn simple_no_parens() -> i32 {
|
||||
/// 0
|
||||
/// }
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ declare_clippy_lint! {
|
|||
/// have been intended.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Foo;
|
||||
/// let x = Foo;
|
||||
/// std::mem::drop(x);
|
||||
|
|
@ -36,7 +36,7 @@ declare_clippy_lint! {
|
|||
/// have been intended.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Foo;
|
||||
/// let x = Foo;
|
||||
/// std::mem::forget(x);
|
||||
|
|
@ -57,7 +57,7 @@ declare_clippy_lint! {
|
|||
/// destructor, possibly causing leaks.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::mem;
|
||||
/// # use std::rc::Rc;
|
||||
/// mem::forget(Rc::new(55))
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ declare_clippy_lint! {
|
|||
/// Some coding guidelines require this (e.g., MISRA-C:2004 Rule 14.10).
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # fn a() {}
|
||||
/// # fn b() {}
|
||||
/// # let x: i32 = 1;
|
||||
|
|
@ -28,7 +28,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// Use instead:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # fn a() {}
|
||||
/// # fn b() {}
|
||||
/// # let x: i32 = 1;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ declare_clippy_lint! {
|
|||
/// destructured, which might be the intention behind adding the implementation as a marker.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct S;
|
||||
///
|
||||
/// impl Drop for S {
|
||||
|
|
@ -24,7 +24,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct S;
|
||||
/// ```
|
||||
#[clippy::version = "1.62.0"]
|
||||
|
|
|
|||
|
|
@ -23,12 +23,12 @@ declare_clippy_lint! {
|
|||
///
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum Test {}
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #![feature(never_type)]
|
||||
///
|
||||
/// struct Test(!);
|
||||
|
|
|
|||
|
|
@ -15,11 +15,11 @@ declare_clippy_lint! {
|
|||
/// Empty brackets after a struct declaration can be omitted.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Cookie {}
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Cookie;
|
||||
/// ```
|
||||
#[clippy::version = "1.62.0"]
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ### Known problems
|
||||
/// The suggestion may have type inference errors in some cases. e.g.
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let mut map = std::collections::HashMap::new();
|
||||
/// let _ = if !map.contains_key(&0) {
|
||||
/// map.insert(0, 0)
|
||||
|
|
@ -33,7 +33,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::collections::HashMap;
|
||||
/// # let mut map = HashMap::new();
|
||||
/// # let k = 1;
|
||||
|
|
@ -43,7 +43,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::collections::HashMap;
|
||||
/// # let mut map = HashMap::new();
|
||||
/// # let k = 1;
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ declare_clippy_lint! {
|
|||
/// architectures, but works fine on 64 bit.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # #[cfg(target_pointer_width = "64")]
|
||||
/// #[repr(usize)]
|
||||
/// enum NonPortable {
|
||||
|
|
|
|||
|
|
@ -28,12 +28,12 @@ declare_clippy_lint! {
|
|||
/// into something.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo(x: Box<u32>) {}
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo(x: u32) {}
|
||||
/// ```
|
||||
#[clippy::version = "pre 1.29.0"]
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ declare_clippy_lint! {
|
|||
/// readability and API.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct S {
|
||||
/// is_pending: bool,
|
||||
/// is_processing: bool,
|
||||
|
|
@ -31,7 +31,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum S {
|
||||
/// Pending,
|
||||
/// Processing,
|
||||
|
|
|
|||
|
|
@ -17,14 +17,14 @@ declare_clippy_lint! {
|
|||
/// disable them by default.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum Foo {
|
||||
/// Bar,
|
||||
/// Baz
|
||||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[non_exhaustive]
|
||||
/// enum Foo {
|
||||
/// Bar,
|
||||
|
|
@ -47,14 +47,14 @@ declare_clippy_lint! {
|
|||
/// disable them by default.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Foo {
|
||||
/// bar: u8,
|
||||
/// baz: String,
|
||||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[non_exhaustive]
|
||||
/// struct Foo {
|
||||
/// bar: u8,
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ declare_clippy_lint! {
|
|||
/// the main function.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```
|
||||
/// ```no_run
|
||||
/// std::process::exit(0)
|
||||
/// ```
|
||||
///
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ declare_clippy_lint! {
|
|||
/// Using `(e)println! is clearer and more concise
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::io::Write;
|
||||
/// # let bar = "furchtbar";
|
||||
/// writeln!(&mut std::io::stderr(), "foo: {:?}", bar).unwrap();
|
||||
|
|
@ -27,7 +27,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::io::Write;
|
||||
/// # let bar = "furchtbar";
|
||||
/// eprintln!("foo: {:?}", bar);
|
||||
|
|
|
|||
|
|
@ -23,13 +23,13 @@ declare_clippy_lint! {
|
|||
/// requires using a turbofish, which serves no purpose but to satisfy the compiler.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn unused_ty<T>(x: u8) {
|
||||
/// // ..
|
||||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn no_unused_ty(x: u8) {
|
||||
/// // ..
|
||||
/// }
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ declare_clippy_lint! {
|
|||
/// `TryFrom` should be used if there's a possibility of failure.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Foo(i32);
|
||||
///
|
||||
/// impl From<String> for Foo {
|
||||
|
|
@ -28,7 +28,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Foo(i32);
|
||||
///
|
||||
/// impl TryFrom<String> for Foo {
|
||||
|
|
|
|||
|
|
@ -18,13 +18,13 @@ declare_clippy_lint! {
|
|||
/// Rust will truncate the literal silently.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let v: f32 = 0.123_456_789_9;
|
||||
/// println!("{}", v); // 0.123_456_789
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let v: f64 = 0.123_456_789_9;
|
||||
/// println!("{}", v); // 0.123_456_789_9
|
||||
/// ```
|
||||
|
|
@ -44,12 +44,12 @@ declare_clippy_lint! {
|
|||
/// conversion to a float.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _: f32 = 16_777_217.0; // 16_777_216.0
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let _: f32 = 16_777_216.0;
|
||||
/// let _: f64 = 16_777_217.0;
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ declare_clippy_lint! {
|
|||
/// Negatively impacts accuracy.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a = 3f32;
|
||||
/// let _ = a.powf(1.0 / 3.0);
|
||||
/// let _ = (1.0 + a).ln();
|
||||
|
|
@ -35,7 +35,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let a = 3f32;
|
||||
/// let _ = a.cbrt();
|
||||
/// let _ = a.ln_1p();
|
||||
|
|
@ -57,7 +57,7 @@ declare_clippy_lint! {
|
|||
/// Negatively impacts accuracy and performance.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::f32::consts::E;
|
||||
///
|
||||
/// let a = 3f32;
|
||||
|
|
@ -83,7 +83,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// is better expressed as
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::f32::consts::E;
|
||||
///
|
||||
/// let a = 3f32;
|
||||
|
|
@ -323,9 +323,9 @@ fn check_powi(cx: &LateContext<'_>, expr: &Expr<'_>, receiver: &Expr<'_>, args:
|
|||
let maybe_neg_sugg = |expr, hir_id| {
|
||||
let sugg = Sugg::hir(cx, expr, "..");
|
||||
if matches!(op, BinOpKind::Sub) && hir_id == rhs.hir_id {
|
||||
format!("-{}", sugg.maybe_par())
|
||||
-sugg
|
||||
} else {
|
||||
sugg.to_string()
|
||||
sugg
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -470,25 +470,13 @@ fn check_mul_add(cx: &LateContext<'_>, expr: &Expr<'_>) {
|
|||
|
||||
let maybe_neg_sugg = |expr| {
|
||||
let sugg = Sugg::hir(cx, expr, "..");
|
||||
if let BinOpKind::Sub = op {
|
||||
format!("-{sugg}")
|
||||
} else {
|
||||
sugg.to_string()
|
||||
}
|
||||
if let BinOpKind::Sub = op { -sugg } else { sugg }
|
||||
};
|
||||
|
||||
let (recv, arg1, arg2) = if let Some((inner_lhs, inner_rhs)) = is_float_mul_expr(cx, lhs) {
|
||||
(
|
||||
inner_lhs,
|
||||
Sugg::hir(cx, inner_rhs, "..").to_string(),
|
||||
maybe_neg_sugg(rhs),
|
||||
)
|
||||
(inner_lhs, Sugg::hir(cx, inner_rhs, ".."), maybe_neg_sugg(rhs))
|
||||
} else if let Some((inner_lhs, inner_rhs)) = is_float_mul_expr(cx, rhs) {
|
||||
(
|
||||
inner_lhs,
|
||||
maybe_neg_sugg(inner_rhs),
|
||||
Sugg::hir(cx, lhs, "..").to_string(),
|
||||
)
|
||||
(inner_lhs, maybe_neg_sugg(inner_rhs), Sugg::hir(cx, lhs, ".."))
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -23,13 +23,13 @@ declare_clippy_lint! {
|
|||
/// if `foo: &str`.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let foo = "foo";
|
||||
/// format!("{}", foo);
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let foo = "foo";
|
||||
/// foo.to_owned();
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
use arrayvec::ArrayVec;
|
||||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then};
|
||||
use clippy_utils::is_diag_trait_item;
|
||||
use clippy_utils::macros::{
|
||||
find_format_arg_expr, find_format_args, format_arg_removal_span, format_placeholder_format_span, is_assert_macro,
|
||||
is_format_macro, is_panic, root_macro_call, root_macro_call_first_node, FormatParamUsage,
|
||||
};
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_opt;
|
||||
use clippy_utils::ty::{implements_trait, is_type_lang_item};
|
||||
use if_chain::if_chain;
|
||||
|
|
@ -35,12 +35,12 @@ declare_clippy_lint! {
|
|||
/// The recommended code is both shorter and avoids a temporary allocation.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::panic::Location;
|
||||
/// println!("error: {}", format!("something failed at {}", Location::caller()));
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::panic::Location;
|
||||
/// println!("error: something failed at {}", Location::caller());
|
||||
/// ```
|
||||
|
|
@ -61,12 +61,12 @@ declare_clippy_lint! {
|
|||
/// unnecessary.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::panic::Location;
|
||||
/// println!("error: something failed at {}", Location::caller().to_string());
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::panic::Location;
|
||||
/// println!("error: something failed at {}", Location::caller());
|
||||
/// ```
|
||||
|
|
@ -87,7 +87,7 @@ declare_clippy_lint! {
|
|||
/// The inlined syntax, where allowed, is simpler.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let var = 42;
|
||||
/// # let width = 1;
|
||||
/// # let prec = 2;
|
||||
|
|
@ -98,7 +98,7 @@ declare_clippy_lint! {
|
|||
/// format!("{:.*}", prec, var);
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let var = 42;
|
||||
/// # let width = 1;
|
||||
/// # let prec = 2;
|
||||
|
|
@ -111,12 +111,12 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// If allow-mixed-uninlined-format-args is set to false in clippy.toml,
|
||||
/// the following code will also trigger the lint:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let var = 42;
|
||||
/// format!("{} {}", var, 1+2);
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let var = 42;
|
||||
/// format!("{var} {}", 1+2);
|
||||
/// ```
|
||||
|
|
@ -141,13 +141,13 @@ declare_clippy_lint! {
|
|||
/// an expected formatting operation such as adding padding isn't happening.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// println!("{:.}", 1.0);
|
||||
///
|
||||
/// println!("not padded: {:5}", format_args!("..."));
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// println!("{}", 1.0);
|
||||
///
|
||||
/// println!("not padded: {}", format_args!("..."));
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt;
|
||||
///
|
||||
/// struct Structure(i32);
|
||||
|
|
@ -33,7 +33,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt;
|
||||
///
|
||||
/// struct Structure(i32);
|
||||
|
|
@ -59,7 +59,7 @@ declare_clippy_lint! {
|
|||
/// should write to the `Formatter`, not stdout/stderr.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt::{Display, Error, Formatter};
|
||||
///
|
||||
/// struct S;
|
||||
|
|
@ -72,7 +72,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt::{Display, Error, Formatter};
|
||||
///
|
||||
/// struct S;
|
||||
|
|
|
|||
|
|
@ -21,13 +21,13 @@ declare_clippy_lint! {
|
|||
/// While using `write!` in the suggested way should never fail, this isn't necessarily clear to the programmer.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let mut s = String::new();
|
||||
/// s += &format!("0x{:X}", 1024);
|
||||
/// s.push_str(&format!("0x{:X}", 1024));
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt::Write as _; // import without risk of name clashing
|
||||
///
|
||||
/// let mut s = String::new();
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ declare_clippy_lint! {
|
|||
/// This is either a typo in the binary operator or confusing.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let foo = true;
|
||||
/// # let bar = false;
|
||||
/// // &&! looks like a different operator
|
||||
|
|
@ -45,7 +45,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let foo = true;
|
||||
/// # let bar = false;
|
||||
/// if foo && !bar {}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ declare_clippy_lint! {
|
|||
/// comment.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// //// My amazing data structure
|
||||
/// pub struct Foo {
|
||||
/// // ...
|
||||
|
|
@ -22,7 +22,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// /// My amazing data structure
|
||||
/// pub struct Foo {
|
||||
/// // ...
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::macros::span_is_local;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::path_def_id;
|
||||
use clippy_utils::source::snippet_opt;
|
||||
use rustc_errors::Applicability;
|
||||
|
|
@ -24,7 +24,7 @@ declare_clippy_lint! {
|
|||
/// According the std docs implementing `From<..>` is preferred since it gives you `Into<..>` for free where the reverse isn't true.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct StringWrapper(String);
|
||||
///
|
||||
/// impl Into<StringWrapper> for String {
|
||||
|
|
@ -34,7 +34,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct StringWrapper(String);
|
||||
///
|
||||
/// impl From<String> for StringWrapper {
|
||||
|
|
@ -110,12 +110,12 @@ impl<'tcx> LateLintPass<'tcx> for FromOverInto {
|
|||
extract_msrv_attr!(LateContext);
|
||||
}
|
||||
|
||||
/// Finds the occurences of `Self` and `self`
|
||||
/// Finds the occurrences of `Self` and `self`
|
||||
struct SelfFinder<'a, 'tcx> {
|
||||
cx: &'a LateContext<'tcx>,
|
||||
/// Occurences of `Self`
|
||||
/// Occurrences of `Self`
|
||||
upper: Vec<Span>,
|
||||
/// Occurences of `self`
|
||||
/// Occurrences of `self`
|
||||
lower: Vec<Span>,
|
||||
/// If any of the `self`/`Self` usages were from an expansion, or the body contained a binding
|
||||
/// already named `val`
|
||||
|
|
|
|||
|
|
@ -18,13 +18,13 @@ declare_clippy_lint! {
|
|||
/// For this to be safe, `c_void` would need to have the same memory layout as the original type, which is often not the case.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::ffi::c_void;
|
||||
/// let ptr = Box::into_raw(Box::new(42usize)) as *mut c_void;
|
||||
/// let _ = unsafe { Box::from_raw(ptr) };
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::ffi::c_void;
|
||||
/// # let ptr = Box::into_raw(Box::new(42usize)) as *mut c_void;
|
||||
/// let _ = unsafe { Box::from_raw(ptr as *mut usize) };
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ declare_clippy_lint! {
|
|||
/// grouping some parameters into a new type.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # struct Color;
|
||||
/// fn foo(x: u32, y: u32, name: &str, c: Color, w: f32, h: f32, a: f32, b: f32) {
|
||||
/// // ..
|
||||
|
|
@ -46,7 +46,7 @@ declare_clippy_lint! {
|
|||
/// multiple functions.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn im_too_long() {
|
||||
/// println!("");
|
||||
/// // ... 100 more LoC
|
||||
|
|
@ -129,7 +129,7 @@ declare_clippy_lint! {
|
|||
/// a remnant of a refactoring that removed the return type.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[must_use]
|
||||
/// fn useless() { }
|
||||
/// ```
|
||||
|
|
@ -151,7 +151,7 @@ declare_clippy_lint! {
|
|||
/// attribute to improve the lint message.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[must_use]
|
||||
/// fn double_must_use() -> Result<(), ()> {
|
||||
/// unimplemented!();
|
||||
|
|
@ -183,7 +183,7 @@ declare_clippy_lint! {
|
|||
/// `#[must_use]`.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // this could be annotated with `#[must_use]`.
|
||||
/// pub fn id<T>(t: T) -> T { t }
|
||||
/// ```
|
||||
|
|
@ -211,7 +211,7 @@ declare_clippy_lint! {
|
|||
/// instead.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// pub fn read_u8() -> Result<u8, ()> { Err(()) }
|
||||
/// ```
|
||||
/// should become
|
||||
|
|
@ -262,7 +262,7 @@ declare_clippy_lint! {
|
|||
/// The size determined by Clippy is platform-dependent.
|
||||
///
|
||||
/// ### Examples
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// pub enum ParseError {
|
||||
/// UnparsedBytes([u8; 512]),
|
||||
/// UnexpectedEof,
|
||||
|
|
@ -274,7 +274,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// should be
|
||||
/// ```
|
||||
/// ```no_run
|
||||
/// pub enum ParseError {
|
||||
/// UnparsedBytes(Box<[u8; 512]>),
|
||||
/// UnexpectedEof,
|
||||
|
|
@ -301,7 +301,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ### Example
|
||||
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct A {
|
||||
/// a: String,
|
||||
/// b: String,
|
||||
|
|
@ -315,7 +315,7 @@ declare_clippy_lint! {
|
|||
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct A {
|
||||
/// a: String,
|
||||
/// b: String,
|
||||
|
|
@ -340,14 +340,14 @@ declare_clippy_lint! {
|
|||
/// Turbofish syntax (`::<>`) cannot be used when `impl Trait` is being used, making `impl Trait` less powerful. Readability may also be a factor.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// trait MyTrait {}
|
||||
/// fn foo(a: impl MyTrait) {
|
||||
/// // [...]
|
||||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// trait MyTrait {}
|
||||
/// fn foo<T: MyTrait>(a: T) {
|
||||
/// // [...]
|
||||
|
|
|
|||
|
|
@ -34,11 +34,11 @@ declare_clippy_lint! {
|
|||
/// produced.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// async fn not_send(bytes: std::rc::Rc<[u8]>) {}
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// async fn is_send(bytes: std::sync::Arc<[u8]>) {}
|
||||
/// ```
|
||||
#[clippy::version = "1.44.0"]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
//! lint on if branches that could be swapped so no `!` operation is necessary
|
||||
//! on the condition
|
||||
|
||||
use clippy_utils::consts::{constant_simple, Constant};
|
||||
use clippy_utils::diagnostics::span_lint_and_help;
|
||||
use clippy_utils::is_else_clause;
|
||||
use rustc_hir::{BinOpKind, Expr, ExprKind, UnOp};
|
||||
|
|
@ -16,7 +17,7 @@ declare_clippy_lint! {
|
|||
/// Negations reduce the readability of statements.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let v: Vec<usize> = vec![];
|
||||
/// # fn a() {}
|
||||
/// # fn b() {}
|
||||
|
|
@ -29,7 +30,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// Could be written:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let v: Vec<usize> = vec![];
|
||||
/// # fn a() {}
|
||||
/// # fn b() {}
|
||||
|
|
@ -47,6 +48,13 @@ declare_clippy_lint! {
|
|||
|
||||
declare_lint_pass!(IfNotElse => [IF_NOT_ELSE]);
|
||||
|
||||
fn is_zero_const(expr: &Expr<'_>, cx: &LateContext<'_>) -> bool {
|
||||
if let Some(value) = constant_simple(cx, cx.typeck_results(), expr) {
|
||||
return Constant::Int(0) == value;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
impl LateLintPass<'_> for IfNotElse {
|
||||
fn check_expr(&mut self, cx: &LateContext<'_>, item: &Expr<'_>) {
|
||||
// While loops will be desugared to ExprKind::If. This will cause the lint to fire.
|
||||
|
|
@ -72,7 +80,9 @@ impl LateLintPass<'_> for IfNotElse {
|
|||
"remove the `!` and swap the blocks of the `if`/`else`",
|
||||
);
|
||||
},
|
||||
ExprKind::Binary(ref kind, _, _) if kind.node == BinOpKind::Ne => {
|
||||
ExprKind::Binary(ref kind, _, lhs) if kind.node == BinOpKind::Ne && !is_zero_const(lhs, cx) => {
|
||||
// Disable firing the lint on `… != 0`, as these are likely to be bit tests.
|
||||
// For example, `if foo & 0x0F00 != 0 { … } else { … }` already is in the "proper" order.
|
||||
span_lint_and_help(
|
||||
cx,
|
||||
IF_NOT_ELSE,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_help;
|
||||
use clippy_utils::eager_or_lazy::switch_to_eager_eval;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_with_context;
|
||||
use clippy_utils::sugg::Sugg;
|
||||
use clippy_utils::{contains_return, higher, is_else_clause, is_res_lang_ctor, path_res, peel_blocks};
|
||||
|
|
@ -21,7 +21,7 @@ declare_clippy_lint! {
|
|||
/// in comparison to `bool::then`.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let v = vec![0];
|
||||
/// let a = if v.is_empty() {
|
||||
/// println!("true!");
|
||||
|
|
@ -33,7 +33,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// Could be written:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let v = vec![0];
|
||||
/// let a = v.is_empty().then(|| {
|
||||
/// println!("true!");
|
||||
|
|
|
|||
|
|
@ -15,14 +15,14 @@ declare_clippy_lint! {
|
|||
/// would detect a type change that `_` would ignore.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// match std::fs::create_dir("tmp-work-dir") {
|
||||
/// Ok(_) => println!("Working directory created"),
|
||||
/// Err(s) => eprintln!("Could not create directory: {s}"),
|
||||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// match std::fs::create_dir("tmp-work-dir") {
|
||||
/// Ok(()) => println!("Working directory created"),
|
||||
/// Err(s) => eprintln!("Could not create directory: {s}"),
|
||||
|
|
@ -52,7 +52,7 @@ impl<'tcx> LateLintPass<'tcx> for IgnoredUnitPatterns {
|
|||
},
|
||||
_ => {},
|
||||
}
|
||||
if matches!(pat.kind, PatKind::Wild) && cx.typeck_results().pat_ty(pat).is_unit() {
|
||||
if matches!(pat.kind, PatKind::Wild) && cx.typeck_results().pat_ty(pat).peel_refs().is_unit() {
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
IGNORED_UNIT_PATTERNS,
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ declare_clippy_lint! {
|
|||
/// pieces of code, possibly including external crates.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::collections::HashMap;
|
||||
/// # use std::hash::{Hash, BuildHasher};
|
||||
/// # trait Serialize {};
|
||||
|
|
@ -44,7 +44,7 @@ declare_clippy_lint! {
|
|||
/// pub fn foo(map: &mut HashMap<i32, i32>) { }
|
||||
/// ```
|
||||
/// could be rewritten as
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::collections::HashMap;
|
||||
/// # use std::hash::{Hash, BuildHasher};
|
||||
/// # trait Serialize {};
|
||||
|
|
|
|||
|
|
@ -24,13 +24,13 @@ declare_clippy_lint! {
|
|||
/// corresponding statements.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo(x: usize) -> usize {
|
||||
/// x
|
||||
/// }
|
||||
/// ```
|
||||
/// add return
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo(x: usize) -> usize {
|
||||
/// return x;
|
||||
/// }
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ declare_clippy_lint! {
|
|||
/// The built-in function is more readable and may be faster.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
///let mut u:u32 = 7000;
|
||||
///
|
||||
/// if u != u32::MAX {
|
||||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
///let mut u:u32 = 7000;
|
||||
///
|
||||
/// u = u.saturating_add(1);
|
||||
|
|
@ -82,18 +82,18 @@ impl<'tcx> LateLintPass<'tcx> for ImplicitSaturatingAdd {
|
|||
|
||||
fn get_int_max(ty: Ty<'_>) -> Option<u128> {
|
||||
match ty.peel_refs().kind() {
|
||||
Int(IntTy::I8) => i8::max_value().try_into().ok(),
|
||||
Int(IntTy::I16) => i16::max_value().try_into().ok(),
|
||||
Int(IntTy::I32) => i32::max_value().try_into().ok(),
|
||||
Int(IntTy::I64) => i64::max_value().try_into().ok(),
|
||||
Int(IntTy::I128) => i128::max_value().try_into().ok(),
|
||||
Int(IntTy::Isize) => isize::max_value().try_into().ok(),
|
||||
Uint(UintTy::U8) => u8::max_value().try_into().ok(),
|
||||
Uint(UintTy::U16) => u16::max_value().try_into().ok(),
|
||||
Uint(UintTy::U32) => u32::max_value().try_into().ok(),
|
||||
Uint(UintTy::U64) => u64::max_value().try_into().ok(),
|
||||
Uint(UintTy::U128) => Some(u128::max_value()),
|
||||
Uint(UintTy::Usize) => usize::max_value().try_into().ok(),
|
||||
Int(IntTy::I8) => i8::MAX.try_into().ok(),
|
||||
Int(IntTy::I16) => i16::MAX.try_into().ok(),
|
||||
Int(IntTy::I32) => i32::MAX.try_into().ok(),
|
||||
Int(IntTy::I64) => i64::MAX.try_into().ok(),
|
||||
Int(IntTy::I128) => i128::MAX.try_into().ok(),
|
||||
Int(IntTy::Isize) => isize::MAX.try_into().ok(),
|
||||
Uint(UintTy::U8) => Some(u8::MAX.into()),
|
||||
Uint(UintTy::U16) => Some(u16::MAX.into()),
|
||||
Uint(UintTy::U32) => Some(u32::MAX.into()),
|
||||
Uint(UintTy::U64) => Some(u64::MAX.into()),
|
||||
Uint(UintTy::U128) => Some(u128::MAX),
|
||||
Uint(UintTy::Usize) => usize::MAX.try_into().ok(),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ declare_clippy_lint! {
|
|||
/// Simplicity and readability. Instead we can easily use an builtin function.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let end: u32 = 10;
|
||||
/// # let start: u32 = 5;
|
||||
/// let mut i: u32 = end - start;
|
||||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let end: u32 = 10;
|
||||
/// # let start: u32 = 5;
|
||||
/// let mut i: u32 = end - start;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ declare_clippy_lint! {
|
|||
/// (e.g. `trait A {} trait B: A {} trait C: B {}`, then having an `fn() -> impl A + C`)
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::ops::{Deref,DerefMut};
|
||||
/// fn f() -> impl Deref<Target = i32> + DerefMut<Target = i32> {
|
||||
/// // ^^^^^^^^^^^^^^^^^^^ unnecessary bound, already implied by the `DerefMut` trait bound
|
||||
|
|
@ -37,7 +37,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::ops::{Deref,DerefMut};
|
||||
/// fn f() -> impl DerefMut<Target = i32> {
|
||||
/// Box::new(123)
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ declare_clippy_lint! {
|
|||
/// Since the order of fields in a constructor doesn't affect the
|
||||
/// resulted instance as the below example indicates,
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[derive(Debug, PartialEq, Eq)]
|
||||
/// struct Foo {
|
||||
/// x: i32,
|
||||
|
|
@ -35,7 +35,7 @@ declare_clippy_lint! {
|
|||
/// inconsistent order can be confusing and decreases readability and consistency.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Foo {
|
||||
/// x: i32,
|
||||
/// y: i32,
|
||||
|
|
@ -47,7 +47,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # struct Foo {
|
||||
/// # x: i32,
|
||||
/// # y: i32,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::consts::{constant, Constant};
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::higher::IfLet;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::ty::is_copy;
|
||||
use clippy_utils::{is_expn_of, is_lint_allowed, path_to_local};
|
||||
use if_chain::if_chain;
|
||||
|
|
@ -31,7 +31,7 @@ declare_clippy_lint! {
|
|||
/// patterns.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let slice: Option<&[u32]> = Some(&[1, 2, 3]);
|
||||
///
|
||||
/// if let Some(slice) = slice {
|
||||
|
|
@ -39,7 +39,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let slice: Option<&[u32]> = Some(&[1, 2, 3]);
|
||||
///
|
||||
/// if let Some(&[first, ..]) = slice {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let x = [1, 2, 3, 4];
|
||||
/// // Index within bounds
|
||||
///
|
||||
|
|
@ -65,7 +65,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # #![allow(unused)]
|
||||
///
|
||||
/// # let x = vec![0; 5];
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ declare_clippy_lint! {
|
|||
/// this lint is not clever enough to analyze it.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let infinite_iter = 0..;
|
||||
/// # #[allow(unused)]
|
||||
/// [0..].iter().zip(infinite_iter.take_while(|x| *x > 5));
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ declare_clippy_lint! {
|
|||
/// Splitting the implementation of a type makes the code harder to navigate.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct X;
|
||||
/// impl X {
|
||||
/// fn one() {}
|
||||
|
|
@ -30,7 +30,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// Could be written:
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct X;
|
||||
/// impl X {
|
||||
/// fn one() {}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ declare_clippy_lint! {
|
|||
/// This method is also implicitly defined if a type implements the `Display` trait. As the functionality of `Display` is much more versatile, it should be preferred.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// pub struct A;
|
||||
///
|
||||
/// impl A {
|
||||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt;
|
||||
///
|
||||
/// pub struct A;
|
||||
|
|
@ -51,7 +51,7 @@ declare_clippy_lint! {
|
|||
/// This method is also implicitly defined if a type implements the `Display` trait. The less versatile inherent method will then shadow the implementation introduced by `Display`.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt;
|
||||
///
|
||||
/// pub struct A;
|
||||
|
|
@ -70,7 +70,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::fmt;
|
||||
///
|
||||
/// pub struct A;
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ declare_clippy_lint! {
|
|||
/// benefit as opposed to tuple initializers
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct TupleStruct(u8, u16);
|
||||
///
|
||||
/// let _ = TupleStruct {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ declare_clippy_lint! {
|
|||
/// The inline attribute is ignored for trait methods without bodies.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// trait Animal {
|
||||
/// #[inline]
|
||||
/// fn name(&self) -> &'static str;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::{self, span_lint_and_sugg};
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_with_context;
|
||||
use clippy_utils::sugg::Sugg;
|
||||
use clippy_utils::ty;
|
||||
|
|
@ -21,13 +21,13 @@ declare_clippy_lint! {
|
|||
/// `prev_instant.elapsed()` also more clearly signals intention.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::time::Instant;
|
||||
/// let prev_instant = Instant::now();
|
||||
/// let duration = Instant::now() - prev_instant;
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::time::Instant;
|
||||
/// let prev_instant = Instant::now();
|
||||
/// let duration = prev_instant.elapsed();
|
||||
|
|
@ -47,13 +47,13 @@ declare_clippy_lint! {
|
|||
/// unintentional panics.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::time::{Instant, Duration};
|
||||
/// let time_passed = Instant::now() - Duration::from_secs(5);
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::time::{Instant, Duration};
|
||||
/// let time_passed = Instant::now().checked_sub(Duration::from_secs(5));
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -16,14 +16,14 @@ declare_clippy_lint! {
|
|||
/// Readability -- better to use `> y` instead of `>= y + 1`.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let x = 1;
|
||||
/// # let y = 1;
|
||||
/// if x >= y + 1 {}
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let x = 1;
|
||||
/// # let y = 1;
|
||||
/// if x > y {}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
/// https://github.com/rust-lang/rust-clippy/issues/886
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x: u8 = 1;
|
||||
/// (x as u32) > 300;
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
/// (the prefixes are `Foo1` and `Foo2` respectively), as also `Bar螃`, `Bar蟹`
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum Cake {
|
||||
/// BlackForestCake,
|
||||
/// HummingbirdCake,
|
||||
|
|
@ -34,7 +34,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum Cake {
|
||||
/// BlackForest,
|
||||
/// Hummingbird,
|
||||
|
|
@ -56,14 +56,14 @@ declare_clippy_lint! {
|
|||
/// It requires the user to type the module name twice.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// mod cake {
|
||||
/// struct BlackForestCake;
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// mod cake {
|
||||
/// struct BlackForest;
|
||||
/// }
|
||||
|
|
@ -119,7 +119,7 @@ declare_clippy_lint! {
|
|||
/// (the prefixes are `foo1` and `foo2` respectively), as also `bar螃`, `bar蟹`
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Cake {
|
||||
/// cake_sugar: u8,
|
||||
/// cake_flour: u8,
|
||||
|
|
@ -127,7 +127,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct Cake {
|
||||
/// sugar: u8,
|
||||
/// flour: u8,
|
||||
|
|
@ -320,6 +320,11 @@ fn check_variant(cx: &LateContext<'_>, threshold: u64, def: &EnumDef<'_>, item_n
|
|||
return;
|
||||
}
|
||||
|
||||
for var in def.variants {
|
||||
check_enum_start(cx, item_name, var);
|
||||
check_enum_end(cx, item_name, var);
|
||||
}
|
||||
|
||||
let first = match def.variants.first() {
|
||||
Some(variant) => variant.ident.name.as_str(),
|
||||
None => return,
|
||||
|
|
@ -328,8 +333,6 @@ fn check_variant(cx: &LateContext<'_>, threshold: u64, def: &EnumDef<'_>, item_n
|
|||
let mut post = pre.clone();
|
||||
post.reverse();
|
||||
for var in def.variants {
|
||||
check_enum_start(cx, item_name, var);
|
||||
check_enum_end(cx, item_name, var);
|
||||
let name = var.ident.name.as_str();
|
||||
|
||||
let variant_split = camel_case_split(name);
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ declare_clippy_lint! {
|
|||
/// it's hard to figure out which item is meant in a statement.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo() {
|
||||
/// println!("cake");
|
||||
/// }
|
||||
|
|
@ -31,7 +31,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo() {
|
||||
/// println!("cake");
|
||||
/// }
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ declare_clippy_lint! {
|
|||
/// ### Why is this bad?
|
||||
/// Having items declared after the testing module is confusing and may lead to bad test coverage.
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// #[cfg(test)]
|
||||
/// mod tests {
|
||||
/// // [...]
|
||||
|
|
@ -25,7 +25,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn my_function() {
|
||||
/// // [...]
|
||||
/// }
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ declare_clippy_lint! {
|
|||
/// Methods named `iter` or `iter_mut` conventionally return an `Iterator`.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // `String` does not implement `Iterator`
|
||||
/// struct Data {}
|
||||
/// impl Data {
|
||||
|
|
@ -25,7 +25,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// use std::str::Chars;
|
||||
/// struct Data {}
|
||||
/// impl Data {
|
||||
|
|
|
|||
|
|
@ -19,8 +19,13 @@ declare_clippy_lint! {
|
|||
/// It's not bad, but having them is idiomatic and allows the type to be used in for loops directly
|
||||
/// (`for val in &iter {}`), without having to first call `iter()` or `iter_mut()`.
|
||||
///
|
||||
/// ### Limitations
|
||||
/// This lint focuses on providing an idiomatic API. Therefore, it will only
|
||||
/// lint on types which are accessible outside of the crate. For internal types,
|
||||
/// the `IntoIterator` trait can be implemented on demand if it is actually needed.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct MySlice<'a>(&'a [u8]);
|
||||
/// impl<'a> MySlice<'a> {
|
||||
/// pub fn iter(&self) -> std::slice::Iter<'a, u8> {
|
||||
|
|
@ -29,7 +34,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct MySlice<'a>(&'a [u8]);
|
||||
/// impl<'a> MySlice<'a> {
|
||||
/// pub fn iter(&self) -> std::slice::Iter<'a, u8> {
|
||||
|
|
@ -61,8 +66,16 @@ declare_clippy_lint! {
|
|||
/// by just calling `.iter()`, instead of the more awkward `<&Type>::into_iter` or `(&val).into_iter()` syntax
|
||||
/// in case of ambiguity with another `IntoIterator` impl.
|
||||
///
|
||||
/// ### Limitations
|
||||
/// This lint focuses on providing an idiomatic API. Therefore, it will only
|
||||
/// lint on types which are accessible outside of the crate. For internal types,
|
||||
/// these methods can be added on demand if they are actually needed. Otherwise,
|
||||
/// it would trigger the [`dead_code`] lint for the unused method.
|
||||
///
|
||||
/// [`dead_code`]: https://doc.rust-lang.org/rustc/lints/listing/warn-by-default.html#dead-code
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct MySlice<'a>(&'a [u8]);
|
||||
/// impl<'a> IntoIterator for &MySlice<'a> {
|
||||
/// type Item = &'a u8;
|
||||
|
|
@ -73,7 +86,7 @@ declare_clippy_lint! {
|
|||
/// }
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct MySlice<'a>(&'a [u8]);
|
||||
/// impl<'a> MySlice<'a> {
|
||||
/// pub fn iter(&self) -> std::slice::Iter<'a, u8> {
|
||||
|
|
@ -104,6 +117,12 @@ fn is_nameable_in_impl_trait(ty: &rustc_hir::Ty<'_>) -> bool {
|
|||
!matches!(ty.kind, TyKind::OpaqueDef(..))
|
||||
}
|
||||
|
||||
fn is_ty_exported(cx: &LateContext<'_>, ty: Ty<'_>) -> bool {
|
||||
ty.ty_adt_def()
|
||||
.and_then(|adt| adt.did().as_local())
|
||||
.is_some_and(|did| cx.effective_visibilities.is_exported(did))
|
||||
}
|
||||
|
||||
/// Returns the deref chain of a type, starting with the type itself.
|
||||
fn deref_chain<'cx, 'tcx>(cx: &'cx LateContext<'tcx>, ty: Ty<'tcx>) -> impl Iterator<Item = Ty<'tcx>> + 'cx {
|
||||
iter::successors(Some(ty), |&ty| {
|
||||
|
|
@ -154,6 +173,7 @@ impl LateLintPass<'_> for IterWithoutIntoIter {
|
|||
None
|
||||
}
|
||||
})
|
||||
&& is_ty_exported(cx, ty)
|
||||
{
|
||||
span_lint_and_then(
|
||||
cx,
|
||||
|
|
@ -221,11 +241,12 @@ impl {self_ty_without_ref} {{
|
|||
cx.tcx,
|
||||
cx.param_env,
|
||||
iterator_did,
|
||||
sym!(Item),
|
||||
sym::Item,
|
||||
[ret_ty],
|
||||
)
|
||||
// Only lint if the `IntoIterator` impl doesn't actually exist
|
||||
&& !implements_trait(cx, ref_ty, into_iter_did, &[])
|
||||
&& is_ty_exported(cx, ref_ty.peel_refs())
|
||||
{
|
||||
let self_ty_snippet = format!("{borrow_prefix}{}", snippet(cx, imp.self_ty.span, ".."));
|
||||
|
||||
|
|
@ -247,8 +268,8 @@ impl {self_ty_without_ref} {{
|
|||
"
|
||||
impl IntoIterator for {self_ty_snippet} {{
|
||||
type IntoIter = {ret_ty};
|
||||
type Iter = {iter_ty};
|
||||
fn into_iter() -> Self::IntoIter {{
|
||||
type Item = {iter_ty};
|
||||
fn into_iter(self) -> Self::IntoIter {{
|
||||
self.iter()
|
||||
}}
|
||||
}}
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ declare_clippy_lint! {
|
|||
/// this may lead to a false positive.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// enum Test {
|
||||
/// A(i32),
|
||||
/// B([i32; 8000]),
|
||||
|
|
@ -46,7 +46,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // Possibly better
|
||||
/// enum Test2 {
|
||||
/// A(i32),
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ declare_clippy_lint! {
|
|||
/// large size of a `Future` may cause stack overflows.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// async fn large_future(_x: [u8; 16 * 1024]) {}
|
||||
///
|
||||
/// pub async fn trigger() {
|
||||
|
|
@ -26,7 +26,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// `Box::pin` the big future instead.
|
||||
///
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// async fn large_future(_x: [u8; 16 * 1024]) {}
|
||||
///
|
||||
/// pub async fn trigger() {
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ declare_clippy_lint! {
|
|||
/// ### Example
|
||||
/// This function creates four 500 KB arrays on the stack. Quite big but just small enough to not trigger `large_stack_arrays`.
|
||||
/// However, looking at the function as a whole, it's clear that this uses a lot of stack space.
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct QuiteLargeType([u8; 500_000]);
|
||||
/// fn foo() {
|
||||
/// // ... some function that uses a lot of stack space ...
|
||||
|
|
@ -62,7 +62,7 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// Instead of doing this, allocate the arrays on the heap.
|
||||
/// This currently requires going through a `Vec` first and then converting it to a `Box`:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// struct NotSoLargeType(Box<[u8]>);
|
||||
///
|
||||
/// fn foo() {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ declare_clippy_lint! {
|
|||
/// expr
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn f() -> Result<u32, u32> {
|
||||
/// Ok(0)
|
||||
/// }
|
||||
|
|
@ -69,7 +69,7 @@ declare_clippy_lint! {
|
|||
/// and ignore the resulting value.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// async fn foo() -> Result<(), ()> {
|
||||
/// Ok(())
|
||||
/// }
|
||||
|
|
@ -77,7 +77,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # async fn context() {
|
||||
/// async fn foo() -> Result<(), ()> {
|
||||
/// Ok(())
|
||||
|
|
@ -107,14 +107,14 @@ declare_clippy_lint! {
|
|||
/// lints.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo() -> Result<u32, ()> {
|
||||
/// Ok(123)
|
||||
/// }
|
||||
/// let _ = foo();
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn foo() -> Result<u32, ()> {
|
||||
/// Ok(123)
|
||||
/// }
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@ extern crate clippy_utils;
|
|||
#[macro_use]
|
||||
extern crate declare_clippy_lint;
|
||||
|
||||
use clippy_utils::msrvs::Msrv;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_lint::{Lint, LintId};
|
||||
use rustc_session::Session;
|
||||
|
|
@ -358,9 +357,7 @@ mod zero_div_zero;
|
|||
mod zero_sized_map_values;
|
||||
// end lints modules, do not remove this comment, it’s used in `update_lints`
|
||||
|
||||
use crate::utils::conf::metadata::get_configuration_metadata;
|
||||
pub use crate::utils::conf::{lookup_conf_file, Conf};
|
||||
use crate::utils::FindAll;
|
||||
use clippy_config::{get_configuration_metadata, Conf};
|
||||
|
||||
/// Register all pre expansion lints
|
||||
///
|
||||
|
|
@ -462,16 +459,13 @@ pub fn explain(name: &str) -> i32 {
|
|||
if let Some(info) = declared_lints::LINTS.iter().find(|info| info.lint.name == target) {
|
||||
println!("{}", info.explanation);
|
||||
// Check if the lint has configuration
|
||||
let mdconf = get_configuration_metadata();
|
||||
if let Some(config_vec_positions) = mdconf
|
||||
.iter()
|
||||
.find_all(|cconf| cconf.lints.contains(&info.lint.name_lower()[8..].to_owned()))
|
||||
{
|
||||
// If it has, print it
|
||||
let mut mdconf = get_configuration_metadata();
|
||||
let name = name.to_ascii_lowercase();
|
||||
mdconf.retain(|cconf| cconf.lints.contains(&name));
|
||||
if !mdconf.is_empty() {
|
||||
println!("### Configuration for {}:\n", info.lint.name_lower());
|
||||
for position in config_vec_positions {
|
||||
let conf = &mdconf[position];
|
||||
println!(" - {}: {} (default: {})", conf.name, conf.doc, conf.default);
|
||||
for conf in mdconf {
|
||||
println!("{conf}");
|
||||
}
|
||||
}
|
||||
0
|
||||
|
|
@ -519,7 +513,9 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
|
|||
// all the internal lints
|
||||
#[cfg(feature = "internal")]
|
||||
{
|
||||
store.register_early_pass(|| Box::new(utils::internal_lints::clippy_lints_internal::ClippyLintsInternal));
|
||||
store.register_early_pass(|| {
|
||||
Box::new(utils::internal_lints::unsorted_clippy_utils_paths::UnsortedClippyUtilsPaths)
|
||||
});
|
||||
store.register_early_pass(|| Box::new(utils::internal_lints::produce_ice::ProduceIce));
|
||||
store.register_late_pass(|_| Box::new(utils::internal_lints::collapsible_calls::CollapsibleCalls));
|
||||
store.register_late_pass(|_| {
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ declare_clippy_lint! {
|
|||
/// are mentioned due to potential false positives.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // Unnecessary lifetime annotations
|
||||
/// fn in_and_out<'a>(x: &'a u8, y: u8) -> &'a u8 {
|
||||
/// x
|
||||
|
|
@ -46,7 +46,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn elided(x: &u8, y: u8) -> &u8 {
|
||||
/// x
|
||||
/// }
|
||||
|
|
@ -69,7 +69,7 @@ declare_clippy_lint! {
|
|||
/// them leads to more readable code.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// // unnecessary lifetimes
|
||||
/// fn unused_lifetime<'a>(x: u8) {
|
||||
/// // ..
|
||||
|
|
@ -77,7 +77,7 @@ declare_clippy_lint! {
|
|||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// fn no_lifetime(x: u8) {
|
||||
/// // ...
|
||||
/// }
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ declare_clippy_lint! {
|
|||
/// successful results, using `map_while()` would stop at the first error.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::{fs::File, io::{self, BufRead, BufReader}};
|
||||
/// # let _ = || -> io::Result<()> {
|
||||
/// let mut lines = BufReader::new(File::open("some-path")?).lines().filter_map(Result::ok);
|
||||
|
|
@ -43,7 +43,7 @@ declare_clippy_lint! {
|
|||
/// # Ok(()) };
|
||||
/// ```
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # use std::{fs::File, io::{self, BufRead, BufReader}};
|
||||
/// # let _ = || -> io::Result<()> {
|
||||
/// let mut lines = BufReader::new(File::open("some-path")?).lines().map_while(Result::ok);
|
||||
|
|
|
|||
|
|
@ -23,14 +23,14 @@ declare_clippy_lint! {
|
|||
/// Reading long numbers is difficult without separators.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let _: u64 =
|
||||
/// 61864918973511
|
||||
/// # ;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let _: u64 =
|
||||
/// 61_864_918_973_511
|
||||
/// # ;
|
||||
|
|
@ -73,14 +73,14 @@ declare_clippy_lint! {
|
|||
/// grouped digits.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let _: u64 =
|
||||
/// 618_64_9189_73_511
|
||||
/// # ;
|
||||
/// ```
|
||||
///
|
||||
/// Use instead:
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// # let _: u64 =
|
||||
/// 61_864_918_973_511
|
||||
/// # ;
|
||||
|
|
@ -100,7 +100,7 @@ declare_clippy_lint! {
|
|||
/// Negatively impacts readability.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x: u32 = 0xFFF_FFF;
|
||||
/// let y: u8 = 0b01_011_101;
|
||||
/// ```
|
||||
|
|
@ -120,7 +120,7 @@ declare_clippy_lint! {
|
|||
/// Negatively impacts readability.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```rust
|
||||
/// ```no_run
|
||||
/// let x: u64 = 6186491_8973511;
|
||||
/// ```
|
||||
#[clippy::version = "pre 1.29.0"]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use super::EXPLICIT_ITER_LOOP;
|
||||
use clippy_config::msrvs::{self, Msrv};
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::msrvs::{self, Msrv};
|
||||
use clippy_utils::source::snippet_with_applicability;
|
||||
use clippy_utils::ty::{
|
||||
implements_trait, implements_trait_with_env, is_copy, make_normalized_projection,
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
use super::FOR_KV_MAP;
|
||||
use clippy_utils::diagnostics::{multispan_sugg, span_lint_and_then};
|
||||
use clippy_utils::source::snippet;
|
||||
use clippy_utils::sugg;
|
||||
use clippy_utils::ty::is_type_diagnostic_item;
|
||||
use clippy_utils::visitors::is_local_used;
|
||||
use clippy_utils::{pat_is_wild, sugg};
|
||||
use rustc_hir::{BorrowKind, Expr, ExprKind, Mutability, Pat, PatKind};
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::ty;
|
||||
|
|
@ -55,12 +54,3 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, pat: &'tcx Pat<'_>, arg: &'tcx
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `true` if the pattern is a `PatWild` or an ident prefixed with `_`.
|
||||
fn pat_is_wild<'tcx>(cx: &LateContext<'tcx>, pat: &'tcx PatKind<'_>, body: &'tcx Expr<'_>) -> bool {
|
||||
match *pat {
|
||||
PatKind::Wild => true,
|
||||
PatKind::Binding(_, id, ident, None) if ident.as_str().starts_with('_') => !is_local_used(cx, body, id),
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue