about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaybe Waffle <waffle.lapkin@gmail.com>2022-12-28 20:46:45 +0000
committerMaybe Waffle <waffle.lapkin@gmail.com>2022-12-28 20:56:58 +0000
commiteecab99dec7a812199d2c403013d393dd1dec680 (patch)
treeb0636ea93e23b46b7cbcb0960770641f3c75f750
parent16264a3a53765d692e55ba73c74bb3abc653cb4b (diff)
downloadrust-eecab99dec7a812199d2c403013d393dd1dec680.tar.gz
rust-eecab99dec7a812199d2c403013d393dd1dec680.zip
Allow `break` and co to go through `try{}` blocks
-rw-r--r--crates/hir-ty/src/infer/expr.rs2
-rw-r--r--crates/ide-diagnostics/src/handlers/break_outside_of_loop.rs36
2 files changed, 17 insertions, 21 deletions
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs
index b1f4de82607..0d3f15c3d5d 100644
--- a/crates/hir-ty/src/infer/expr.rs
+++ b/crates/hir-ty/src/infer/expr.rs
@@ -152,7 +152,7 @@ impl<'a> InferenceContext<'a> {
                 .1
             }
             Expr::TryBlock { body } => {
-                self.with_breakable_ctx(BreakableKind::Border, self.err_ty(), None, |this| {
+                self.with_breakable_ctx(BreakableKind::Block, self.err_ty(), None, |this| {
                     let _inner = this.infer_expr(*body, expected);
                 });
                 // FIXME should be std::result::Result<{inner}, _>
diff --git a/crates/ide-diagnostics/src/handlers/break_outside_of_loop.rs b/crates/ide-diagnostics/src/handlers/break_outside_of_loop.rs
index 0c92e706b39..7a957e1c504 100644
--- a/crates/ide-diagnostics/src/handlers/break_outside_of_loop.rs
+++ b/crates/ide-diagnostics/src/handlers/break_outside_of_loop.rs
@@ -38,7 +38,7 @@ fn foo() {
     }
 
     #[test]
-    fn try_blocks_are_borders() {
+    fn async_blocks_are_borders() {
         check_diagnostics(
             r#"
 fn foo() {
@@ -60,7 +60,7 @@ fn foo() {
     }
 
     #[test]
-    fn async_blocks_are_borders() {
+    fn closures_are_borders() {
         check_diagnostics(
             r#"
 fn foo() {
@@ -82,21 +82,17 @@ fn foo() {
     }
 
     #[test]
-    fn closures_are_borders() {
+    fn blocks_pass_through() {
         check_diagnostics(
             r#"
 fn foo() {
     'a: loop {
-        try {
-                break;
-              //^^^^^ error: break outside of loop
-                break 'a;
-              //^^^^^^^^ error: break outside of loop
-                continue;
-              //^^^^^^^^ error: continue outside of loop
-                continue 'a;
-              //^^^^^^^^^^^ error: continue outside of loop
-        };
+        {
+            break;
+            break 'a;
+            continue;
+            continue 'a;
+        }
     }
 }
 "#,
@@ -104,17 +100,17 @@ fn foo() {
     }
 
     #[test]
-    fn blocks_pass_through() {
+    fn try_blocks_pass_through() {
         check_diagnostics(
             r#"
 fn foo() {
     'a: loop {
-        {
-            break;
-            break 'a;
-            continue;
-            continue 'a;
-        }
+        try {
+                break;
+                break 'a;
+                continue;
+                continue 'a;
+        };
     }
 }
 "#,