Skip to content

Commit

Permalink
Rollup merge of #91385 - ecstatic-morse:pat-param-spec-suggest, r=est…
Browse files Browse the repository at this point in the history
…ebank

Suggest the `pat_param` specifier before `|` on 2021 edition

Ran into this today after writing some Rust for the first time in a while.

r? `@estebank`
  • Loading branch information
matthiaskrgr authored Dec 4, 2021
2 parents 420ddd0 + bfd95e1 commit 2b64476
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 6 deletions.
18 changes: 18 additions & 0 deletions compiler/rustc_expand/src/mbe/macro_rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1027,6 +1027,24 @@ fn check_matcher_core(
),
);
err.span_label(sp, format!("not allowed after `{}` fragments", kind));

if kind == NonterminalKind::PatWithOr
&& sess.edition == Edition::Edition2021
&& next_token.is_token(&BinOp(token::BinOpToken::Or))
{
let suggestion = quoted_tt_to_string(&TokenTree::MetaVarDecl(
span,
name,
Some(NonterminalKind::PatParam { inferred: false }),
));
err.span_suggestion(
span,
&format!("try a `pat_param` fragment specifier instead"),
suggestion,
Applicability::MaybeIncorrect,
);
}

let msg = "allowed there are: ";
match possible {
&[] => {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,29 @@ error: `$x:pat` is followed by `|`, which is not allowed for `pat` fragments
--> $DIR/macro-pat-pattern-followed-by-or-in-2021.rs:3:28
|
LL | macro_rules! foo { ($x:pat | $y:pat) => {} }
| ^ not allowed after `pat` fragments
| ------ ^ not allowed after `pat` fragments
| |
| help: try a `pat_param` fragment specifier instead: `$x:pat_param`
|
= note: allowed there are: `=>`, `,`, `=`, `if` or `in`

error: `$x:pat` is followed by `|`, which is not allowed for `pat` fragments
--> $DIR/macro-pat-pattern-followed-by-or-in-2021.rs:4:32
|
LL | macro_rules! bar { ($($x:pat)+ | $($y:pat)+) => {} }
| ^ not allowed after `pat` fragments
| ------ ^ not allowed after `pat` fragments
| |
| help: try a `pat_param` fragment specifier instead: `$x:pat_param`
|
= note: allowed there are: `=>`, `,`, `=`, `if` or `in`

error: `$pat:pat` may be followed by `|`, which is not allowed for `pat` fragments
--> $DIR/macro-pat-pattern-followed-by-or-in-2021.rs:7:36
|
LL | ( $expr:expr , $( $( $pat:pat )|+ => $expr_arm:expr ),+ ) => {
| ^ not allowed after `pat` fragments
| -------- ^ not allowed after `pat` fragments
| |
| help: try a `pat_param` fragment specifier instead: `$pat:pat_param`
|
= note: allowed there are: `=>`, `,`, `=`, `if` or `in`

Expand Down
12 changes: 9 additions & 3 deletions src/test/ui/macros/macro-pat2021-pattern-followed-by-or.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,29 @@ error: `$x:pat` is followed by `|`, which is not allowed for `pat` fragments
--> $DIR/macro-pat2021-pattern-followed-by-or.rs:4:28
|
LL | macro_rules! foo { ($x:pat | $y:pat) => {} }
| ^ not allowed after `pat` fragments
| ------ ^ not allowed after `pat` fragments
| |
| help: try a `pat_param` fragment specifier instead: `$x:pat_param`
|
= note: allowed there are: `=>`, `,`, `=`, `if` or `in`

error: `$x:pat` is followed by `|`, which is not allowed for `pat` fragments
--> $DIR/macro-pat2021-pattern-followed-by-or.rs:7:28
|
LL | macro_rules! ogg { ($x:pat | $y:pat_param) => {} }
| ^ not allowed after `pat` fragments
| ------ ^ not allowed after `pat` fragments
| |
| help: try a `pat_param` fragment specifier instead: `$x:pat_param`
|
= note: allowed there are: `=>`, `,`, `=`, `if` or `in`

error: `$pat:pat` may be followed by `|`, which is not allowed for `pat` fragments
--> $DIR/macro-pat2021-pattern-followed-by-or.rs:9:35
|
LL | ( $expr:expr , $( $( $pat:pat)|+ => $expr_arm:pat),+ ) => {
| ^ not allowed after `pat` fragments
| -------- ^ not allowed after `pat` fragments
| |
| help: try a `pat_param` fragment specifier instead: `$pat:pat_param`
|
= note: allowed there are: `=>`, `,`, `=`, `if` or `in`

Expand Down

0 comments on commit 2b64476

Please sign in to comment.