Auto merge of #9282 - macovedj:clone-on-copy-try-precedence, r=flip1995
add paren before '?' when suggesting deref for clone_on_copy changelog: none fixes #9277
This commit is contained in:
commit
5dc90a1b6d
@ -4,7 +4,7 @@
|
||||
use clippy_utils::sugg;
|
||||
use clippy_utils::ty::is_copy;
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_hir::{BindingAnnotation, Expr, ExprKind, MatchSource, Node, PatKind};
|
||||
use rustc_hir::{BindingAnnotation, Expr, ExprKind, MatchSource, Node, PatKind, QPath};
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::ty::{self, adjustment::Adjust};
|
||||
use rustc_span::symbol::{sym, Symbol};
|
||||
@ -86,6 +86,11 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, method_name: Symbol,
|
||||
{
|
||||
return;
|
||||
},
|
||||
// ? is a Call, makes sure not to rec *x?, but rather (*x)?
|
||||
ExprKind::Call(hir_callee, _) => matches!(
|
||||
hir_callee.kind,
|
||||
ExprKind::Path(QPath::LangItem(rustc_hir::LangItem::TryTraitBranch, _, _))
|
||||
),
|
||||
ExprKind::MethodCall(_, [self_arg, ..], _) if expr.hir_id == self_arg.hir_id => true,
|
||||
ExprKind::Match(_, _, MatchSource::TryDesugar | MatchSource::AwaitDesugar)
|
||||
| ExprKind::Field(..)
|
||||
|
@ -21,7 +21,7 @@ fn is_ascii(ch: char) -> bool {
|
||||
ch.is_ascii()
|
||||
}
|
||||
|
||||
fn clone_on_copy() {
|
||||
fn clone_on_copy() -> Option<(i32)> {
|
||||
42;
|
||||
|
||||
vec![1].clone(); // ok, not a Copy type
|
||||
@ -71,4 +71,9 @@ fn clone_on_copy() {
|
||||
// Issue #5436
|
||||
let mut vec = Vec::new();
|
||||
vec.push(42);
|
||||
|
||||
// Issue #9277
|
||||
let opt: &Option<i32> = &None;
|
||||
let value = (*opt)?; // operator precedence needed (*opt)?
|
||||
None
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ fn is_ascii(ch: char) -> bool {
|
||||
ch.is_ascii()
|
||||
}
|
||||
|
||||
fn clone_on_copy() {
|
||||
fn clone_on_copy() -> Option<(i32)> {
|
||||
42.clone();
|
||||
|
||||
vec![1].clone(); // ok, not a Copy type
|
||||
@ -71,4 +71,9 @@ impl core::ops::Deref for Wrap {
|
||||
// Issue #5436
|
||||
let mut vec = Vec::new();
|
||||
vec.push(42.clone());
|
||||
|
||||
// Issue #9277
|
||||
let opt: &Option<i32> = &None;
|
||||
let value = opt.clone()?; // operator precedence needed (*opt)?
|
||||
None
|
||||
}
|
||||
|
@ -48,5 +48,11 @@ error: using `clone` on type `i32` which implements the `Copy` trait
|
||||
LL | vec.push(42.clone());
|
||||
| ^^^^^^^^^^ help: try removing the `clone` call: `42`
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
error: using `clone` on type `std::option::Option<i32>` which implements the `Copy` trait
|
||||
--> $DIR/clone_on_copy.rs:77:17
|
||||
|
|
||||
LL | let value = opt.clone()?; // operator precedence needed (*opt)?
|
||||
| ^^^^^^^^^^^ help: try dereferencing it: `(*opt)`
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user