Don't allow const to begin a nonterminal by camelid · Pull Request #80135 · rust-lang/rust (original) (raw)

lf- added a commit to lf-/rust that referenced this pull request

Apr 26, 2021

@lf-

This makes it possible to use inline_const (rust-lang#76001) and let_chains (rust-lang#53667) inside macros' expr patterns in a future edition by bifurcating the expr nonterminal in a similar way to pat2021 to remove some backwards compatibility exceptions that disallow const/let at the beginning of an expr match.

Fixes rust-lang#84155 and relaxes the backward compat restriction from rust-lang#80135 for a future edition. This is not intended to go into 2021 as it I don't think it's simple to write an automatic fix, and certainly not now that it's past the soft deadline for inclusion in 2021 by a long shot.

Here is a pathological case of rust-lang#79908 that forces this to be an edition change:

macro_rules! evil {
    ($e:expr) => {
        // or something else
        const {$e-1}
    };
    (const $b:block) => {
        const {$b}
    }
}
fn main() {
    let x = 5;
    match x {
        evil!(const { 5 }) => panic!("oh no"),
        _ => (),
    };
}