about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Macovei <djmacovei@gmail.com>2022-08-02 10:39:35 -0500
committerDaniel Macovei <djmacovei@gmail.com>2022-08-02 10:39:35 -0500
commit145ebb1cd723e34dc5a940ec3e498de814e6293d (patch)
treedb3cedf02e68268905a1e0e3b02268229801c53d
parent05e7d5481b7d405f0ebb04f3c83fb19618871c19 (diff)
downloadrust-145ebb1cd723e34dc5a940ec3e498de814e6293d.tar.gz
rust-145ebb1cd723e34dc5a940ec3e498de814e6293d.zip
add paren before '?' when suggesting deref
-rw-r--r--clippy_lints/src/methods/clone_on_copy.rs6
-rw-r--r--tests/ui/clone_on_copy.fixed6
-rw-r--r--tests/ui/clone_on_copy.rs6
-rw-r--r--tests/ui/clone_on_copy.stderr8
4 files changed, 22 insertions, 4 deletions
diff --git a/clippy_lints/src/methods/clone_on_copy.rs b/clippy_lints/src/methods/clone_on_copy.rs
index 0b38a07204e..a813d39441b 100644
--- a/clippy_lints/src/methods/clone_on_copy.rs
+++ b/clippy_lints/src/methods/clone_on_copy.rs
@@ -4,7 +4,7 @@ use clippy_utils::source::snippet_with_context;
 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,10 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, method_name: Symbol,
                 {
                     return;
                 },
+                ExprKind::Call(hir_callee, _) => match hir_callee.kind {
+                    ExprKind::Path(QPath::LangItem(rustc_hir::LangItem::TryTraitBranch, _, _)) => true,
+                    _ => false,
+                },
                 ExprKind::MethodCall(_, [self_arg, ..], _) if expr.hir_id == self_arg.hir_id => true,
                 ExprKind::Match(_, _, MatchSource::TryDesugar | MatchSource::AwaitDesugar)
                 | ExprKind::Field(..)
diff --git a/tests/ui/clone_on_copy.fixed b/tests/ui/clone_on_copy.fixed
index dc062762604..43849121b04 100644
--- a/tests/ui/clone_on_copy.fixed
+++ b/tests/ui/clone_on_copy.fixed
@@ -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,8 @@ fn clone_on_copy() {
     // Issue #5436
     let mut vec = Vec::new();
     vec.push(42);
+
+    let opt: &Option<i32> = &None;
+    let value = (*opt)?;
+    None
 }
diff --git a/tests/ui/clone_on_copy.rs b/tests/ui/clone_on_copy.rs
index 8c39d0d55dd..1f10599da22 100644
--- a/tests/ui/clone_on_copy.rs
+++ b/tests/ui/clone_on_copy.rs
@@ -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,8 @@ fn clone_on_copy() {
     // Issue #5436
     let mut vec = Vec::new();
     vec.push(42.clone());
+
+    let opt: &Option<i32> = &None;
+    let value = opt.clone()?;
+    None
 }
diff --git a/tests/ui/clone_on_copy.stderr b/tests/ui/clone_on_copy.stderr
index 861543d0aa9..483ea35af2a 100644
--- a/tests/ui/clone_on_copy.stderr
+++ b/tests/ui/clone_on_copy.stderr
@@ -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:76:17
+   |
+LL |     let value = opt.clone()?;
+   |                 ^^^^^^^^^^^ help: try dereferencing it: `(*opt)`
+
+error: aborting due to 9 previous errors