Auto merge of #47232 - keatinge:master, r=petrochenkov
Add help message for incorrect pattern syntax When I was getting started with rust I often made the mistake of using `||` instead of `|` to match multiple patterns and spent a long time staring at my code wondering what was wrong. for example: ``` fn main() { let x = 1; match x { 1 || 2 => println!("1 or 2"), _ => println!("Something else"), } } ``` If you compile this with current rustc you will see ``` error: expected one of `...`, `..=`, `..`, `=>`, `if`, or `|`, found `||` --> test.rs:5:11 | 5 | 1 || 2 => println!("1 or 2"), | -^^ unexpected token | | | expected one of `...`, `..=`, `..`, `=>`, `if`, or `|` here error: aborting due to previous error ``` With my proposed change it will show: ``` error: unexpected token `||` after pattern --> test.rs:5:11 | 5 | 1 || 2 => println!("1 or 2"), | ^^ | = help: did you mean to use `|` to specify multiple patterns instead? error: aborting due to previous error ```
This commit is contained in:
commit
1b193de98a
3 changed files with 39 additions and 2 deletions
|
@ -3431,8 +3431,20 @@ impl<'a> Parser<'a> {
|
|||
let mut pats = Vec::new();
|
||||
loop {
|
||||
pats.push(self.parse_pat()?);
|
||||
if self.check(&token::BinOp(token::Or)) { self.bump();}
|
||||
else { return Ok(pats); }
|
||||
|
||||
if self.token == token::OrOr {
|
||||
let mut err = self.struct_span_err(self.span,
|
||||
"unexpected token `||` after pattern");
|
||||
err.span_suggestion(self.span,
|
||||
"use a single `|` to specify multiple patterns",
|
||||
"|".to_owned());
|
||||
err.emit();
|
||||
self.bump();
|
||||
} else if self.check(&token::BinOp(token::Or)) {
|
||||
self.bump();
|
||||
} else {
|
||||
return Ok(pats);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue