Skip to content

Commit 62659eb

Browse files
Rollup merge of rust-lang#44332 - tirr-c:issue-44021, r=petrochenkov
Expect pipe symbol after closure parameter list Fixes rust-lang#44021. --- Originally, the parser just called `bump` to discard following token after parsing closure parameter list, because it assumes `|` is following. However, the following code breaks the assumption: ```rust struct MyStruct; impl MyStruct { fn f() {|x, y} } ``` Here, the parameter list is `x, y` and the following token is `}`. The parser discards `}`, and then we have a curly bracket mismatch. Indeed, this code has a syntax error. On current nightly, the compiler emits an syntax error, but with incorrect message and span, followed by an ICE. ``` error: expected expression, found `}` --> 44021.rs:4:1 | 4 | } | ^ error: internal compiler error: unexpected panic ``` Even worse, on current stable(1.20.0), the compiler falls into an infinite loop. This pull request fixes this problem. Now the compiler emits correct error message and span, and does not ICE. ``` error: expected one of `:`, `@`, or `|`, found `}` --> 44021.rs:3:20 | 3 | fn foo() {|x, y} | ^ expected one of `:`, `@`, or `|` here ```
2 parents 078e1c5 + 258ec30 commit 62659eb

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4699,7 +4699,7 @@ impl<'a> Parser<'a> {
46994699
SeqSep::trailing_allowed(token::Comma),
47004700
|p| p.parse_fn_block_arg()
47014701
);
4702-
self.bump();
4702+
self.expect(&token::BinOp(token::Or))?;
47034703
args
47044704
}
47054705
};

src/test/compile-fail/issue-44021.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
struct MyStruct;
12+
impl MyStruct {
13+
fn f() {|x, y} //~ ERROR expected one of `:`, `@`, or `|`, found `}`
14+
}
15+
16+
fn main() {}

0 commit comments

Comments
 (0)