mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-27 15:11:30 +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(f16)]
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(is_sorted)]
|
||||
#![feature(iter_intersperse)]
|
||||
#![feature(iter_partition_in_place)]
|
||||
#![feature(let_chains)]
|
||||
|
|
|
@ -543,7 +543,7 @@ impl<'a, 'tcx> Visitor<'tcx> for RefVisitor<'a, 'tcx> {
|
|||
if !lt.is_elided() {
|
||||
self.unelided_trait_object_lifetime = true;
|
||||
}
|
||||
for bound in bounds {
|
||||
for (bound, _) in bounds {
|
||||
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::source::snippet_with_applicability;
|
||||
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_hir as hir;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::{self as hir, LangItem};
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::mir::Mutability;
|
||||
use rustc_middle::ty;
|
||||
|
@ -114,7 +114,7 @@ fn handle_path(
|
|||
recv: &hir::Expr<'_>,
|
||||
) {
|
||||
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`
|
||||
// and `Result`.
|
||||
|
|
|
@ -2,10 +2,10 @@ use clippy_utils::diagnostics::span_lint_and_sugg;
|
|||
use clippy_utils::source::snippet_with_applicability;
|
||||
use clippy_utils::ty::{should_call_clone_as_function, walk_ptrs_ty_depth};
|
||||
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_hir as hir;
|
||||
use rustc_hir::{self as hir, LangItem};
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::ty::adjustment::Adjust;
|
||||
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 {
|
||||
// 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() {
|
||||
match_def_path(cx, path_def_id, &paths::CLONE_TRAIT_METHOD)
|
||||
cx.tcx.lang_items().get(LangItem::CloneFn) == Some(path_def_id)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
|
|
@ -1,38 +1,17 @@
|
|||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::source::snippet_with_applicability;
|
||||
use rustc_ast::ast::{BinOpKind, Expr, ExprKind, MethodCall, UnOp};
|
||||
use rustc_ast::token;
|
||||
use rustc_ast::ast::{BinOpKind, Expr, ExprKind};
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_lint::{EarlyContext, EarlyLintPass};
|
||||
use rustc_session::declare_lint_pass;
|
||||
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! {
|
||||
/// ### What it does
|
||||
/// Checks for operations where precedence may be unclear
|
||||
/// and suggests to add parentheses. Currently it catches the following:
|
||||
/// * mixed usage of arithmetic and bit shifting/combining operators without
|
||||
/// parentheses
|
||||
/// * a "negative" numeric literal (which is really a unary `-` followed by a
|
||||
/// numeric literal)
|
||||
/// followed by a method call
|
||||
///
|
||||
/// ### Why is this bad?
|
||||
/// Not everyone knows the precedence of those operators by
|
||||
|
@ -41,7 +20,6 @@ declare_clippy_lint! {
|
|||
///
|
||||
/// ### Example
|
||||
/// * `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"]
|
||||
pub PRECEDENCE,
|
||||
complexity,
|
||||
|
@ -104,38 +82,6 @@ impl EarlyLintPass for Precedence {
|
|||
(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) =
|
||||
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_string_method, fn_def_id)
|
||||
&& 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
|
||||
// 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 {
|
||||
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,
|
||||
// there must be 1 or more duplicates
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -81,14 +81,15 @@ pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, lt: &Lifetime, m
|
|||
|
||||
// Returns true if given type is `Any` trait.
|
||||
fn is_any_trait(cx: &LateContext<'_>, t: &hir::Ty<'_>) -> bool {
|
||||
if let TyKind::TraitObject(traits, ..) = t.kind
|
||||
&& !traits.is_empty()
|
||||
&& let Some(trait_did) = traits[0].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)
|
||||
{
|
||||
return true;
|
||||
if let TyKind::TraitObject(traits, ..) = t.kind {
|
||||
return traits.iter().any(|(bound, _)| {
|
||||
if let Some(trait_did) = bound.trait_ref.trait_def_id()
|
||||
&& cx.tcx.is_diagnostic_item(sym::Any, trait_did)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
false
|
||||
});
|
||||
}
|
||||
|
||||
false
|
||||
|
|
|
@ -55,6 +55,7 @@ impl<'tcx> Visitor<'tcx> for TypeComplexityVisitor {
|
|||
TyKind::TraitObject(param_bounds, _, _) => {
|
||||
let has_lifetime_parameters = param_bounds.iter().any(|bound| {
|
||||
bound
|
||||
.0
|
||||
.bound_generic_params
|
||||
.iter()
|
||||
.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(),
|
||||
"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",
|
||||
)
|
||||
} 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_INSERT: [&str; 6] = ["alloc", "collections", "btree", "map", "BTreeMap", "insert"];
|
||||
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_COPIED: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "copied"];
|
||||
pub const CORE_ITER_FILTER: [&str; 6] = ["core", "iter", "traits", "iterator", "Iterator", "filter"];
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[toolchain]
|
||||
channel = "nightly-2024-07-25"
|
||||
channel = "nightly-2024-08-08"
|
||||
components = ["cargo", "llvm-tools", "rust-src", "rust-std", "rustc", "rustc-dev", "rustfmt"]
|
||||
profile = "minimal"
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
#![feature(is_sorted)]
|
||||
#![warn(rust_2018_idioms, unused_lifetimes)]
|
||||
#![allow(unused_extern_crates)]
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
#![feature(const_int_from_str)]
|
||||
#![warn(clippy::from_str_radix_10)]
|
||||
|
||||
mod some_mod {
|
||||
|
@ -61,7 +60,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
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 B: () = {
|
||||
let _ = u32::from_str_radix("123", 10);
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
#![feature(const_int_from_str)]
|
||||
#![warn(clippy::from_str_radix_10)]
|
||||
|
||||
mod some_mod {
|
||||
|
@ -61,7 +60,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
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 B: () = {
|
||||
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`
|
||||
--> 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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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)]`
|
||||
|
||||
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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"24".parse::<i64>()`
|
||||
|
||||
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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"100".parse::<isize>()`
|
||||
|
||||
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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"7".parse::<u8>()`
|
||||
|
||||
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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("10".to_owned() + "5").parse::<u16>()`
|
||||
|
||||
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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(Test + Test).parse::<i128>()`
|
||||
|
||||
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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `string.parse::<i32>()`
|
||||
|
||||
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)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `stringier.parse::<i32>()`
|
||||
|
|
|
@ -20,40 +20,6 @@ fn main() {
|
|||
1 ^ (1 - 1);
|
||||
3 | (2 - 1);
|
||||
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;
|
||||
trip!(b * 8);
|
||||
|
|
|
@ -20,40 +20,6 @@ fn main() {
|
|||
1 ^ 1 - 1;
|
||||
3 | 2 - 1;
|
||||
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;
|
||||
trip!(b * 8);
|
||||
|
|
|
@ -43,35 +43,5 @@ error: operator precedence can trip the unwary
|
|||
LL | 3 & 5 - 2;
|
||||
| ^^^^^^^^^ help: consider parenthesizing your expression: `3 & (5 - 2)`
|
||||
|
||||
error: unary minus has lower precedence than method call
|
||||
--> 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
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#![warn(clippy::uninit_vec)]
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
use std::mem::MaybeUninit;
|
||||
|
||||
#[derive(Default)]
|
||||
|
@ -12,6 +13,12 @@ union MyOwnMaybeUninit {
|
|||
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() {
|
||||
// with_capacity() -> set_len() should be detected
|
||||
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
|
||||
--> 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);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -8,11 +20,9 @@ LL | vec.set_len(200);
|
|||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= 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
|
||||
--> tests/ui/uninit_vec.rs:31:5
|
||||
|
|
||||
LL | vec.reserve(1000);
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
@ -23,7 +33,7 @@ LL | vec.set_len(200);
|
|||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||
|
||||
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();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -32,7 +42,7 @@ LL | vec.set_len(200);
|
|||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
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();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -41,7 +51,7 @@ LL | vec.set_len(200);
|
|||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
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();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -50,7 +60,7 @@ LL | vec.set_len(200);
|
|||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
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);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -61,7 +71,7 @@ LL | vec.set_len(200);
|
|||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||
|
||||
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);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -72,7 +82,7 @@ LL | my_vec.vec.set_len(200);
|
|||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||
|
||||
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);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -83,7 +93,7 @@ LL | my_vec.vec.set_len(200);
|
|||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||
|
||||
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);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -94,7 +104,7 @@ LL | vec.set_len(200);
|
|||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||
|
||||
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);
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
@ -105,7 +115,7 @@ LL | vec.set_len(200);
|
|||
= help: initialize the buffer or wrap the content in `MaybeUninit`
|
||||
|
||||
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);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -115,5 +125,5 @@ LL | vec.set_len(10);
|
|||
|
|
||||
= 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::unused_unit)]
|
||||
#![allow(clippy::useless_vec)]
|
||||
#![feature(is_sorted)]
|
||||
|
||||
struct Struct {
|
||||
field: isize,
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
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| {
|
||||
| ^^^
|
||||
|
|
||||
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);
|
||||
| ^
|
||||
|
@ -13,25 +13,25 @@ LL | double(s.field);
|
|||
= help: to override `-D warnings` add `#[allow(clippy::unit_return_expecting_ord)]`
|
||||
|
||||
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| {
|
||||
| ^^^
|
||||
|
|
||||
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);
|
||||
| ^
|
||||
|
||||
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| {
|
||||
| ^^^
|
||||
|
||||
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));
|
||||
| ^^^
|
||||
|
|
|
@ -206,7 +206,7 @@ mod fixable {
|
|||
|
||||
fn issue_9563() {
|
||||
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
|
||||
}
|
||||
|
||||
|
|
|
@ -206,7 +206,7 @@ mod fixable {
|
|||
|
||||
fn issue_9563() {
|
||||
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
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ LL | let _val = None::<()>.expect("this always happens");
|
|||
help: remove the `None` and `expect()`
|
||||
|
|
||||
LL | let _val = panic!("this always happens");
|
||||
| ~~~~~~~ ~
|
||||
| ~~~~~~~
|
||||
|
||||
error: used `unwrap_or_default()` on `None` value
|
||||
--> tests/ui/unnecessary_literal_unwrap.rs:22:24
|
||||
|
@ -134,7 +134,7 @@ LL | None::<()>.expect("this always happens");
|
|||
help: remove the `None` and `expect()`
|
||||
|
|
||||
LL | panic!("this always happens");
|
||||
| ~~~~~~~ ~
|
||||
| ~~~~~~~
|
||||
|
||||
error: used `unwrap_or_default()` on `None` value
|
||||
--> tests/ui/unnecessary_literal_unwrap.rs:30:5
|
||||
|
|
|
@ -118,8 +118,8 @@ LL | | }
|
|||
|
|
||||
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
|
||||
|
|
||||
LL ~ return ;
|
||||
|
@ -145,8 +145,8 @@ LL | | }
|
|||
|
|
||||
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
|
||||
|
|
||||
LL ~ return ;
|
||||
|
|
Loading…
Reference in a new issue