From 137ded8ab1edf5112c45e0b6854272ae2e9d3a6d Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sat, 21 Sep 2019 23:54:05 +0200 Subject: [PATCH] pre-expansion gate label_break_value --- src/libsyntax/feature_gate/check.rs | 7 +------ src/libsyntax/parse/parser/expr.rs | 4 ++++ src/libsyntax/sess.rs | 2 ++ .../ui/feature-gates/feature-gate-label_break_value.rs | 5 ++++- .../ui/feature-gates/feature-gate-label_break_value.stderr | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs index ab8781feef07d..4e273fc9374fc 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 2e34422b91883..395f3a3a4dfe1 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, ) -> PResult<'a, P> { + 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 3582d897272bb..ac6be3036ce64 100644 --- a/src/libsyntax/sess.rs +++ b/src/libsyntax/sess.rs @@ -46,6 +46,8 @@ crate struct GatedSpans { pub exclusive_range_pattern: Lock>, /// Spans collected for gating `try_blocks`, e.g. `try { a? + b? }`. pub try_blocks: Lock>, + /// Spans collected for gating `label_break_value`, e.g. `'label: { ... }`. + pub label_break_value: Lock>, } /// 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 6fc38f45517ef..8d7ecd27b450f 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 a417e0eec22f2..6a861d3e04f92 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: { | ^^