about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamrat Man Singh <samratmansingh@gmail.com>2020-05-25 20:45:26 +0530
committerSamrat Man Singh <samratmansingh@gmail.com>2020-05-26 01:18:07 +0530
commit91dcbbbf50baa02d0757085bb5a9bd69bae5a5a4 (patch)
tree7215fee3b309234c401704659b0e4259168ec4c3
parentff991d60349201a90ca15202dd0323ebdfab8745 (diff)
downloadrust-91dcbbbf50baa02d0757085bb5a9bd69bae5a5a4.tar.gz
rust-91dcbbbf50baa02d0757085bb5a9bd69bae5a5a4.zip
Allow unlabeled breaks from desugared `?` in labeled blocks
-rw-r--r--src/librustc_passes/loops.rs3
-rw-r--r--src/test/ui/label/label_break_value_desugared_break.rs12
2 files changed, 14 insertions, 1 deletions
diff --git a/src/librustc_passes/loops.rs b/src/librustc_passes/loops.rs
index 09b3d44020d..767a6909d31 100644
--- a/src/librustc_passes/loops.rs
+++ b/src/librustc_passes/loops.rs
@@ -9,6 +9,7 @@ use rustc_middle::hir::map::Map;
 use rustc_middle::ty::query::Providers;
 use rustc_middle::ty::TyCtxt;
 use rustc_session::Session;
+use rustc_span::hygiene::DesugaringKind;
 use rustc_span::Span;
 
 #[derive(Clone, Copy, Debug, PartialEq)]
@@ -203,7 +204,7 @@ impl<'a, 'hir> CheckLoopVisitor<'a, 'hir> {
         label: &Destination,
         cf_type: &str,
     ) -> bool {
-        if self.cx == LabeledBlock {
+        if !span.is_desugaring(DesugaringKind::QuestionMark) && self.cx == LabeledBlock {
             if label.label.is_none() {
                 struct_span_err!(
                     self.sess,
diff --git a/src/test/ui/label/label_break_value_desugared_break.rs b/src/test/ui/label/label_break_value_desugared_break.rs
new file mode 100644
index 00000000000..de883b61111
--- /dev/null
+++ b/src/test/ui/label/label_break_value_desugared_break.rs
@@ -0,0 +1,12 @@
+// compile-flags: --edition 2018
+#![feature(label_break_value, try_blocks)]
+
+// run-pass
+fn main() {
+    let _: Result<(), ()> = try {
+        'foo: {
+            Err(())?;
+            break 'foo;
+        }
+    };
+}