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
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"),
_ => (),
};
}