]> git.lizzy.rs Git - rust.git/commitdiff
Fix a `manual_unwrap_or` FP with deref coercion
authorTakayuki Nakata <f.seasons017@gmail.com>
Mon, 17 May 2021 13:18:50 +0000 (22:18 +0900)
committerTakayuki Nakata <f.seasons017@gmail.com>
Mon, 17 May 2021 13:18:50 +0000 (22:18 +0900)
clippy_lints/src/manual_unwrap_or.rs
tests/ui/manual_unwrap_or.fixed
tests/ui/manual_unwrap_or.rs

index 520162559e50f74690bcaa67c2f93135dea73f7f..cf183d4c16f12a505143bc055e9136a1d0424feb 100644 (file)
@@ -11,6 +11,7 @@
 use rustc_lint::LintContext;
 use rustc_lint::{LateContext, LateLintPass};
 use rustc_middle::lint::in_external_macro;
+use rustc_middle::ty::adjustment::Adjust;
 use rustc_session::{declare_lint_pass, declare_tool_lint};
 use rustc_span::sym;
 
@@ -87,6 +88,8 @@ fn applicable_or_arm<'a>(cx: &LateContext<'_>, arms: &'a [Arm<'a>]) -> Option<&'
             if let PatKind::Binding(_, binding_hir_id, ..) = unwrap_pat.kind;
             if path_to_local_id(unwrap_arm.body, binding_hir_id);
             if !contains_return_break_continue_macro(or_arm.body);
+            if !cx.typeck_results().expr_adjustments(unwrap_arm.body).iter()
+                .any(|a| matches!(a.kind, Adjust::Deref(Some(..))));
             then {
                 Some(or_arm)
             } else {
index e7a29596b73ac50f8fdb1723c089e9425dbdf3bb..1efecb0ba12779b0bc1c5bc28071ee9d61030d09 100644 (file)
@@ -163,4 +163,12 @@ mod issue6965 {
     }
 }
 
+use std::rc::Rc;
+fn format_name(name: Option<&Rc<str>>) -> &str {
+    match name {
+        None => "<anon>",
+        Some(name) => name,
+    }
+}
+
 fn main() {}
index 66006b6c616f08f9e1858e53ef451b57b26c130f..95d585ad18a96c1f093e573d081fe6dd677fcb7e 100644 (file)
@@ -205,4 +205,12 @@ fn test() {
     }
 }
 
+use std::rc::Rc;
+fn format_name(name: Option<&Rc<str>>) -> &str {
+    match name {
+        None => "<anon>",
+        Some(name) => name,
+    }
+}
+
 fn main() {}