about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-09-21 23:54:05 +0200
committerMazdak Farrokhzad <twingoow@gmail.com>2019-10-24 00:32:03 +0200
commit137ded8ab1edf5112c45e0b6854272ae2e9d3a6d (patch)
tree5f5cb3e04541879784b6635e4cb459e6ab9f5f1c
parent66995a6a71e2f5e194797cb846ce5866c4305f93 (diff)
downloadrust-137ded8ab1edf5112c45e0b6854272ae2e9d3a6d.tar.gz
rust-137ded8ab1edf5112c45e0b6854272ae2e9d3a6d.zip
pre-expansion gate label_break_value
-rw-r--r--src/libsyntax/feature_gate/check.rs7
-rw-r--r--src/libsyntax/parse/parser/expr.rs4
-rw-r--r--src/libsyntax/sess.rs2
-rw-r--r--src/test/ui/feature-gates/feature-gate-label_break_value.rs5
-rw-r--r--src/test/ui/feature-gates/feature-gate-label_break_value.stderr2
5 files changed, 12 insertions, 8 deletions
diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs
index ab8781feef0..4e273fc9374 100644
--- a/src/libsyntax/feature_gate/check.rs
+++ b/src/libsyntax/feature_gate/check.rs
@@ -514,12 +514,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
                                        "type ascription is experimental");
                 }
             }
-            ast::ExprKind::Block(_, opt_label) => {
-                if let Some(label) = opt_label {
-                    gate_feature_post!(&self, label_break_value, label.ident.span,
-                                    "labels on blocks are unstable");
-                }
-            }
             _ => {}
         }
         visit::walk_expr(self, e)
@@ -814,6 +808,7 @@ pub fn check_crate(krate: &ast::Crate,
     gate_all!(box_patterns, "box pattern syntax is experimental");
     gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental");
     gate_all!(try_blocks, "`try` blocks are unstable");
+    gate_all!(label_break_value, "labels on blocks are unstable");
 
     visit::walk_crate(&mut visitor, krate);
 }
diff --git a/src/libsyntax/parse/parser/expr.rs b/src/libsyntax/parse/parser/expr.rs
index 2e34422b918..395f3a3a4df 100644
--- a/src/libsyntax/parse/parser/expr.rs
+++ b/src/libsyntax/parse/parser/expr.rs
@@ -1260,6 +1260,10 @@ impl<'a> Parser<'a> {
         blk_mode: BlockCheckMode,
         outer_attrs: ThinVec<Attribute>,
     ) -> PResult<'a, P<Expr>> {
+        if let Some(label) = opt_label {
+            self.sess.gated_spans.label_break_value.borrow_mut().push(label.ident.span);
+        }
+
         self.expect(&token::OpenDelim(token::Brace))?;
 
         let mut attrs = outer_attrs;
diff --git a/src/libsyntax/sess.rs b/src/libsyntax/sess.rs
index 3582d897272..ac6be3036ce 100644
--- a/src/libsyntax/sess.rs
+++ b/src/libsyntax/sess.rs
@@ -46,6 +46,8 @@ crate struct GatedSpans {
     pub exclusive_range_pattern: Lock<Vec<Span>>,
     /// Spans collected for gating `try_blocks`, e.g. `try { a? + b? }`.
     pub try_blocks: Lock<Vec<Span>>,
+    /// Spans collected for gating `label_break_value`, e.g. `'label: { ... }`.
+    pub label_break_value: Lock<Vec<Span>>,
 }
 
 /// Info about a parsing session.
diff --git a/src/test/ui/feature-gates/feature-gate-label_break_value.rs b/src/test/ui/feature-gates/feature-gate-label_break_value.rs
index 6fc38f45517..8d7ecd27b45 100644
--- a/src/test/ui/feature-gates/feature-gate-label_break_value.rs
+++ b/src/test/ui/feature-gates/feature-gate-label_break_value.rs
@@ -1,5 +1,8 @@
-pub fn main() {
+#[cfg(FALSE)]
+pub fn foo() {
     'a: { //~ ERROR labels on blocks are unstable
         break 'a;
     }
 }
+
+fn main() {}
diff --git a/src/test/ui/feature-gates/feature-gate-label_break_value.stderr b/src/test/ui/feature-gates/feature-gate-label_break_value.stderr
index a417e0eec22..6a861d3e04f 100644
--- a/src/test/ui/feature-gates/feature-gate-label_break_value.stderr
+++ b/src/test/ui/feature-gates/feature-gate-label_break_value.stderr
@@ -1,5 +1,5 @@
 error[E0658]: labels on blocks are unstable
-  --> $DIR/feature-gate-label_break_value.rs:2:5
+  --> $DIR/feature-gate-label_break_value.rs:3:5
    |
 LL |     'a: {
    |     ^^