about summary refs log tree commit diff
diff options
context:
space:
mode:
authordswij <dswijj@gmail.com>2021-12-06 17:18:17 +0800
committerdswij <dswijj@gmail.com>2021-12-06 17:51:00 +0800
commit01ca66cbd70ecfa7ba6294219ecba9f6ad9c8b2b (patch)
tree868e94e428404899fd1e70d44bc1a95cee6fa82a
parenta5d597637dcb78dc73f93561ce474f23d4177c35 (diff)
downloadrust-01ca66cbd70ecfa7ba6294219ecba9f6ad9c8b2b.tar.gz
rust-01ca66cbd70ecfa7ba6294219ecba9f6ad9c8b2b.zip
Fix FP on `question_mark` if returned object is not local
-rw-r--r--clippy_lints/src/question_mark.rs2
-rw-r--r--tests/ui/question_mark.fixed19
-rw-r--r--tests/ui/question_mark.rs19
3 files changed, 39 insertions, 1 deletions
diff --git a/clippy_lints/src/question_mark.rs b/clippy_lints/src/question_mark.rs
index a5531993ee6..7d30c34e956 100644
--- a/clippy_lints/src/question_mark.rs
+++ b/clippy_lints/src/question_mark.rs
@@ -183,7 +183,7 @@ impl QuestionMark {
                 false
             },
             ExprKind::Ret(Some(ret_expr)) => Self::expression_returns_unmodified_err(cx, ret_expr, cond_expr),
-            ExprKind::Path(_) => path_to_local(expr) == path_to_local(cond_expr),
+            ExprKind::Path(_) => path_to_local(expr).is_some() && path_to_local(expr) == path_to_local(cond_expr),
             _ => false,
         }
     }
diff --git a/tests/ui/question_mark.fixed b/tests/ui/question_mark.fixed
index e93469e5f55..13ce0f32d4b 100644
--- a/tests/ui/question_mark.fixed
+++ b/tests/ui/question_mark.fixed
@@ -136,6 +136,24 @@ fn result_func(x: Result<i32, i32>) -> Result<i32, i32> {
     Ok(y)
 }
 
+// see issue #8019
+pub enum NotOption {
+    None,
+    First,
+    AfterFirst,
+}
+
+fn obj(_: i32) -> Result<(), NotOption> {
+    Err(NotOption::First)
+}
+
+fn f() -> NotOption {
+    if obj(2).is_err() {
+        return NotOption::None;
+    }
+    NotOption::First
+}
+
 fn main() {
     some_func(Some(42));
     some_func(None);
@@ -157,4 +175,5 @@ fn main() {
     func();
 
     let _ = result_func(Ok(42));
+    let _ = f();
 }
diff --git a/tests/ui/question_mark.rs b/tests/ui/question_mark.rs
index dd179e9bee8..60590fd9311 100644
--- a/tests/ui/question_mark.rs
+++ b/tests/ui/question_mark.rs
@@ -168,6 +168,24 @@ fn result_func(x: Result<i32, i32>) -> Result<i32, i32> {
     Ok(y)
 }
 
+// see issue #8019
+pub enum NotOption {
+    None,
+    First,
+    AfterFirst,
+}
+
+fn obj(_: i32) -> Result<(), NotOption> {
+    Err(NotOption::First)
+}
+
+fn f() -> NotOption {
+    if obj(2).is_err() {
+        return NotOption::None;
+    }
+    NotOption::First
+}
+
 fn main() {
     some_func(Some(42));
     some_func(None);
@@ -189,4 +207,5 @@ fn main() {
     func();
 
     let _ = result_func(Ok(42));
+    let _ = f();
 }