about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-03-09 19:03:47 +0000
committerbors <bors@rust-lang.org>2023-03-09 19:03:47 +0000
commit14b9d182d54f22eade7afa644d105a18536c596e (patch)
tree1d25dcf3483ef11f05a1d0c02e7792712defbdda
parent8ce5a53934f6fbbf9b00151eee70ac01d6d3cfee (diff)
parent8593132a434216f03d759811a626b42f319192de (diff)
downloadrust-14b9d182d54f22eade7afa644d105a18536c596e.tar.gz
rust-14b9d182d54f22eade7afa644d105a18536c596e.zip
Auto merge of #14306 - HKalbasi:master, r=HKalbasi
fix block with no termination in or patterns

fix #14298
-rw-r--r--crates/hir-ty/src/mir/lower.rs6
-rw-r--r--crates/ide-diagnostics/src/handlers/mutability_errors.rs21
2 files changed, 26 insertions, 1 deletions
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index afa5275ac6b..8638e1d920e 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -1039,7 +1039,11 @@ impl MirLowerCtx<'_> {
                         }
                     }
                 }
-                (then_target, (!finished).then_some(current))
+                if !finished {
+                    let ce = *current_else.get_or_insert_with(|| self.new_basic_block());
+                    self.set_goto(current, ce);
+                }
+                (then_target, current_else)
             }
             Pat::Record { .. } => not_supported!("record pattern"),
             Pat::Range { .. } => not_supported!("range pattern"),
diff --git a/crates/ide-diagnostics/src/handlers/mutability_errors.rs b/crates/ide-diagnostics/src/handlers/mutability_errors.rs
index 9c79ceba01e..f73d1302bf2 100644
--- a/crates/ide-diagnostics/src/handlers/mutability_errors.rs
+++ b/crates/ide-diagnostics/src/handlers/mutability_errors.rs
@@ -575,6 +575,27 @@ fn main() {
     }
 
     #[test]
+    fn or_pattern_no_terminator() {
+        check_diagnostics(
+            r#"
+enum Foo {
+    A, B, C, D
+}
+
+use Foo::*;
+
+fn f(inp: (Foo, Foo, Foo, Foo)) {
+    let ((A, B, _, x) | (B, C | D, x, _)) = inp else {
+        return;
+    };
+    x = B;
+  //^^^^^ 💡 error: cannot mutate immutable variable `x`
+}
+"#,
+        );
+    }
+
+    #[test]
     fn respect_allow_unused_mut() {
         // FIXME: respect
         check_diagnostics(