mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-30 16:39:26 +00:00
Auto merge of #13236 - flip1995:rustup, r=flip1995
Rustup r? `@ghost` changelog: ICE fix [`uninit_vec`] through https://github.com/rust-lang/rust/pull/128720
This commit is contained in:
commit
cb806113e0
27 changed files with 84 additions and 219 deletions
|
@ -5,7 +5,6 @@
|
||||||
#![feature(f128)]
|
#![feature(f128)]
|
||||||
#![feature(f16)]
|
#![feature(f16)]
|
||||||
#![feature(if_let_guard)]
|
#![feature(if_let_guard)]
|
||||||
#![feature(is_sorted)]
|
|
||||||
#![feature(iter_intersperse)]
|
#![feature(iter_intersperse)]
|
||||||
#![feature(iter_partition_in_place)]
|
#![feature(iter_partition_in_place)]
|
||||||
#![feature(let_chains)]
|
#![feature(let_chains)]
|
||||||
|
|
|
@ -543,7 +543,7 @@ impl<'a, 'tcx> Visitor<'tcx> for RefVisitor<'a, 'tcx> {
|
||||||
if !lt.is_elided() {
|
if !lt.is_elided() {
|
||||||
self.unelided_trait_object_lifetime = true;
|
self.unelided_trait_object_lifetime = true;
|
||||||
}
|
}
|
||||||
for bound in bounds {
|
for (bound, _) in bounds {
|
||||||
self.visit_poly_trait_ref(bound);
|
self.visit_poly_trait_ref(bound);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,10 +2,10 @@ use clippy_config::msrvs::{self, Msrv};
|
||||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||||
use clippy_utils::source::snippet_with_applicability;
|
use clippy_utils::source::snippet_with_applicability;
|
||||||
use clippy_utils::ty::{is_copy, is_type_diagnostic_item, should_call_clone_as_function};
|
use clippy_utils::ty::{is_copy, is_type_diagnostic_item, should_call_clone_as_function};
|
||||||
use clippy_utils::{is_diag_trait_item, match_def_path, paths, peel_blocks};
|
use clippy_utils::{is_diag_trait_item, peel_blocks};
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir as hir;
|
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
use rustc_hir::{self as hir, LangItem};
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
use rustc_middle::mir::Mutability;
|
use rustc_middle::mir::Mutability;
|
||||||
use rustc_middle::ty;
|
use rustc_middle::ty;
|
||||||
|
@ -114,7 +114,7 @@ fn handle_path(
|
||||||
recv: &hir::Expr<'_>,
|
recv: &hir::Expr<'_>,
|
||||||
) {
|
) {
|
||||||
if let Some(path_def_id) = cx.qpath_res(qpath, arg.hir_id).opt_def_id()
|
if let Some(path_def_id) = cx.qpath_res(qpath, arg.hir_id).opt_def_id()
|
||||||
&& match_def_path(cx, path_def_id, &paths::CLONE_TRAIT_METHOD)
|
&& cx.tcx.lang_items().get(LangItem::CloneFn) == Some(path_def_id)
|
||||||
{
|
{
|
||||||
// The `copied` and `cloned` methods are only available on `&T` and `&mut T` in `Option`
|
// The `copied` and `cloned` methods are only available on `&T` and `&mut T` in `Option`
|
||||||
// and `Result`.
|
// and `Result`.
|
||||||
|
|
|
@ -2,10 +2,10 @@ use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||||
use clippy_utils::source::snippet_with_applicability;
|
use clippy_utils::source::snippet_with_applicability;
|
||||||
use clippy_utils::ty::{should_call_clone_as_function, walk_ptrs_ty_depth};
|
use clippy_utils::ty::{should_call_clone_as_function, walk_ptrs_ty_depth};
|
||||||
use clippy_utils::{
|
use clippy_utils::{
|
||||||
get_parent_expr, is_diag_trait_item, match_def_path, path_to_local_id, paths, peel_blocks, strip_pat_refs,
|
get_parent_expr, is_diag_trait_item, match_def_path, path_to_local_id, peel_blocks, strip_pat_refs,
|
||||||
};
|
};
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir as hir;
|
use rustc_hir::{self as hir, LangItem};
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
use rustc_middle::ty::adjustment::Adjust;
|
use rustc_middle::ty::adjustment::Adjust;
|
||||||
use rustc_middle::ty::{Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor};
|
use rustc_middle::ty::{Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor};
|
||||||
|
@ -104,7 +104,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, call_name: &str,
|
||||||
fn check_qpath(cx: &LateContext<'_>, qpath: hir::QPath<'_>, hir_id: hir::HirId) -> bool {
|
fn check_qpath(cx: &LateContext<'_>, qpath: hir::QPath<'_>, hir_id: hir::HirId) -> bool {
|
||||||
// We check it's calling the `clone` method of the `Clone` trait.
|
// We check it's calling the `clone` method of the `Clone` trait.
|
||||||
if let Some(path_def_id) = cx.qpath_res(&qpath, hir_id).opt_def_id() {
|
if let Some(path_def_id) = cx.qpath_res(&qpath, hir_id).opt_def_id() {
|
||||||
match_def_path(cx, path_def_id, &paths::CLONE_TRAIT_METHOD)
|
cx.tcx.lang_items().get(LangItem::CloneFn) == Some(path_def_id)
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,38 +1,17 @@
|
||||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||||
use clippy_utils::source::snippet_with_applicability;
|
use clippy_utils::source::snippet_with_applicability;
|
||||||
use rustc_ast::ast::{BinOpKind, Expr, ExprKind, MethodCall, UnOp};
|
use rustc_ast::ast::{BinOpKind, Expr, ExprKind};
|
||||||
use rustc_ast::token;
|
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_lint::{EarlyContext, EarlyLintPass};
|
use rustc_lint::{EarlyContext, EarlyLintPass};
|
||||||
use rustc_session::declare_lint_pass;
|
use rustc_session::declare_lint_pass;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
|
|
||||||
const ALLOWED_ODD_FUNCTIONS: [&str; 14] = [
|
|
||||||
"asin",
|
|
||||||
"asinh",
|
|
||||||
"atan",
|
|
||||||
"atanh",
|
|
||||||
"cbrt",
|
|
||||||
"fract",
|
|
||||||
"round",
|
|
||||||
"signum",
|
|
||||||
"sin",
|
|
||||||
"sinh",
|
|
||||||
"tan",
|
|
||||||
"tanh",
|
|
||||||
"to_degrees",
|
|
||||||
"to_radians",
|
|
||||||
];
|
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// ### What it does
|
/// ### What it does
|
||||||
/// Checks for operations where precedence may be unclear
|
/// Checks for operations where precedence may be unclear
|
||||||
/// and suggests to add parentheses. Currently it catches the following:
|
/// and suggests to add parentheses. Currently it catches the following:
|
||||||
/// * mixed usage of arithmetic and bit shifting/combining operators without
|
/// * mixed usage of arithmetic and bit shifting/combining operators without
|
||||||
/// parentheses
|
/// parentheses
|
||||||
/// * a "negative" numeric literal (which is really a unary `-` followed by a
|
|
||||||
/// numeric literal)
|
|
||||||
/// followed by a method call
|
|
||||||
///
|
///
|
||||||
/// ### Why is this bad?
|
/// ### Why is this bad?
|
||||||
/// Not everyone knows the precedence of those operators by
|
/// Not everyone knows the precedence of those operators by
|
||||||
|
@ -41,7 +20,6 @@ declare_clippy_lint! {
|
||||||
///
|
///
|
||||||
/// ### Example
|
/// ### Example
|
||||||
/// * `1 << 2 + 3` equals 32, while `(1 << 2) + 3` equals 7
|
/// * `1 << 2 + 3` equals 32, while `(1 << 2) + 3` equals 7
|
||||||
/// * `-1i32.abs()` equals -1, while `(-1i32).abs()` equals 1
|
|
||||||
#[clippy::version = "pre 1.29.0"]
|
#[clippy::version = "pre 1.29.0"]
|
||||||
pub PRECEDENCE,
|
pub PRECEDENCE,
|
||||||
complexity,
|
complexity,
|
||||||
|
@ -104,38 +82,6 @@ impl EarlyLintPass for Precedence {
|
||||||
(false, false) => (),
|
(false, false) => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let ExprKind::Unary(UnOp::Neg, operand) = &expr.kind {
|
|
||||||
let mut arg = operand;
|
|
||||||
|
|
||||||
let mut all_odd = true;
|
|
||||||
while let ExprKind::MethodCall(box MethodCall { seg, receiver, .. }) = &arg.kind {
|
|
||||||
let seg_str = seg.ident.name.as_str();
|
|
||||||
all_odd &= ALLOWED_ODD_FUNCTIONS
|
|
||||||
.iter()
|
|
||||||
.any(|odd_function| **odd_function == *seg_str);
|
|
||||||
arg = receiver;
|
|
||||||
}
|
|
||||||
|
|
||||||
if !all_odd
|
|
||||||
&& let ExprKind::Lit(lit) = &arg.kind
|
|
||||||
&& let token::LitKind::Integer | token::LitKind::Float = &lit.kind
|
|
||||||
{
|
|
||||||
let mut applicability = Applicability::MachineApplicable;
|
|
||||||
span_lint_and_sugg(
|
|
||||||
cx,
|
|
||||||
PRECEDENCE,
|
|
||||||
expr.span,
|
|
||||||
"unary minus has lower precedence than method call",
|
|
||||||
"consider adding parentheses to clarify your intent",
|
|
||||||
format!(
|
|
||||||
"-({})",
|
|
||||||
snippet_with_applicability(cx, operand.span, "..", &mut applicability)
|
|
||||||
),
|
|
||||||
applicability,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ impl<'tcx> LateLintPass<'tcx> for RedundantClone {
|
||||||
let (fn_def_id, arg, arg_ty, clone_ret) =
|
let (fn_def_id, arg, arg_ty, clone_ret) =
|
||||||
unwrap_or_continue!(is_call_with_ref_arg(cx, mir, &terminator.kind));
|
unwrap_or_continue!(is_call_with_ref_arg(cx, mir, &terminator.kind));
|
||||||
|
|
||||||
let from_borrow = match_def_path(cx, fn_def_id, &paths::CLONE_TRAIT_METHOD)
|
let from_borrow = cx.tcx.lang_items().get(LangItem::CloneFn) == Some(fn_def_id)
|
||||||
|| cx.tcx.is_diagnostic_item(sym::to_owned_method, fn_def_id)
|
|| cx.tcx.is_diagnostic_item(sym::to_owned_method, fn_def_id)
|
||||||
|| (cx.tcx.is_diagnostic_item(sym::to_string_method, fn_def_id)
|
|| (cx.tcx.is_diagnostic_item(sym::to_string_method, fn_def_id)
|
||||||
&& is_type_lang_item(cx, arg_ty, LangItem::String));
|
&& is_type_lang_item(cx, arg_ty, LangItem::String));
|
||||||
|
|
|
@ -183,7 +183,7 @@ impl<'tcx> LateLintPass<'tcx> for TraitBounds {
|
||||||
|
|
||||||
// Iterate the bounds and add them to our seen hash
|
// Iterate the bounds and add them to our seen hash
|
||||||
// If we haven't yet seen it, add it to the fixed traits
|
// If we haven't yet seen it, add it to the fixed traits
|
||||||
for bound in bounds {
|
for (bound, _) in bounds {
|
||||||
let Some(def_id) = bound.trait_ref.trait_def_id() else {
|
let Some(def_id) = bound.trait_ref.trait_def_id() else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
@ -198,9 +198,9 @@ impl<'tcx> LateLintPass<'tcx> for TraitBounds {
|
||||||
// If the number of unique traits isn't the same as the number of traits in the bounds,
|
// If the number of unique traits isn't the same as the number of traits in the bounds,
|
||||||
// there must be 1 or more duplicates
|
// there must be 1 or more duplicates
|
||||||
if bounds.len() != unique_traits.len() {
|
if bounds.len() != unique_traits.len() {
|
||||||
let mut bounds_span = bounds[0].span;
|
let mut bounds_span = bounds[0].0.span;
|
||||||
|
|
||||||
for bound in bounds.iter().skip(1) {
|
for (bound, _) in bounds.iter().skip(1) {
|
||||||
bounds_span = bounds_span.to(bound.span);
|
bounds_span = bounds_span.to(bound.span);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,15 +81,16 @@ pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, lt: &Lifetime, m
|
||||||
|
|
||||||
// Returns true if given type is `Any` trait.
|
// Returns true if given type is `Any` trait.
|
||||||
fn is_any_trait(cx: &LateContext<'_>, t: &hir::Ty<'_>) -> bool {
|
fn is_any_trait(cx: &LateContext<'_>, t: &hir::Ty<'_>) -> bool {
|
||||||
if let TyKind::TraitObject(traits, ..) = t.kind
|
if let TyKind::TraitObject(traits, ..) = t.kind {
|
||||||
&& !traits.is_empty()
|
return traits.iter().any(|(bound, _)| {
|
||||||
&& let Some(trait_did) = traits[0].trait_ref.trait_def_id()
|
if let Some(trait_did) = bound.trait_ref.trait_def_id()
|
||||||
// Only Send/Sync can be used as additional traits, so it is enough to
|
|
||||||
// check only the first trait.
|
|
||||||
&& cx.tcx.is_diagnostic_item(sym::Any, trait_did)
|
&& cx.tcx.is_diagnostic_item(sym::Any, trait_did)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ impl<'tcx> Visitor<'tcx> for TypeComplexityVisitor {
|
||||||
TyKind::TraitObject(param_bounds, _, _) => {
|
TyKind::TraitObject(param_bounds, _, _) => {
|
||||||
let has_lifetime_parameters = param_bounds.iter().any(|bound| {
|
let has_lifetime_parameters = param_bounds.iter().any(|bound| {
|
||||||
bound
|
bound
|
||||||
|
.0
|
||||||
.bound_generic_params
|
.bound_generic_params
|
||||||
.iter()
|
.iter()
|
||||||
.any(|param| matches!(param.kind, GenericParamKind::Lifetime { .. }))
|
.any(|param| matches!(param.kind, GenericParamKind::Lifetime { .. }))
|
||||||
|
|
|
@ -145,7 +145,9 @@ impl<'tcx> LateLintPass<'tcx> for UnnecessaryWraps {
|
||||||
(
|
(
|
||||||
"this function's return value is unnecessary".to_string(),
|
"this function's return value is unnecessary".to_string(),
|
||||||
"remove the return type...".to_string(),
|
"remove the return type...".to_string(),
|
||||||
snippet(cx, fn_decl.output.span(), "..").to_string(),
|
// FIXME: we should instead get the span including the `->` and suggest an
|
||||||
|
// empty string for this case.
|
||||||
|
"()".to_string(),
|
||||||
"...and then remove returned values",
|
"...and then remove returned values",
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -16,7 +16,6 @@ pub const BINARYHEAP_ITER: [&str; 5] = ["alloc", "collections", "binary_heap", "
|
||||||
pub const BTREEMAP_CONTAINS_KEY: [&str; 6] = ["alloc", "collections", "btree", "map", "BTreeMap", "contains_key"];
|
pub const BTREEMAP_CONTAINS_KEY: [&str; 6] = ["alloc", "collections", "btree", "map", "BTreeMap", "contains_key"];
|
||||||
pub const BTREEMAP_INSERT: [&str; 6] = ["alloc", "collections", "btree", "map", "BTreeMap", "insert"];
|
pub const BTREEMAP_INSERT: [&str; 6] = ["alloc", "collections", "btree", "map", "BTreeMap", "insert"];
|
||||||
pub const BTREESET_ITER: [&str; 6] = ["alloc", "collections", "btree", "set", "BTreeSet", "iter"];
|
pub const BTREESET_ITER: [&str; 6] = ["alloc", "collections", "btree", "set", "BTreeSet", "iter"];
|
||||||
pub const CLONE_TRAIT_METHOD: [&str; 4] = ["core", "clone", "Clone", "clone"];
|
|
||||||
pub const CORE_ITER_CLONED: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "cloned"];
|
pub const CORE_ITER_CLONED: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "cloned"];
|
||||||
pub const CORE_ITER_COPIED: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "copied"];
|
pub const CORE_ITER_COPIED: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "copied"];
|
||||||
pub const CORE_ITER_FILTER: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "filter"];
|
pub const CORE_ITER_FILTER: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "filter"];
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "nightly-2024-07-25"
|
channel = "nightly-2024-08-08"
|
||||||
components = ["cargo", "llvm-tools", "rust-src", "rust-std", "rustc", "rustc-dev", "rustfmt"]
|
components = ["cargo", "llvm-tools", "rust-src", "rust-std", "rustc", "rustc-dev", "rustfmt"]
|
||||||
profile = "minimal"
|
profile = "minimal"
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#![feature(is_sorted)]
|
|
||||||
#![warn(rust_2018_idioms, unused_lifetimes)]
|
#![warn(rust_2018_idioms, unused_lifetimes)]
|
||||||
#![allow(unused_extern_crates)]
|
#![allow(unused_extern_crates)]
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#![feature(const_int_from_str)]
|
|
||||||
#![warn(clippy::from_str_radix_10)]
|
#![warn(clippy::from_str_radix_10)]
|
||||||
|
|
||||||
mod some_mod {
|
mod some_mod {
|
||||||
|
@ -61,7 +60,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn issue_12732() {
|
// https://github.com/rust-lang/rust-clippy/issues/12731
|
||||||
|
fn issue_12731() {
|
||||||
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
|
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
|
||||||
const B: () = {
|
const B: () = {
|
||||||
let _ = u32::from_str_radix("123", 10);
|
let _ = u32::from_str_radix("123", 10);
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#![feature(const_int_from_str)]
|
|
||||||
#![warn(clippy::from_str_radix_10)]
|
#![warn(clippy::from_str_radix_10)]
|
||||||
|
|
||||||
mod some_mod {
|
mod some_mod {
|
||||||
|
@ -61,7 +60,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn issue_12732() {
|
// https://github.com/rust-lang/rust-clippy/issues/12731
|
||||||
|
fn issue_12731() {
|
||||||
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
|
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
|
||||||
const B: () = {
|
const B: () = {
|
||||||
let _ = u32::from_str_radix("123", 10);
|
let _ = u32::from_str_radix("123", 10);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:29:5
|
--> tests/ui/from_str_radix_10.rs:28:5
|
||||||
|
|
|
|
||||||
LL | u32::from_str_radix("30", 10)?;
|
LL | u32::from_str_radix("30", 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"30".parse::<u32>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"30".parse::<u32>()`
|
||||||
|
@ -8,43 +8,43 @@ LL | u32::from_str_radix("30", 10)?;
|
||||||
= help: to override `-D warnings` add `#[allow(clippy::from_str_radix_10)]`
|
= help: to override `-D warnings` add `#[allow(clippy::from_str_radix_10)]`
|
||||||
|
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:32:5
|
--> tests/ui/from_str_radix_10.rs:31:5
|
||||||
|
|
|
|
||||||
LL | i64::from_str_radix("24", 10)?;
|
LL | i64::from_str_radix("24", 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"24".parse::<i64>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"24".parse::<i64>()`
|
||||||
|
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:34:5
|
--> tests/ui/from_str_radix_10.rs:33:5
|
||||||
|
|
|
|
||||||
LL | isize::from_str_radix("100", 10)?;
|
LL | isize::from_str_radix("100", 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"100".parse::<isize>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"100".parse::<isize>()`
|
||||||
|
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:36:5
|
--> tests/ui/from_str_radix_10.rs:35:5
|
||||||
|
|
|
|
||||||
LL | u8::from_str_radix("7", 10)?;
|
LL | u8::from_str_radix("7", 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"7".parse::<u8>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"7".parse::<u8>()`
|
||||||
|
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:38:5
|
--> tests/ui/from_str_radix_10.rs:37:5
|
||||||
|
|
|
|
||||||
LL | u16::from_str_radix(&("10".to_owned() + "5"), 10)?;
|
LL | u16::from_str_radix(&("10".to_owned() + "5"), 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("10".to_owned() + "5").parse::<u16>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("10".to_owned() + "5").parse::<u16>()`
|
||||||
|
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:40:5
|
--> tests/ui/from_str_radix_10.rs:39:5
|
||||||
|
|
|
|
||||||
LL | i128::from_str_radix(Test + Test, 10)?;
|
LL | i128::from_str_radix(Test + Test, 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(Test + Test).parse::<i128>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(Test + Test).parse::<i128>()`
|
||||||
|
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:44:5
|
--> tests/ui/from_str_radix_10.rs:43:5
|
||||||
|
|
|
|
||||||
LL | i32::from_str_radix(string, 10)?;
|
LL | i32::from_str_radix(string, 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `string.parse::<i32>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `string.parse::<i32>()`
|
||||||
|
|
||||||
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
|
||||||
--> tests/ui/from_str_radix_10.rs:48:5
|
--> tests/ui/from_str_radix_10.rs:47:5
|
||||||
|
|
|
|
||||||
LL | i32::from_str_radix(&stringier, 10)?;
|
LL | i32::from_str_radix(&stringier, 10)?;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `stringier.parse::<i32>()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `stringier.parse::<i32>()`
|
||||||
|
|
|
@ -20,40 +20,6 @@ fn main() {
|
||||||
1 ^ (1 - 1);
|
1 ^ (1 - 1);
|
||||||
3 | (2 - 1);
|
3 | (2 - 1);
|
||||||
3 & (5 - 2);
|
3 & (5 - 2);
|
||||||
-(1i32.abs());
|
|
||||||
-(1f32.abs());
|
|
||||||
|
|
||||||
// These should not trigger an error
|
|
||||||
let _ = (-1i32).abs();
|
|
||||||
let _ = (-1f32).abs();
|
|
||||||
let _ = -(1i32).abs();
|
|
||||||
let _ = -(1f32).abs();
|
|
||||||
let _ = -(1i32.abs());
|
|
||||||
let _ = -(1f32.abs());
|
|
||||||
|
|
||||||
// Odd functions should not trigger an error
|
|
||||||
let _ = -1f64.asin();
|
|
||||||
let _ = -1f64.asinh();
|
|
||||||
let _ = -1f64.atan();
|
|
||||||
let _ = -1f64.atanh();
|
|
||||||
let _ = -1f64.cbrt();
|
|
||||||
let _ = -1f64.fract();
|
|
||||||
let _ = -1f64.round();
|
|
||||||
let _ = -1f64.signum();
|
|
||||||
let _ = -1f64.sin();
|
|
||||||
let _ = -1f64.sinh();
|
|
||||||
let _ = -1f64.tan();
|
|
||||||
let _ = -1f64.tanh();
|
|
||||||
let _ = -1f64.to_degrees();
|
|
||||||
let _ = -1f64.to_radians();
|
|
||||||
|
|
||||||
// Chains containing any non-odd function should trigger (issue #5924)
|
|
||||||
let _ = -(1.0_f64.cos().cos());
|
|
||||||
let _ = -(1.0_f64.cos().sin());
|
|
||||||
let _ = -(1.0_f64.sin().cos());
|
|
||||||
|
|
||||||
// Chains of odd functions shouldn't trigger
|
|
||||||
let _ = -1f64.sin().sin();
|
|
||||||
|
|
||||||
let b = 3;
|
let b = 3;
|
||||||
trip!(b * 8);
|
trip!(b * 8);
|
||||||
|
|
|
@ -20,40 +20,6 @@ fn main() {
|
||||||
1 ^ 1 - 1;
|
1 ^ 1 - 1;
|
||||||
3 | 2 - 1;
|
3 | 2 - 1;
|
||||||
3 & 5 - 2;
|
3 & 5 - 2;
|
||||||
-1i32.abs();
|
|
||||||
-1f32.abs();
|
|
||||||
|
|
||||||
// These should not trigger an error
|
|
||||||
let _ = (-1i32).abs();
|
|
||||||
let _ = (-1f32).abs();
|
|
||||||
let _ = -(1i32).abs();
|
|
||||||
let _ = -(1f32).abs();
|
|
||||||
let _ = -(1i32.abs());
|
|
||||||
let _ = -(1f32.abs());
|
|
||||||
|
|
||||||
// Odd functions should not trigger an error
|
|
||||||
let _ = -1f64.asin();
|
|
||||||
let _ = -1f64.asinh();
|
|
||||||
let _ = -1f64.atan();
|
|
||||||
let _ = -1f64.atanh();
|
|
||||||
let _ = -1f64.cbrt();
|
|
||||||
let _ = -1f64.fract();
|
|
||||||
let _ = -1f64.round();
|
|
||||||
let _ = -1f64.signum();
|
|
||||||
let _ = -1f64.sin();
|
|
||||||
let _ = -1f64.sinh();
|
|
||||||
let _ = -1f64.tan();
|
|
||||||
let _ = -1f64.tanh();
|
|
||||||
let _ = -1f64.to_degrees();
|
|
||||||
let _ = -1f64.to_radians();
|
|
||||||
|
|
||||||
// Chains containing any non-odd function should trigger (issue #5924)
|
|
||||||
let _ = -1.0_f64.cos().cos();
|
|
||||||
let _ = -1.0_f64.cos().sin();
|
|
||||||
let _ = -1.0_f64.sin().cos();
|
|
||||||
|
|
||||||
// Chains of odd functions shouldn't trigger
|
|
||||||
let _ = -1f64.sin().sin();
|
|
||||||
|
|
||||||
let b = 3;
|
let b = 3;
|
||||||
trip!(b * 8);
|
trip!(b * 8);
|
||||||
|
|
|
@ -43,35 +43,5 @@ error: operator precedence can trip the unwary
|
||||||
LL | 3 & 5 - 2;
|
LL | 3 & 5 - 2;
|
||||||
| ^^^^^^^^^ help: consider parenthesizing your expression: `3 & (5 - 2)`
|
| ^^^^^^^^^ help: consider parenthesizing your expression: `3 & (5 - 2)`
|
||||||
|
|
||||||
error: unary minus has lower precedence than method call
|
error: aborting due to 7 previous errors
|
||||||
--> tests/ui/precedence.rs:23:5
|
|
||||||
|
|
|
||||||
LL | -1i32.abs();
|
|
||||||
| ^^^^^^^^^^^ help: consider adding parentheses to clarify your intent: `-(1i32.abs())`
|
|
||||||
|
|
||||||
error: unary minus has lower precedence than method call
|
|
||||||
--> tests/ui/precedence.rs:24:5
|
|
||||||
|
|
|
||||||
LL | -1f32.abs();
|
|
||||||
| ^^^^^^^^^^^ help: consider adding parentheses to clarify your intent: `-(1f32.abs())`
|
|
||||||
|
|
||||||
error: unary minus has lower precedence than method call
|
|
||||||
--> tests/ui/precedence.rs:51:13
|
|
||||||
|
|
|
||||||
LL | let _ = -1.0_f64.cos().cos();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^ help: consider adding parentheses to clarify your intent: `-(1.0_f64.cos().cos())`
|
|
||||||
|
|
||||||
error: unary minus has lower precedence than method call
|
|
||||||
--> tests/ui/precedence.rs:52:13
|
|
||||||
|
|
|
||||||
LL | let _ = -1.0_f64.cos().sin();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^ help: consider adding parentheses to clarify your intent: `-(1.0_f64.cos().sin())`
|
|
||||||
|
|
||||||
error: unary minus has lower precedence than method call
|
|
||||||
--> tests/ui/precedence.rs:53:13
|
|
||||||
|
|
|
||||||
LL | let _ = -1.0_f64.sin().cos();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^ help: consider adding parentheses to clarify your intent: `-(1.0_f64.sin().cos())`
|
|
||||||
|
|
||||||
error: aborting due to 12 previous errors
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#![warn(clippy::uninit_vec)]
|
#![warn(clippy::uninit_vec)]
|
||||||
|
|
||||||
|
use std::cell::UnsafeCell;
|
||||||
use std::mem::MaybeUninit;
|
use std::mem::MaybeUninit;
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -12,6 +13,12 @@ union MyOwnMaybeUninit {
|
||||||
uninit: (),
|
uninit: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/rust-lang/rust/issues/119620
|
||||||
|
unsafe fn requires_paramenv<S>() {
|
||||||
|
let mut vec = Vec::<UnsafeCell<*mut S>>::with_capacity(1);
|
||||||
|
vec.set_len(1);
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// with_capacity() -> set_len() should be detected
|
// with_capacity() -> set_len() should be detected
|
||||||
let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
||||||
|
|
|
@ -1,5 +1,17 @@
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:17:5
|
--> tests/ui/uninit_vec.rs:18:5
|
||||||
|
|
|
||||||
|
LL | let mut vec = Vec::<UnsafeCell<*mut S>>::with_capacity(1);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
LL | vec.set_len(1);
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
= note: `-D clippy::uninit-vec` implied by `-D warnings`
|
||||||
|
= help: to override `-D warnings` add `#[allow(clippy::uninit_vec)]`
|
||||||
|
|
||||||
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
|
--> tests/ui/uninit_vec.rs:24:5
|
||||||
|
|
|
|
||||||
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -8,11 +20,9 @@ LL | vec.set_len(200);
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
= note: `-D clippy::uninit-vec` implied by `-D warnings`
|
|
||||||
= help: to override `-D warnings` add `#[allow(clippy::uninit_vec)]`
|
|
||||||
|
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:24:5
|
--> tests/ui/uninit_vec.rs:31:5
|
||||||
|
|
|
|
||||||
LL | vec.reserve(1000);
|
LL | vec.reserve(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -23,7 +33,7 @@ LL | vec.set_len(200);
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
|
||||||
error: calling `set_len()` on empty `Vec` creates out-of-bound values
|
error: calling `set_len()` on empty `Vec` creates out-of-bound values
|
||||||
--> tests/ui/uninit_vec.rs:31:5
|
--> tests/ui/uninit_vec.rs:38:5
|
||||||
|
|
|
|
||||||
LL | let mut vec: Vec<u8> = Vec::new();
|
LL | let mut vec: Vec<u8> = Vec::new();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -32,7 +42,7 @@ LL | vec.set_len(200);
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: calling `set_len()` on empty `Vec` creates out-of-bound values
|
error: calling `set_len()` on empty `Vec` creates out-of-bound values
|
||||||
--> tests/ui/uninit_vec.rs:38:5
|
--> tests/ui/uninit_vec.rs:45:5
|
||||||
|
|
|
|
||||||
LL | let mut vec: Vec<u8> = Default::default();
|
LL | let mut vec: Vec<u8> = Default::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -41,7 +51,7 @@ LL | vec.set_len(200);
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: calling `set_len()` on empty `Vec` creates out-of-bound values
|
error: calling `set_len()` on empty `Vec` creates out-of-bound values
|
||||||
--> tests/ui/uninit_vec.rs:44:5
|
--> tests/ui/uninit_vec.rs:51:5
|
||||||
|
|
|
|
||||||
LL | let mut vec: Vec<u8> = Vec::default();
|
LL | let mut vec: Vec<u8> = Vec::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -50,7 +60,7 @@ LL | vec.set_len(200);
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:61:5
|
--> tests/ui/uninit_vec.rs:68:5
|
||||||
|
|
|
|
||||||
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -61,7 +71,7 @@ LL | vec.set_len(200);
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:71:5
|
--> tests/ui/uninit_vec.rs:78:5
|
||||||
|
|
|
|
||||||
LL | my_vec.vec.reserve(1000);
|
LL | my_vec.vec.reserve(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -72,7 +82,7 @@ LL | my_vec.vec.set_len(200);
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:77:5
|
--> tests/ui/uninit_vec.rs:84:5
|
||||||
|
|
|
|
||||||
LL | my_vec.vec = Vec::with_capacity(1000);
|
LL | my_vec.vec = Vec::with_capacity(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -83,7 +93,7 @@ LL | my_vec.vec.set_len(200);
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:52:9
|
--> tests/ui/uninit_vec.rs:59:9
|
||||||
|
|
|
|
||||||
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -94,7 +104,7 @@ LL | vec.set_len(200);
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:56:9
|
--> tests/ui/uninit_vec.rs:63:9
|
||||||
|
|
|
|
||||||
LL | vec.reserve(1000);
|
LL | vec.reserve(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -105,7 +115,7 @@ LL | vec.set_len(200);
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
|
||||||
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
|
||||||
--> tests/ui/uninit_vec.rs:132:9
|
--> tests/ui/uninit_vec.rs:139:9
|
||||||
|
|
|
|
||||||
LL | let mut vec: Vec<T> = Vec::with_capacity(1000);
|
LL | let mut vec: Vec<T> = Vec::with_capacity(1000);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -115,5 +125,5 @@ LL | vec.set_len(10);
|
||||||
|
|
|
|
||||||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||||
|
|
||||||
error: aborting due to 11 previous errors
|
error: aborting due to 12 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#![allow(clippy::needless_return)]
|
#![allow(clippy::needless_return)]
|
||||||
#![allow(clippy::unused_unit)]
|
#![allow(clippy::unused_unit)]
|
||||||
#![allow(clippy::useless_vec)]
|
#![allow(clippy::useless_vec)]
|
||||||
#![feature(is_sorted)]
|
|
||||||
|
|
||||||
struct Struct {
|
struct Struct {
|
||||||
field: isize,
|
field: isize,
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
error: this closure returns the unit type which also implements Ord
|
error: this closure returns the unit type which also implements Ord
|
||||||
--> tests/ui/unit_return_expecting_ord.rs:19:25
|
--> tests/ui/unit_return_expecting_ord.rs:18:25
|
||||||
|
|
|
|
||||||
LL | structs.sort_by_key(|s| {
|
LL | structs.sort_by_key(|s| {
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
help: probably caused by this trailing semicolon
|
help: probably caused by this trailing semicolon
|
||||||
--> tests/ui/unit_return_expecting_ord.rs:21:24
|
--> tests/ui/unit_return_expecting_ord.rs:20:24
|
||||||
|
|
|
|
||||||
LL | double(s.field);
|
LL | double(s.field);
|
||||||
| ^
|
| ^
|
||||||
|
@ -13,25 +13,25 @@ LL | double(s.field);
|
||||||
= help: to override `-D warnings` add `#[allow(clippy::unit_return_expecting_ord)]`
|
= help: to override `-D warnings` add `#[allow(clippy::unit_return_expecting_ord)]`
|
||||||
|
|
||||||
error: this closure returns the unit type which also implements PartialOrd
|
error: this closure returns the unit type which also implements PartialOrd
|
||||||
--> tests/ui/unit_return_expecting_ord.rs:24:30
|
--> tests/ui/unit_return_expecting_ord.rs:23:30
|
||||||
|
|
|
|
||||||
LL | structs.is_sorted_by_key(|s| {
|
LL | structs.is_sorted_by_key(|s| {
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
help: probably caused by this trailing semicolon
|
help: probably caused by this trailing semicolon
|
||||||
--> tests/ui/unit_return_expecting_ord.rs:26:24
|
--> tests/ui/unit_return_expecting_ord.rs:25:24
|
||||||
|
|
|
|
||||||
LL | double(s.field);
|
LL | double(s.field);
|
||||||
| ^
|
| ^
|
||||||
|
|
||||||
error: this closure returns the unit type which also implements PartialOrd
|
error: this closure returns the unit type which also implements PartialOrd
|
||||||
--> tests/ui/unit_return_expecting_ord.rs:28:30
|
--> tests/ui/unit_return_expecting_ord.rs:27:30
|
||||||
|
|
|
|
||||||
LL | structs.is_sorted_by_key(|s| {
|
LL | structs.is_sorted_by_key(|s| {
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error: this closure returns the unit type which also implements Ord
|
error: this closure returns the unit type which also implements Ord
|
||||||
--> tests/ui/unit_return_expecting_ord.rs:39:25
|
--> tests/ui/unit_return_expecting_ord.rs:38:25
|
||||||
|
|
|
|
||||||
LL | structs.sort_by_key(|s| unit(s.field));
|
LL | structs.sort_by_key(|s| unit(s.field));
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
@ -206,7 +206,7 @@ mod fixable {
|
||||||
|
|
||||||
fn issue_9563() {
|
fn issue_9563() {
|
||||||
let _: f64 = (-8.0_f64).exp();
|
let _: f64 = (-8.0_f64).exp();
|
||||||
#[allow(clippy::precedence)]
|
#[allow(ambiguous_negative_literals)]
|
||||||
let _: f64 = -8.0_f64.exp(); // should suggest `-8.0_f64.exp()` here not to change code behavior
|
let _: f64 = -8.0_f64.exp(); // should suggest `-8.0_f64.exp()` here not to change code behavior
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,7 @@ mod fixable {
|
||||||
|
|
||||||
fn issue_9563() {
|
fn issue_9563() {
|
||||||
let _: f64 = (-8.0 as f64).exp();
|
let _: f64 = (-8.0 as f64).exp();
|
||||||
#[allow(clippy::precedence)]
|
#[allow(ambiguous_negative_literals)]
|
||||||
let _: f64 = -(8.0 as f64).exp(); // should suggest `-8.0_f64.exp()` here not to change code behavior
|
let _: f64 = -(8.0 as f64).exp(); // should suggest `-8.0_f64.exp()` here not to change code behavior
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ LL | let _val = None::<()>.expect("this always happens");
|
||||||
help: remove the `None` and `expect()`
|
help: remove the `None` and `expect()`
|
||||||
|
|
|
|
||||||
LL | let _val = panic!("this always happens");
|
LL | let _val = panic!("this always happens");
|
||||||
| ~~~~~~~ ~
|
| ~~~~~~~
|
||||||
|
|
||||||
error: used `unwrap_or_default()` on `None` value
|
error: used `unwrap_or_default()` on `None` value
|
||||||
--> tests/ui/unnecessary_literal_unwrap.rs:22:24
|
--> tests/ui/unnecessary_literal_unwrap.rs:22:24
|
||||||
|
@ -134,7 +134,7 @@ LL | None::<()>.expect("this always happens");
|
||||||
help: remove the `None` and `expect()`
|
help: remove the `None` and `expect()`
|
||||||
|
|
|
|
||||||
LL | panic!("this always happens");
|
LL | panic!("this always happens");
|
||||||
| ~~~~~~~ ~
|
| ~~~~~~~
|
||||||
|
|
||||||
error: used `unwrap_or_default()` on `None` value
|
error: used `unwrap_or_default()` on `None` value
|
||||||
--> tests/ui/unnecessary_literal_unwrap.rs:30:5
|
--> tests/ui/unnecessary_literal_unwrap.rs:30:5
|
||||||
|
|
|
@ -118,8 +118,8 @@ LL | | }
|
||||||
|
|
|
|
||||||
help: remove the return type...
|
help: remove the return type...
|
||||||
|
|
|
|
||||||
LL | fn issue_6640_1(a: bool, b: bool) -> Option<()> {
|
LL | fn issue_6640_1(a: bool, b: bool) -> () {
|
||||||
| ~~~~~~~~~~
|
| ~~
|
||||||
help: ...and then remove returned values
|
help: ...and then remove returned values
|
||||||
|
|
|
|
||||||
LL ~ return ;
|
LL ~ return ;
|
||||||
|
@ -145,8 +145,8 @@ LL | | }
|
||||||
|
|
|
|
||||||
help: remove the return type...
|
help: remove the return type...
|
||||||
|
|
|
|
||||||
LL | fn issue_6640_2(a: bool, b: bool) -> Result<(), i32> {
|
LL | fn issue_6640_2(a: bool, b: bool) -> () {
|
||||||
| ~~~~~~~~~~~~~~~
|
| ~~
|
||||||
help: ...and then remove returned values
|
help: ...and then remove returned values
|
||||||
|
|
|
|
||||||
LL ~ return ;
|
LL ~ return ;
|
||||||
|
|
Loading…
Reference in a new issue