about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeSeulArtichaut <leseulartichaut@gmail.com>2021-04-02 00:07:16 +0200
committerLeSeulArtichaut <leseulartichaut@gmail.com>2021-04-02 19:50:06 +0200
commitfb7cf0982b6cba2a77e40ef6b5919e7584a07a95 (patch)
tree088e1f494e907a5c11fd4e0a1f3cde08525f9cdd
parent08879449c645c224d3628bebb3e5b5a50a88cc3f (diff)
downloadrust-fb7cf0982b6cba2a77e40ef6b5919e7584a07a95.tar.gz
rust-fb7cf0982b6cba2a77e40ef6b5919e7584a07a95.zip
Don't suggest dereferencing an `else if` expression
-rw-r--r--compiler/rustc_typeck/src/check/demand.rs24
-rw-r--r--src/test/ui/deref-suggestion.stderr10
2 files changed, 19 insertions, 15 deletions
diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs
index 2d84e7830c2..d879b6e97dc 100644
--- a/compiler/rustc_typeck/src/check/demand.rs
+++ b/compiler/rustc_typeck/src/check/demand.rs
@@ -374,6 +374,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
         }
     }
 
+    /// Returns whether the given expression is an `else if`.
+    crate fn is_else_if_block(&self, expr: &hir::Expr<'_>) -> bool {
+        if let hir::ExprKind::If(..) = expr.kind {
+            let parent_id = self.tcx.hir().get_parent_node(expr.hir_id);
+            if let Some(Node::Expr(hir::Expr {
+                kind: hir::ExprKind::If(_, _, Some(else_expr)),
+                ..
+            })) = self.tcx.hir().find(parent_id)
+            {
+                return else_expr.hir_id == expr.hir_id;
+            }
+        }
+        false
+    }
+
     /// This function is used to determine potential "simple" improvements or users' errors and
     /// provide them useful help. For example:
     ///
@@ -660,12 +675,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                                 };
                                 let suggestion = if is_struct_pat_shorthand_field {
                                     format!("{}: *{}", code, code)
+                                } else if self.is_else_if_block(expr) {
+                                    // Don't suggest nonsense like `else *if`
+                                    return None;
                                 } else if let Some(expr) = self.maybe_get_block_expr(expr.hir_id) {
-                                    if let Ok(inner_code) = sm.span_to_snippet(expr.span) {
-                                        format!("*{}", inner_code)
-                                    } else {
-                                        format!("*{}", code)
-                                    }
+                                    format!("*{}", sm.span_to_snippet(expr.span).unwrap_or(code))
                                 } else {
                                     format!("*{}", code)
                                 };
diff --git a/src/test/ui/deref-suggestion.stderr b/src/test/ui/deref-suggestion.stderr
index 1720421c7f6..632a279d796 100644
--- a/src/test/ui/deref-suggestion.stderr
+++ b/src/test/ui/deref-suggestion.stderr
@@ -125,16 +125,6 @@ LL | ||     };
    | ||_____|
    | |______`if` and `else` have incompatible types
    |        expected `i32`, found `&{integer}`
-   |
-help: consider dereferencing the borrow
-   |
-LL |     } else *if true {
-LL |
-LL |         b
-LL |     } else {
-LL |         &0
-LL |     };
-   |
 
 error: aborting due to 13 previous errors