Commit fe549f1
committed
Fix macro matching for
PR rust-lang#95159 unintentionally changed the behaviour of declarative macro
matching for `NoDelim` delimited sequences.
- Before rust-lang#95159, delimiters were implicit in `mbe::Delimited`. When
doing macro matching, normal delimiters were generated out of thin air
as necessary, but `NoDelim` delimiters were not. This was done within
`TokenTree::{get_tt,len}`.
- After rust-lang#95159, the delimiters were explicit. There was an unintentional
change whereby `NoDelim` delimiters were represented explicitly just
like normal delimeters.
- rust-lang#95555 introduced a new matcher representation (`MatcherLoc`) and the
`NoDelim` delimiters were made explicit within it, just like
`mbe::Delimited`.
- rust-lang#95797 then changed `mbe::Delimited` back to having implicit
delimiters, but because matching is now being done on `MatcherLoc`,
the behavioural change persisted.
The fix is simple: remove the explicit `NoDelim` delimiters in the
`MatcherLoc` representation. This gives back the original behaviour.
As for why this took so long to be found: it seems that `NoDelim`
sequences are unusual. It took a macro that generates another macro
(from the `yarte_lexer` crate, found via a crater run) to uncover this.
Fixes rust-lang#96305.NoDelim delimited sequences.1 parent b04c532 commit fe549f1
1 file changed
+6
-2
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
144 | 144 | | |
145 | 145 | | |
146 | 146 | | |
147 | | - | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
148 | 150 | | |
149 | | - | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
150 | 154 | | |
151 | 155 | | |
152 | 156 | | |
| |||
0 commit comments