Skip to content

Commit

Permalink
Auto merge of #50155 - est31:label_expressions, r=petrochenkov
Browse files Browse the repository at this point in the history
'label can start expressions

```Rust
let foo = 'label: loop { break 'label 42; };
```

is valid Rust code.
  • Loading branch information
bors committed Apr 28, 2018
2 parents 207bc40 + edee60d commit ff65726
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/libsyntax/parse/token.rs
Expand Up @@ -277,9 +277,10 @@ impl Token {
DotDot | DotDotDot | DotDotEq | // range notation
Lt | BinOp(Shl) | // associated path
ModSep | // global path
Lifetime(..) | // labeled loop
Pound => true, // expression attributes
Interpolated(ref nt) => match nt.0 {
NtIdent(..) | NtExpr(..) | NtBlock(..) | NtPath(..) => true,
NtIdent(..) | NtExpr(..) | NtBlock(..) | NtPath(..) | NtLifetime(..) => true,
_ => false,
},
_ => false,
Expand Down
23 changes: 23 additions & 0 deletions src/test/ui/lifetime_starts_expressions.rs
@@ -0,0 +1,23 @@
// 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

fn foo() -> u32 {
return 'label: loop { break 'label 42; };
}

fn bar() -> u32 {
loop { break 'label: loop { break 'label 42; }; }
//~^ ERROR expected identifier, found keyword `loop`
//~| ERROR expected type, found keyword `loop`
}

pub fn main() {
foo();
}
14 changes: 14 additions & 0 deletions src/test/ui/lifetime_starts_expressions.stderr
@@ -0,0 +1,14 @@
error: expected identifier, found keyword `loop`
--> $DIR/lifetime_starts_expressions.rs:16:26
|
LL | loop { break 'label: loop { break 'label 42; }; }
| ^^^^ expected identifier, found keyword

error: expected type, found keyword `loop`
--> $DIR/lifetime_starts_expressions.rs:16:26
|
LL | loop { break 'label: loop { break 'label 42; }; }
| ^^^^ expecting a type here because of type ascription

error: aborting due to 2 previous errors

0 comments on commit ff65726

Please sign in to comment.