@@ -900,7 +900,11 @@ pub enum NonterminalKind {
900900 PatWithOr ,
901901 Expr ,
902902 /// Matches an expression using the rules from edition 2021 and earlier.
903- Expr2021 ,
903+ Expr2021 {
904+ /// Keep track of whether the user used `:expr` or `:expr_2021` and we inferred it from the
905+ /// edition of the span. This is used for diagnostics AND feature gating.
906+ inferred : bool ,
907+ } ,
904908 Ty ,
905909 Ident ,
906910 Lifetime ,
@@ -929,8 +933,13 @@ impl NonterminalKind {
929933 Edition :: Edition2021 | Edition :: Edition2024 => NonterminalKind :: PatWithOr ,
930934 } ,
931935 sym:: pat_param => NonterminalKind :: PatParam { inferred : false } ,
932- sym:: expr => NonterminalKind :: Expr ,
933- sym:: expr_2021 if edition ( ) . at_least_rust_2021 ( ) => NonterminalKind :: Expr2021 ,
936+ sym:: expr => match edition ( ) {
937+ Edition :: Edition2015 | Edition :: Edition2018 | Edition :: Edition2021 => {
938+ NonterminalKind :: Expr2021 { inferred : true }
939+ }
940+ Edition :: Edition2024 => NonterminalKind :: Expr ,
941+ } ,
942+ sym:: expr_2021 => NonterminalKind :: Expr2021 { inferred : false } ,
934943 sym:: ty => NonterminalKind :: Ty ,
935944 sym:: ident => NonterminalKind :: Ident ,
936945 sym:: lifetime => NonterminalKind :: Lifetime ,
@@ -949,8 +958,8 @@ impl NonterminalKind {
949958 NonterminalKind :: Stmt => sym:: stmt,
950959 NonterminalKind :: PatParam { inferred : false } => sym:: pat_param,
951960 NonterminalKind :: PatParam { inferred : true } | NonterminalKind :: PatWithOr => sym:: pat,
952- NonterminalKind :: Expr => sym:: expr,
953- NonterminalKind :: Expr2021 => sym:: expr_2021,
961+ NonterminalKind :: Expr | NonterminalKind :: Expr2021 { inferred : true } => sym:: expr,
962+ NonterminalKind :: Expr2021 { inferred : false } => sym:: expr_2021,
954963 NonterminalKind :: Ty => sym:: ty,
955964 NonterminalKind :: Ident => sym:: ident,
956965 NonterminalKind :: Lifetime => sym:: lifetime,
0 commit comments