Or patterns in macro-rules
Summary
Details
Starting in Rust 1.53.0, patterns
are extended to support | nested anywhere in the pattern.
This enables you to write Some(1 | 2) instead of Some(1) | Some(2).
Since this was simply not allowed before, this is not a breaking change.
However, this change also affects macro_rules macros.
Such macros can accept patterns using the :pat fragment specifier.
Currently, :pat does not match |, since before Rust 1.53,
not all patterns (at all nested levels) could contain a |.
Macros that accept patterns like A | B,
such as matches!()
use something like $($_:pat)|+.
Because we don't want to break any existing macros,
we did not change the meaning of :pat in Rust 1.53.0 to include |.
Instead, we will make that change as part of Rust 2021.
In the new edition, the :pat fragment specifier will match A | B.
Since there are times that one still wishes to match a single pattern
variant without |, the fragment specified :pat_param has been added
to retain the older behavior.
The name refers to its main use case: a pattern in a closure parameter.