From dfa98318e17bc1c42615fd02efe946bfb8dfeb7c Mon Sep 17 00:00:00 2001 From: est31 Date: Sat, 12 May 2018 11:33:33 +0200 Subject: [PATCH] Add feature gate label_break_value --- src/librustc_passes/diagnostics.rs | 1 + src/libsyntax/feature_gate.rs | 9 +++++++++ src/test/run-pass/label_break_value.rs | 2 ++ src/test/ui/feature-gate-label_break_value.rs | 15 +++++++++++++++ src/test/ui/feature-gate-label_break_value.stderr | 11 +++++++++++ src/test/ui/label_break_value_continue.rs | 2 ++ src/test/ui/label_break_value_continue.stderr | 8 ++++---- src/test/ui/label_break_value_illegal_uses.rs | 2 ++ src/test/ui/label_break_value_illegal_uses.stderr | 8 ++++---- src/test/ui/label_break_value_unlabeled_break.rs | 2 ++ .../ui/label_break_value_unlabeled_break.stderr | 4 ++-- 11 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/test/ui/feature-gate-label_break_value.rs create mode 100644 src/test/ui/feature-gate-label_break_value.stderr diff --git a/src/librustc_passes/diagnostics.rs b/src/librustc_passes/diagnostics.rs index 5dd11617b8bfb..d031694d85308 100644 --- a/src/librustc_passes/diagnostics.rs +++ b/src/librustc_passes/diagnostics.rs @@ -278,6 +278,7 @@ loop { Make sure to always label the `break`: ``` +# #![feature(label_break_value)] 'l: loop { 'a: { break 'l; diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index bf78723e41365..f1229520c7743 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -466,6 +466,9 @@ declare_features! ( // inconsistent bounds in where clauses (active, trivial_bounds, "1.28.0", Some(48214), None), + + // 'a: { break 'a; } + (active, label_break_value, "1.28.0", Some(48594), None), ); declare_features! ( @@ -1696,6 +1699,12 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { "multiple patterns in `if let` and `while let` are unstable"); } } + 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); diff --git a/src/test/run-pass/label_break_value.rs b/src/test/run-pass/label_break_value.rs index 53cf2846e836a..444845e24dc7d 100644 --- a/src/test/run-pass/label_break_value.rs +++ b/src/test/run-pass/label_break_value.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![feature(label_break_value)] + // Test control flow to follow label_break_value semantics fn label_break(a: bool, b: bool) -> u32 { let mut v = 0; diff --git a/src/test/ui/feature-gate-label_break_value.rs b/src/test/ui/feature-gate-label_break_value.rs new file mode 100644 index 0000000000000..dcda7580bda41 --- /dev/null +++ b/src/test/ui/feature-gate-label_break_value.rs @@ -0,0 +1,15 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub fn main() { + 'a: { //~ ERROR labels on blocks are unstable + break 'a; + } +} diff --git a/src/test/ui/feature-gate-label_break_value.stderr b/src/test/ui/feature-gate-label_break_value.stderr new file mode 100644 index 0000000000000..8e8f31e787133 --- /dev/null +++ b/src/test/ui/feature-gate-label_break_value.stderr @@ -0,0 +1,11 @@ +error[E0658]: labels on blocks are unstable (see issue #48594) + --> $DIR/feature-gate-label_break_value.rs:12:5 + | +LL | 'a: { //~ ERROR labels on blocks are unstable + | ^^ + | + = help: add #![feature(label_break_value)] to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/label_break_value_continue.rs b/src/test/ui/label_break_value_continue.rs index 10557d4bcd61f..52e24b759d1d2 100644 --- a/src/test/ui/label_break_value_continue.rs +++ b/src/test/ui/label_break_value_continue.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![feature(label_break_value)] + // Simple continue pointing to an unlabeled break should yield in an error fn continue_simple() { 'b: { diff --git a/src/test/ui/label_break_value_continue.stderr b/src/test/ui/label_break_value_continue.stderr index cf707f1b96029..24c2d1a22d01c 100644 --- a/src/test/ui/label_break_value_continue.stderr +++ b/src/test/ui/label_break_value_continue.stderr @@ -1,17 +1,17 @@ error[E0695]: unlabeled `continue` inside of a labeled block - --> $DIR/label_break_value_continue.rs:14:9 + --> $DIR/label_break_value_continue.rs:16:9 | LL | continue; //~ ERROR unlabeled `continue` inside of a labeled block | ^^^^^^^^ `continue` statements that would diverge to or through a labeled block need to bear a label error[E0696]: `continue` pointing to a labeled block - --> $DIR/label_break_value_continue.rs:21:9 + --> $DIR/label_break_value_continue.rs:23:9 | LL | continue 'b; //~ ERROR `continue` pointing to a labeled block | ^^^^^^^^^^^ labeled blocks cannot be `continue`'d | note: labeled block the continue points to - --> $DIR/label_break_value_continue.rs:20:5 + --> $DIR/label_break_value_continue.rs:22:5 | LL | / 'b: { LL | | continue 'b; //~ ERROR `continue` pointing to a labeled block @@ -19,7 +19,7 @@ LL | | } | |_____^ error[E0695]: unlabeled `continue` inside of a labeled block - --> $DIR/label_break_value_continue.rs:29:13 + --> $DIR/label_break_value_continue.rs:31:13 | LL | continue; //~ ERROR unlabeled `continue` inside of a labeled block | ^^^^^^^^ `continue` statements that would diverge to or through a labeled block need to bear a label diff --git a/src/test/ui/label_break_value_illegal_uses.rs b/src/test/ui/label_break_value_illegal_uses.rs index d0bccdeae85a5..18644033e4ff8 100644 --- a/src/test/ui/label_break_value_illegal_uses.rs +++ b/src/test/ui/label_break_value_illegal_uses.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![feature(label_break_value)] + // These are forbidden occurences of label-break-value fn labeled_unsafe() { diff --git a/src/test/ui/label_break_value_illegal_uses.stderr b/src/test/ui/label_break_value_illegal_uses.stderr index 6cf6e4d0c7fe9..0ab1ad2c24200 100644 --- a/src/test/ui/label_break_value_illegal_uses.stderr +++ b/src/test/ui/label_break_value_illegal_uses.stderr @@ -1,11 +1,11 @@ error: expected one of `extern`, `fn`, or `{`, found `'b` - --> $DIR/label_break_value_illegal_uses.rs:14:12 + --> $DIR/label_break_value_illegal_uses.rs:16:12 | LL | unsafe 'b: {} //~ ERROR expected one of `extern`, `fn`, or `{` | ^^ expected one of `extern`, `fn`, or `{` here error: expected `{`, found `'b` - --> $DIR/label_break_value_illegal_uses.rs:18:13 + --> $DIR/label_break_value_illegal_uses.rs:20:13 | LL | if true 'b: {} //~ ERROR expected `{`, found `'b` | -- ^^---- @@ -14,7 +14,7 @@ LL | if true 'b: {} //~ ERROR expected `{`, found `'b` | this `if` statement has a condition, but no block error: expected `{`, found `'b` - --> $DIR/label_break_value_illegal_uses.rs:22:21 + --> $DIR/label_break_value_illegal_uses.rs:24:21 | LL | if true {} else 'b: {} //~ ERROR expected `{`, found `'b` | ^^---- @@ -22,7 +22,7 @@ LL | if true {} else 'b: {} //~ ERROR expected `{`, found `'b` | help: try placing this code inside a block: `{ 'b: { } }` error: expected one of `.`, `?`, `{`, or an operator, found `'b` - --> $DIR/label_break_value_illegal_uses.rs:26:17 + --> $DIR/label_break_value_illegal_uses.rs:28:17 | LL | match false 'b: {} //~ ERROR expected one of `.`, `?`, `{`, or an operator | ^^ expected one of `.`, `?`, `{`, or an operator here diff --git a/src/test/ui/label_break_value_unlabeled_break.rs b/src/test/ui/label_break_value_unlabeled_break.rs index b88c23d246e3a..38918da291c86 100644 --- a/src/test/ui/label_break_value_unlabeled_break.rs +++ b/src/test/ui/label_break_value_unlabeled_break.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![feature(label_break_value)] + // Simple unlabeled break should yield in an error fn unlabeled_break_simple() { 'b: { diff --git a/src/test/ui/label_break_value_unlabeled_break.stderr b/src/test/ui/label_break_value_unlabeled_break.stderr index 24b2f19075711..8a25975a7bda2 100644 --- a/src/test/ui/label_break_value_unlabeled_break.stderr +++ b/src/test/ui/label_break_value_unlabeled_break.stderr @@ -1,11 +1,11 @@ error[E0695]: unlabeled `break` inside of a labeled block - --> $DIR/label_break_value_unlabeled_break.rs:14:9 + --> $DIR/label_break_value_unlabeled_break.rs:16:9 | LL | break; //~ ERROR unlabeled `break` inside of a labeled block | ^^^^^ `break` statements that would diverge to or through a labeled block need to bear a label error[E0695]: unlabeled `break` inside of a labeled block - --> $DIR/label_break_value_unlabeled_break.rs:22:13 + --> $DIR/label_break_value_unlabeled_break.rs:24:13 | LL | break; //~ ERROR unlabeled `break` inside of a labeled block | ^^^^^ `break` statements that would diverge to or through a labeled block need to bear a label