reference icon indicating copy to clipboard operation
reference copied to clipboard

mbe matchers can contain dollar ($)

Open ehuss opened this issue 2 years ago • 0 comments

Macro matchers allow $ as the last token of a token tree:

macro_rules! foo {
    ($) => {};
    (last$) => {};
    ({$}) => {};
    ([$]) => {};
    (($)) => {};
}

fn main() {
    foo!($);
    foo!(last$);
    foo!({$});
    foo!([$]);
    foo!(($));
}

This was changed in https://github.com/rust-lang/rust/pull/39419 in 1.17. That PR didn't mention this behavior change, so it is not clear if it was intentional. I believe this behavior is due to this line.

I see quite a lot of crates on crates.io relying on this behavior, so I don't think it is something that can be (easily) changed. I would lean towards just updating the documentation. Or perhaps it could be restricted to be a bare dollar within delimiters like ($) or [$] or {$} which is what almost all of the usages are (I didn't do an exhaustive check for the last$ style).

Initially the parts that could be updated are:

  • MacroMatch rule where it says "except $": https://github.com/rust-lang/reference/blob/0cd078da502f723f8bb1ac30ac772021e200edc9/src/macros-by-example.md?plain=1#L24 This could be updated, though it is starting to get too complex to explain in a subscript.
  • The sentence "The character $ cannot be matched or transcribed literally.": https://github.com/rust-lang/reference/blob/0cd078da502f723f8bb1ac30ac772021e200edc9/src/macros-by-example.md?plain=1#L76-L77 I think this is wrong on multiple points. $ can be transcribed literally (often used for emitting macros). $ can be matched as the last token of a token tree. $$ can be transcribed to a $ (via #1192).

Generally I think the mbe documentation could use a lot of expansion to describe its behavior more precisely and completely, this is just a small part that could be improved.

ehuss avatar Jun 12 '22 21:06 ehuss