about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/expr.rs9
-rw-r--r--src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/non_exhaustive_let.rs39
2 files changed, 46 insertions, 2 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/expr.rs b/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/expr.rs
index e52fae06d7f..06c9b2e0e5b 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/expr.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/expr.rs
@@ -117,7 +117,7 @@ impl ExprValidator {
                 Expr::If { .. } => {
                     self.check_for_unnecessary_else(id, expr, db);
                 }
-                Expr::Block { .. } => {
+                Expr::Block { .. } | Expr::Async { .. } | Expr::Unsafe { .. } => {
                     self.validate_block(db, expr);
                 }
                 _ => {}
@@ -254,7 +254,12 @@ impl ExprValidator {
     }
 
     fn validate_block(&mut self, db: &dyn HirDatabase, expr: &Expr) {
-        let Expr::Block { statements, .. } = expr else { return };
+        let (Expr::Block { statements, .. }
+        | Expr::Async { statements, .. }
+        | Expr::Unsafe { statements, .. }) = expr
+        else {
+            return;
+        };
         let pattern_arena = Arena::new();
         let cx = MatchCheckCtx::new(self.owner.module(db.upcast()), self.owner, db);
         for stmt in &**statements {
diff --git a/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/non_exhaustive_let.rs b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/non_exhaustive_let.rs
index 1a4d2877ef2..5a6977c2553 100644
--- a/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/non_exhaustive_let.rs
+++ b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/non_exhaustive_let.rs
@@ -44,4 +44,43 @@ fn main() {
 "#,
         );
     }
+
+    #[test]
+    fn option_nonexhaustive_inside_blocks() {
+        check_diagnostics(
+            r#"
+//- minicore: option
+fn main() {
+    '_a: {
+        let None = Some(5);
+          //^^^^ error: non-exhaustive pattern: `Some(_)` not covered
+    }
+}
+"#,
+        );
+
+        check_diagnostics(
+            r#"
+//- minicore: future, option
+fn main() {
+    let _ = async {
+        let None = Some(5);
+          //^^^^ error: non-exhaustive pattern: `Some(_)` not covered
+    };
+}
+"#,
+        );
+
+        check_diagnostics(
+            r#"
+//- minicore: option
+fn main() {
+    unsafe {
+        let None = Some(5);
+          //^^^^ error: non-exhaustive pattern: `Some(_)` not covered
+    }
+}
+"#,
+        );
+    }
 }