mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-25 22:22:44 +00:00
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
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
17
src/test/ui/did_you_mean/multiple-pattern-typo.rs
Normal file
17
src/test/ui/did_you_mean/multiple-pattern-typo.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// 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 main() {
|
||||
let x = 3;
|
||||
match x {
|
||||
1 | 2 || 3 => (), //~ ERROR unexpected token `||` after pattern
|
||||
_ => (),
|
||||
}
|
||||
}
|
8
src/test/ui/did_you_mean/multiple-pattern-typo.stderr
Normal file
8
src/test/ui/did_you_mean/multiple-pattern-typo.stderr
Normal file
@ -0,0 +1,8 @@
|
||||
error: unexpected token `||` after pattern
|
||||
--> $DIR/multiple-pattern-typo.rs:14:15
|
||||
|
|
||||
14 | 1 | 2 || 3 => (), //~ ERROR unexpected token `||` after pattern
|
||||
| ^^ help: use a single `|` to specify multiple patterns: `|`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user