Skip to content

Commit 5e89e63

Browse files
authored
Merge pull request #1135 from mattheww/2022-01_pat_metavariables
Document the 2021 edition changes to macros-by-example `pat` metavariables
2 parents 434eb96 + 94a041f commit 5e89e63

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/macros-by-example.md

+12-2
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ fragment specifiers are:
123123
* `stmt`: a [_Statement_] without the trailing semicolon (except for item
124124
statements that require semicolons)
125125
* `pat_param`: a [_PatternNoTopAlt_]
126-
* `pat`: equivalent to `pat_param`
126+
* `pat`: at least any [_PatternNoTopAlt_], and possibly more depending on edition
127127
* `expr`: an [_Expression_]
128128
* `ty`: a [_Type_]
129129
* `ident`: an [IDENTIFIER_OR_KEYWORD] or [RAW_IDENTIFIER]
@@ -140,6 +140,12 @@ the syntax element that matched them. The keyword metavariable `$crate` can be
140140
used to refer to the current crate; see [Hygiene] below. Metavariables can be
141141
transcribed more than once or not at all.
142142

143+
> **Edition Differences**: Starting with the 2021 edition, `pat` fragment-specifiers match top-level or-patterns (that is, they accept [_Pattern_]).
144+
>
145+
> Before the 2021 edition, they match exactly the same fragments as `pat_param` (that is, they accept [_PatternNoTopAlt_]).
146+
>
147+
> The relevant edition is the one in effect for the `macro_rules!` definition.
148+
143149
## Repetitions
144150

145151
In both the matcher and transcriber, repetitions are indicated by placing the
@@ -451,7 +457,8 @@ Matchers like `$i:expr,` or `$i:expr;` would be legal, however, because `,` and
451457
`;` are legal expression separators. The specific rules are:
452458

453459
* `expr` and `stmt` may only be followed by one of: `=>`, `,`, or `;`.
454-
* `pat` and `pat_param` may only be followed by one of: `=>`, `,`, `=`, `|`, `if`, or `in`.
460+
* `pat_param` may only be followed by one of: `=>`, `,`, `=`, `|`, `if`, or `in`.
461+
* `pat` may only be followed by one of: `=>`, `,`, `=`, `if`, or `in`.
455462
* `path` and `ty` may only be followed by one of: `=>`, `,`, `=`, `|`, `;`,
456463
`:`, `>`, `>>`, `[`, `{`, `as`, `where`, or a macro variable of `block`
457464
fragment specifier.
@@ -460,6 +467,8 @@ Matchers like `$i:expr,` or `$i:expr;` would be legal, however, because `,` and
460467
`ident`, `ty`, or `path` fragment specifier.
461468
* All other fragment specifiers have no restrictions.
462469

470+
> **Edition Differences**: Before the 2021 edition, `pat` may also be followed by `|`.
471+
463472
When repetitions are involved, then the rules apply to every possible number of
464473
expansions, taking separators into account. This means:
465474

@@ -490,6 +499,7 @@ For more detail, see the [formal specification].
490499
[_Item_]: items.md
491500
[_LiteralExpression_]: expressions/literal-expr.md
492501
[_MetaListIdents_]: attributes.md#meta-item-attribute-syntax
502+
[_Pattern_]: patterns.md
493503
[_PatternNoTopAlt_]: patterns.md
494504
[_Statement_]: statements.md
495505
[_TokenTree_]: macros.md#macro-invocation

0 commit comments

Comments
 (0)