Stabilize #![feature(label_break_value)]
# Stabilization proposal The feature was implemented in https://github.com/rust-lang/rust/pull/50045 by est31 and has been in nightly since 2018-05-16 (over 4 years now). There are [no open issues][issue-label] other than the tracking issue. There is a strong consensus that `break` is the right keyword and we should not use `return`. There have been several concerns raised about this feature on the tracking issue (other than the one about tests, which has been fixed, and an interaction with try blocks, which has been fixed). 1. nrc's original comment about cost-benefit analysis: https://github.com/rust-lang/rust/issues/48594#issuecomment-422235234 2. joshtriplett's comments about seeing use cases: https://github.com/rust-lang/rust/issues/48594#issuecomment-422281176 3. withoutboats's comments that Rust does not need more control flow constructs: https://github.com/rust-lang/rust/issues/48594#issuecomment-450050630 Many different examples of code that's simpler using this feature have been provided: - A lexer by rpjohnst which must repeat code without label-break-value: https://github.com/rust-lang/rust/issues/48594#issuecomment-422502014 - A snippet by SergioBenitez which avoids using a new function and adding several new return points to a function: https://github.com/rust-lang/rust/issues/48594#issuecomment-427628251. This particular case would also work if `try` blocks were stabilized (at the cost of making the code harder to optimize). - Several examples by JohnBSmith: https://github.com/rust-lang/rust/issues/48594#issuecomment-434651395 - Several examples by Centril: https://github.com/rust-lang/rust/issues/48594#issuecomment-440154733 - An example by petrochenkov where this is used in the compiler itself to avoid duplicating error checking code: https://github.com/rust-lang/rust/issues/48594#issuecomment-443557569 - Amanieu recently provided another example related to complex conditions, where try blocks would not have helped: https://github.com/rust-lang/rust/issues/48594#issuecomment-1184213006 Additionally, petrochenkov notes that this is strictly more powerful than labelled loops due to macros which accidentally exit a loop instead of being consumed by the macro matchers: https://github.com/rust-lang/rust/issues/48594#issuecomment-450246249 nrc later resolved their concern, mostly because of the aforementioned macro problems. joshtriplett suggested that macros could be able to generate IR directly (https://github.com/rust-lang/rust/issues/48594#issuecomment-451685983) but there are no open RFCs, and the design space seems rather speculative. joshtriplett later resolved his concerns, due to a symmetry between this feature and existing labelled break: https://github.com/rust-lang/rust/issues/48594#issuecomment-632960804 withoutboats has regrettably left the language team. joshtriplett later posted that the lang team would consider starting an FCP given a stabilization report: https://github.com/rust-lang/rust/issues/48594#issuecomment-1111269353 [issue-label]: https://github.com/rust-lang/rust/issues?q=is%3Aissue+is%3Aopen+label%3AF-label_break_value+ ## Report + Feature gate: -d695a497bb/src/test/ui/feature-gates/feature-gate-label_break_value.rs
+ Diagnostics: -6b2d3d5f3c/compiler/rustc_parse/src/parser/diagnostics.rs (L2629)
-f65bf0b2bb/compiler/rustc_resolve/src/diagnostics.rs (L749)
-f65bf0b2bb/compiler/rustc_resolve/src/diagnostics.rs (L1001)
-111df9e6ed/compiler/rustc_passes/src/loops.rs (L254)
-d695a497bb/compiler/rustc_parse/src/parser/expr.rs (L2079)
-d695a497bb/compiler/rustc_parse/src/parser/expr.rs (L1569)
+ Tests: - https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_continue.rs - https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_unlabeled_break.rs - https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_illegal_uses.rs - https://github.com/rust-lang/rust/blob/master/src/test/ui/lint/unused_labels.rs - https://github.com/rust-lang/rust/blob/master/src/test/ui/run-pass/for-loop-while/label_break_value.rs ## Interactions with other features Labels follow the hygiene of local variables. label-break-value is permitted within `try` blocks: ```rust let _: Result<(), ()> = try { 'foo: { Err(())?; break 'foo; } }; ``` label-break-value is disallowed within closures, generators, and async blocks: ```rust 'a: { || break 'a //~^ ERROR use of unreachable label `'a` //~| ERROR `break` inside of a closure } ``` label-break-value is disallowed on [_BlockExpression_]; it can only occur as a [_LoopExpression_]: ```rust fn labeled_match() { match false 'b: { //~ ERROR block label not supported here _ => {} } } macro_rules! m { ($b:block) => { 'lab: $b; //~ ERROR cannot use a `block` macro fragment here unsafe $b; //~ ERROR cannot use a `block` macro fragment here |x: u8| -> () $b; //~ ERROR cannot use a `block` macro fragment here } } fn foo() { m!({}); } ``` [_BlockExpression_]: https://doc.rust-lang.org/nightly/reference/expressions/block-expr.html [_LoopExpression_]: https://doc.rust-lang.org/nightly/reference/expressions/loop-expr.html
This commit is contained in:
parent
4b695f7c4e
commit
31e39446ec
@ -13,7 +13,7 @@
|
||||
#![feature(const_default_impls)]
|
||||
#![feature(const_trait_impl)]
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(label_break_value)]
|
||||
#![cfg_attr(bootstrap, feature(label_break_value))]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(negative_impls)]
|
||||
#![feature(slice_internals)]
|
||||
|
@ -647,14 +647,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||
ast::ExprKind::TryBlock(_) => {
|
||||
gate_feature_post!(&self, try_blocks, e.span, "`try` expression is experimental");
|
||||
}
|
||||
ast::ExprKind::Block(_, Some(label)) => {
|
||||
gate_feature_post!(
|
||||
&self,
|
||||
label_break_value,
|
||||
label.ident.span,
|
||||
"labels on blocks are unstable"
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
visit::walk_expr(self, e)
|
||||
@ -823,7 +815,6 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
|
||||
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");
|
||||
gate_all!(box_syntax, "box expression syntax is experimental; you can call `Box::new` instead");
|
||||
gate_all!(type_ascription, "type ascription is experimental");
|
||||
|
||||
|
@ -3,7 +3,6 @@ A `break` statement without a label appeared inside a labeled block.
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0695
|
||||
# #![feature(label_break_value)]
|
||||
loop {
|
||||
'a: {
|
||||
break;
|
||||
@ -14,7 +13,6 @@ loop {
|
||||
Make sure to always label the `break`:
|
||||
|
||||
```
|
||||
# #![feature(label_break_value)]
|
||||
'l: loop {
|
||||
'a: {
|
||||
break 'l;
|
||||
@ -25,7 +23,6 @@ Make sure to always label the `break`:
|
||||
Or if you want to `break` the labeled block:
|
||||
|
||||
```
|
||||
# #![feature(label_break_value)]
|
||||
loop {
|
||||
'a: {
|
||||
break 'a;
|
||||
|
@ -186,6 +186,8 @@ declare_features! (
|
||||
/// Allows some increased flexibility in the name resolution rules,
|
||||
/// especially around globs and shadowing (RFC 1560).
|
||||
(accepted, item_like_imports, "1.15.0", Some(35120), None),
|
||||
/// Allows `'a: { break 'a; }`.
|
||||
(accepted, label_break_value, "1.65.0", Some(48594), None),
|
||||
/// Allows `if/while p && let q = r && ...` chains.
|
||||
(accepted, let_chains, "1.64.0", Some(53667), None),
|
||||
/// Allows `break {expr}` with a value inside `loop`s.
|
||||
|
@ -420,8 +420,6 @@ declare_features! (
|
||||
(active, intra_doc_pointers, "1.51.0", Some(80896), None),
|
||||
/// Allows `#[instruction_set(_)]` attribute
|
||||
(active, isa_attribute, "1.48.0", Some(74727), None),
|
||||
/// Allows `'a: { break 'a; }`.
|
||||
(active, label_break_value, "1.28.0", Some(48594), None),
|
||||
// Allows setting the threshold for the `large_assignments` lint.
|
||||
(active, large_assignments, "1.52.0", Some(83518), None),
|
||||
/// Allows `let...else` statements.
|
||||
|
@ -17,7 +17,7 @@
|
||||
#![feature(box_patterns)]
|
||||
#![feature(control_flow_enum)]
|
||||
#![feature(extend_one)]
|
||||
#![feature(label_break_value)]
|
||||
#![cfg_attr(bootstrap, feature(label_break_value))]
|
||||
#![feature(let_else)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(never_type)]
|
||||
|
@ -2075,10 +2075,6 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(label) = opt_label {
|
||||
self.sess.gated_spans.gate(sym::label_break_value, label.ident.span);
|
||||
}
|
||||
|
||||
if self.token.is_whole_block() {
|
||||
self.struct_span_err(self.token.span, "cannot use a `block` macro fragment here")
|
||||
.span_label(lo.to(self.token.span), "the `block` fragment is within this context")
|
||||
|
@ -16,7 +16,7 @@
|
||||
#![feature(control_flow_enum)]
|
||||
#![feature(drain_filter)]
|
||||
#![feature(hash_drain_filter)]
|
||||
#![feature(label_break_value)]
|
||||
#![cfg_attr(bootstrap, feature(label_break_value))]
|
||||
#![feature(let_else)]
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(never_type)]
|
||||
|
@ -64,7 +64,7 @@ This API is completely unstable and subject to change.
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(is_sorted)]
|
||||
#![feature(iter_intersperse)]
|
||||
#![feature(label_break_value)]
|
||||
#![cfg_attr(bootstrap, feature(label_break_value))]
|
||||
#![feature(let_else)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(never_type)]
|
||||
|
@ -252,7 +252,7 @@
|
||||
#![feature(dropck_eyepatch)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(intra_doc_pointers)]
|
||||
#![feature(label_break_value)]
|
||||
#![cfg_attr(bootstrap, feature(label_break_value))]
|
||||
#![feature(lang_items)]
|
||||
#![feature(let_else)]
|
||||
#![feature(linkage)]
|
||||
|
@ -1,5 +0,0 @@
|
||||
pub fn main() {
|
||||
'a: { //~ ERROR labels on blocks are unstable
|
||||
break 'a;
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
error[E0658]: labels on blocks are unstable
|
||||
--> $DIR/feature-gate-label_break_value.rs:2:5
|
||||
|
|
||||
LL | 'a: {
|
||||
| ^^
|
||||
|
|
||||
= note: see issue #48594 <https://github.com/rust-lang/rust/issues/48594> for more information
|
||||
= 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`.
|
@ -1,7 +1,6 @@
|
||||
// run-pass
|
||||
#![allow(dead_code)]
|
||||
#![allow(unused_assignments)]
|
||||
#![feature(label_break_value)]
|
||||
|
||||
// Test control flow to follow label_break_value semantics
|
||||
fn label_break(a: bool, b: bool) -> u32 {
|
||||
|
@ -1,5 +1,4 @@
|
||||
#![crate_type = "lib"]
|
||||
#![feature(label_break_value)]
|
||||
|
||||
fn lbv_macro_test_hygiene_respected() {
|
||||
macro_rules! mac2 {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0426]: use of undeclared label `'a`
|
||||
--> $DIR/label_break_value_invalid.rs:7:19
|
||||
--> $DIR/label_break_value_invalid.rs:6:19
|
||||
|
|
||||
LL | break 'a $val;
|
||||
| ^^ undeclared label `'a`
|
||||
@ -10,7 +10,7 @@ LL | mac2!(2);
|
||||
= note: this error originates in the macro `mac2` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0426]: use of undeclared label `'a`
|
||||
--> $DIR/label_break_value_invalid.rs:29:19
|
||||
--> $DIR/label_break_value_invalid.rs:28:19
|
||||
|
|
||||
LL | let x: u8 = mac3!('b: {
|
||||
| -- a label with a similar name is reachable
|
||||
@ -22,7 +22,7 @@ LL | break 'a 3;
|
||||
| help: try using similarly named label: `'b`
|
||||
|
||||
error[E0426]: use of undeclared label `'a`
|
||||
--> $DIR/label_break_value_invalid.rs:34:29
|
||||
--> $DIR/label_break_value_invalid.rs:33:29
|
||||
|
|
||||
LL | let x: u8 = mac3!(break 'a 4);
|
||||
| ^^ undeclared label `'a`
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(label_break_value)]
|
||||
|
||||
fn main() {
|
||||
// This used to ICE during liveness check because `target_id` passed to
|
||||
// `propagate_through_expr` would be the closure and not the `loop`, which wouldn't be found in
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0767]: use of unreachable label `'a`
|
||||
--> $DIR/issue-62480.rs:8:18
|
||||
--> $DIR/issue-62480.rs:6:18
|
||||
|
|
||||
LL | 'a: {
|
||||
| -- unreachable label defined here
|
||||
@ -9,7 +9,7 @@ LL | || break 'a
|
||||
= note: labels are unreachable through functions, closures, async blocks and modules
|
||||
|
||||
error[E0267]: `break` inside of a closure
|
||||
--> $DIR/issue-62480.rs:8:12
|
||||
--> $DIR/issue-62480.rs:6:12
|
||||
|
|
||||
LL | || break 'a
|
||||
| -- ^^^^^^^^ cannot `break` inside of a closure
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(label_break_value)]
|
||||
#![allow(unused_labels)]
|
||||
|
||||
// Simple continue pointing to an unlabeled break should yield in an error
|
||||
|
@ -1,11 +1,11 @@
|
||||
error[E0695]: unlabeled `continue` inside of a labeled block
|
||||
--> $DIR/label_break_value_continue.rs:7:9
|
||||
--> $DIR/label_break_value_continue.rs:6:9
|
||||
|
|
||||
LL | continue;
|
||||
| ^^^^^^^^ `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:14:9
|
||||
--> $DIR/label_break_value_continue.rs:13:9
|
||||
|
|
||||
LL | / 'b: {
|
||||
LL | | continue 'b;
|
||||
@ -14,7 +14,7 @@ LL | | }
|
||||
| |_____- labeled block the `continue` points to
|
||||
|
||||
error[E0695]: unlabeled `continue` inside of a labeled block
|
||||
--> $DIR/label_break_value_continue.rs:22:13
|
||||
--> $DIR/label_break_value_continue.rs:21:13
|
||||
|
|
||||
LL | continue;
|
||||
| ^^^^^^^^ `continue` statements that would diverge to or through a labeled block need to bear a label
|
||||
|
@ -1,5 +1,5 @@
|
||||
// compile-flags: --edition 2018
|
||||
#![feature(label_break_value, try_blocks)]
|
||||
#![feature(try_blocks)]
|
||||
|
||||
// run-pass
|
||||
fn main() {
|
||||
@ -9,4 +9,11 @@ fn main() {
|
||||
break 'foo;
|
||||
}
|
||||
};
|
||||
|
||||
'foo: {
|
||||
let _: Result<(), ()> = try {
|
||||
Err(())?;
|
||||
break 'foo;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
// run-rustfix
|
||||
#![feature(label_break_value)]
|
||||
|
||||
// These are forbidden occurrences of label-break-value
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
// run-rustfix
|
||||
#![feature(label_break_value)]
|
||||
|
||||
// These are forbidden occurrences of label-break-value
|
||||
|
||||
|
@ -1,23 +1,23 @@
|
||||
error: block label not supported here
|
||||
--> $DIR/label_break_value_illegal_uses.rs:8:12
|
||||
--> $DIR/label_break_value_illegal_uses.rs:7:12
|
||||
|
|
||||
LL | unsafe 'b: {}
|
||||
| ^^^ not supported here
|
||||
|
||||
error: block label not supported here
|
||||
--> $DIR/label_break_value_illegal_uses.rs:12:13
|
||||
--> $DIR/label_break_value_illegal_uses.rs:11:13
|
||||
|
|
||||
LL | if true 'b: {}
|
||||
| ^^^ not supported here
|
||||
|
||||
error: block label not supported here
|
||||
--> $DIR/label_break_value_illegal_uses.rs:16:21
|
||||
--> $DIR/label_break_value_illegal_uses.rs:15:21
|
||||
|
|
||||
LL | if true {} else 'b: {}
|
||||
| ^^^ not supported here
|
||||
|
||||
error: block label not supported here
|
||||
--> $DIR/label_break_value_illegal_uses.rs:20:17
|
||||
--> $DIR/label_break_value_illegal_uses.rs:19:17
|
||||
|
|
||||
LL | match false 'b: {
|
||||
| ^^^ not supported here
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(label_break_value)]
|
||||
#![allow(unused_labels)]
|
||||
|
||||
// Simple unlabeled break should yield in an error
|
||||
|
@ -1,11 +1,11 @@
|
||||
error[E0695]: unlabeled `break` inside of a labeled block
|
||||
--> $DIR/label_break_value_unlabeled_break.rs:7:9
|
||||
--> $DIR/label_break_value_unlabeled_break.rs:6:9
|
||||
|
|
||||
LL | break;
|
||||
| ^^^^^ `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:15:13
|
||||
--> $DIR/label_break_value_unlabeled_break.rs:14:13
|
||||
|
|
||||
LL | break;
|
||||
| ^^^^^ `break` statements that would diverge to or through a labeled block need to bear a label
|
||||
|
@ -4,7 +4,6 @@
|
||||
|
||||
// check-pass
|
||||
|
||||
#![feature(label_break_value)]
|
||||
#![warn(unused_labels)]
|
||||
|
||||
fn main() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: label name `'many_used_shadowed` shadows a label name that is already in scope
|
||||
--> $DIR/unused_labels.rs:62:9
|
||||
--> $DIR/unused_labels.rs:61:9
|
||||
|
|
||||
LL | 'many_used_shadowed: for _ in 0..10 {
|
||||
| ------------------- first declared here
|
||||
@ -8,55 +8,55 @@ LL | 'many_used_shadowed: for _ in 0..10 {
|
||||
| ^^^^^^^^^^^^^^^^^^^ label `'many_used_shadowed` already in scope
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:11:5
|
||||
--> $DIR/unused_labels.rs:10:5
|
||||
|
|
||||
LL | 'unused_while_label: while 0 == 0 {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused_labels.rs:8:9
|
||||
--> $DIR/unused_labels.rs:7:9
|
||||
|
|
||||
LL | #![warn(unused_labels)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:16:5
|
||||
--> $DIR/unused_labels.rs:15:5
|
||||
|
|
||||
LL | 'unused_while_let_label: while let Some(_) = opt {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:20:5
|
||||
--> $DIR/unused_labels.rs:19:5
|
||||
|
|
||||
LL | 'unused_for_label: for _ in 0..10 {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:36:9
|
||||
--> $DIR/unused_labels.rs:35:9
|
||||
|
|
||||
LL | 'unused_loop_label_inner_2: for _ in 0..10 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:42:5
|
||||
--> $DIR/unused_labels.rs:41:5
|
||||
|
|
||||
LL | 'unused_loop_label_outer_3: for _ in 0..10 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:60:5
|
||||
--> $DIR/unused_labels.rs:59:5
|
||||
|
|
||||
LL | 'many_used_shadowed: for _ in 0..10 {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:72:5
|
||||
--> $DIR/unused_labels.rs:71:5
|
||||
|
|
||||
LL | 'unused_loop_label: loop {
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused label
|
||||
--> $DIR/unused_labels.rs:78:5
|
||||
--> $DIR/unused_labels.rs:77:5
|
||||
|
|
||||
LL | 'unused_block_label: {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -9,7 +9,6 @@
|
||||
#![feature(decl_macro)]
|
||||
#![feature(generators)]
|
||||
#![feature(half_open_range_patterns)]
|
||||
#![feature(label_break_value)]
|
||||
#![feature(more_qualified_paths)]
|
||||
#![feature(raw_ref_op)]
|
||||
#![feature(trait_alias)]
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(label_break_value)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
macro_rules! m {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: cannot use a `block` macro fragment here
|
||||
--> $DIR/bad-interpolated-block.rs:7:15
|
||||
--> $DIR/bad-interpolated-block.rs:5:15
|
||||
|
|
||||
LL | 'lab: $b;
|
||||
| ------^^
|
||||
@ -12,7 +12,7 @@ LL | m!({});
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: cannot use a `block` macro fragment here
|
||||
--> $DIR/bad-interpolated-block.rs:8:16
|
||||
--> $DIR/bad-interpolated-block.rs:6:16
|
||||
|
|
||||
LL | unsafe $b;
|
||||
| -------^^
|
||||
@ -25,7 +25,7 @@ LL | m!({});
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: cannot use a `block` macro fragment here
|
||||
--> $DIR/bad-interpolated-block.rs:9:23
|
||||
--> $DIR/bad-interpolated-block.rs:7:23
|
||||
|
|
||||
LL | |x: u8| -> () $b;
|
||||
| ^^ the `block` fragment is within this context
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(label_break_value)]
|
||||
|
||||
fn main() {
|
||||
'l0 while false {} //~ ERROR labeled expression must be followed by `:`
|
||||
'l1 for _ in 0..1 {} //~ ERROR labeled expression must be followed by `:`
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: labeled expression must be followed by `:`
|
||||
--> $DIR/labeled-no-colon-expr.rs:4:5
|
||||
--> $DIR/labeled-no-colon-expr.rs:2:5
|
||||
|
|
||||
LL | 'l0 while false {}
|
||||
| ----^^^^^^^^^^^^^^
|
||||
@ -10,7 +10,7 @@ LL | 'l0 while false {}
|
||||
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||
|
||||
error: labeled expression must be followed by `:`
|
||||
--> $DIR/labeled-no-colon-expr.rs:5:5
|
||||
--> $DIR/labeled-no-colon-expr.rs:3:5
|
||||
|
|
||||
LL | 'l1 for _ in 0..1 {}
|
||||
| ----^^^^^^^^^^^^^^^^
|
||||
@ -21,7 +21,7 @@ LL | 'l1 for _ in 0..1 {}
|
||||
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||
|
||||
error: labeled expression must be followed by `:`
|
||||
--> $DIR/labeled-no-colon-expr.rs:6:5
|
||||
--> $DIR/labeled-no-colon-expr.rs:4:5
|
||||
|
|
||||
LL | 'l2 loop {}
|
||||
| ----^^^^^^^
|
||||
@ -32,7 +32,7 @@ LL | 'l2 loop {}
|
||||
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||
|
||||
error: labeled expression must be followed by `:`
|
||||
--> $DIR/labeled-no-colon-expr.rs:7:5
|
||||
--> $DIR/labeled-no-colon-expr.rs:5:5
|
||||
|
|
||||
LL | 'l3 {}
|
||||
| ----^^
|
||||
@ -43,7 +43,7 @@ LL | 'l3 {}
|
||||
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||
|
||||
error: expected `while`, `for`, `loop` or `{` after a label
|
||||
--> $DIR/labeled-no-colon-expr.rs:8:9
|
||||
--> $DIR/labeled-no-colon-expr.rs:6:9
|
||||
|
|
||||
LL | 'l4 0;
|
||||
| ^ expected `while`, `for`, `loop` or `{` after a label
|
||||
@ -55,7 +55,7 @@ LL + 0;
|
||||
|
|
||||
|
||||
error: labeled expression must be followed by `:`
|
||||
--> $DIR/labeled-no-colon-expr.rs:8:9
|
||||
--> $DIR/labeled-no-colon-expr.rs:6:9
|
||||
|
|
||||
LL | 'l4 0;
|
||||
| ----^
|
||||
@ -66,7 +66,7 @@ LL | 'l4 0;
|
||||
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||
|
||||
error: cannot use a `block` macro fragment here
|
||||
--> $DIR/labeled-no-colon-expr.rs:13:17
|
||||
--> $DIR/labeled-no-colon-expr.rs:11:17
|
||||
|
|
||||
LL | 'l5 $b;
|
||||
| ----^^
|
||||
@ -79,7 +79,7 @@ LL | m!({});
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: labeled expression must be followed by `:`
|
||||
--> $DIR/labeled-no-colon-expr.rs:16:8
|
||||
--> $DIR/labeled-no-colon-expr.rs:14:8
|
||||
|
|
||||
LL | 'l5 $b;
|
||||
| ---- help: add `:` after the label
|
||||
|
@ -1,5 +1,4 @@
|
||||
// run-rustfix
|
||||
#![feature(label_break_value)]
|
||||
fn main() {
|
||||
let _ = 1 + 1; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
// run-rustfix
|
||||
#![feature(label_break_value)]
|
||||
fn main() {
|
||||
let _ = 'label: 1 + 1; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: expected `while`, `for`, `loop` or `{` after a label
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:4:21
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:3:21
|
||||
|
|
||||
LL | let _ = 'label: 1 + 1;
|
||||
| ^ expected `while`, `for`, `loop` or `{` after a label
|
||||
@ -11,7 +11,7 @@ LL + let _ = 1 + 1;
|
||||
|
|
||||
|
||||
error: expected `while`, `for`, `loop` or `{` after a label
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:6:13
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:5:13
|
||||
|
|
||||
LL | 'label: match () { () => {}, };
|
||||
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
|
||||
@ -23,7 +23,7 @@ LL + match () { () => {}, };
|
||||
|
|
||||
|
||||
error: expected `while`, `for`, `loop` or `{` after a label
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:7:13
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:6:13
|
||||
|
|
||||
LL | 'label: match () { () => break 'label, };
|
||||
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
|
||||
@ -34,7 +34,7 @@ LL | 'label: { match () { () => break 'label, } };
|
||||
| + +
|
||||
|
||||
error: expected `while`, `for`, `loop` or `{` after a label
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:9:13
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:8:13
|
||||
|
|
||||
LL | 'label: match () { () => 'lp: loop { break 'lp 0 }, };
|
||||
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
|
||||
@ -45,7 +45,7 @@ LL | 'label: { match () { () => 'lp: loop { break 'lp 0 }, } };
|
||||
| + +
|
||||
|
||||
error: expected `while`, `for`, `loop` or `{` after a label
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:12:22
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:11:22
|
||||
|
|
||||
LL | let _i = 'label: match x {
|
||||
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
|
||||
@ -60,7 +60,7 @@ LL ~ } };
|
||||
|
|
||||
|
||||
error: expected `while`, `for`, `loop` or `{` after a label
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:26:24
|
||||
--> $DIR/recover-labeled-non-block-expr.rs:25:24
|
||||
|
|
||||
LL | let _val = 'label: (1, if other == 3 { break 'label (2, 3) } else { other });
|
||||
| ^ expected `while`, `for`, `loop` or `{` after a label
|
||||
|
@ -1,6 +1,5 @@
|
||||
#![warn(clippy::semicolon_if_nothing_returned)]
|
||||
#![allow(clippy::redundant_closure)]
|
||||
#![feature(label_break_value)]
|
||||
#![feature(let_else)]
|
||||
|
||||
fn get_unit() {}
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: consider adding a `;` to the last statement for consistent formatting
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:10:5
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:9:5
|
||||
|
|
||||
LL | println!("Hello")
|
||||
| ^^^^^^^^^^^^^^^^^ help: add a `;` here: `println!("Hello");`
|
||||
@ -7,25 +7,25 @@ LL | println!("Hello")
|
||||
= note: `-D clippy::semicolon-if-nothing-returned` implied by `-D warnings`
|
||||
|
||||
error: consider adding a `;` to the last statement for consistent formatting
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:14:5
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:13:5
|
||||
|
|
||||
LL | get_unit()
|
||||
| ^^^^^^^^^^ help: add a `;` here: `get_unit();`
|
||||
|
||||
error: consider adding a `;` to the last statement for consistent formatting
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:19:5
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:18:5
|
||||
|
|
||||
LL | y = x + 1
|
||||
| ^^^^^^^^^ help: add a `;` here: `y = x + 1;`
|
||||
|
||||
error: consider adding a `;` to the last statement for consistent formatting
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:25:9
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:24:9
|
||||
|
|
||||
LL | hello()
|
||||
| ^^^^^^^ help: add a `;` here: `hello();`
|
||||
|
||||
error: consider adding a `;` to the last statement for consistent formatting
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:36:9
|
||||
--> $DIR/semicolon_if_nothing_returned.rs:35:9
|
||||
|
|
||||
LL | ptr::drop_in_place(s.as_mut_ptr())
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add a `;` here: `ptr::drop_in_place(s.as_mut_ptr());`
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(label_break_value)]
|
||||
|
||||
fn main() {
|
||||
let mut res = 0;
|
||||
's_39: { if res == 0i32 { println!("Hello, world!"); } }
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(label_break_value)]
|
||||
|
||||
fn main() {
|
||||
let mut res = 0;
|
||||
's_39: {
|
||||
|
Loading…
x
Reference in New Issue
Block a user