@@ -900,7 +900,11 @@ pub enum NonterminalKind {
900
900
PatWithOr ,
901
901
Expr ,
902
902
/// 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
+ } ,
904
908
Ty ,
905
909
Ident ,
906
910
Lifetime ,
@@ -929,8 +933,13 @@ impl NonterminalKind {
929
933
Edition :: Edition2021 | Edition :: Edition2024 => NonterminalKind :: PatWithOr ,
930
934
} ,
931
935
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 } ,
934
943
sym:: ty => NonterminalKind :: Ty ,
935
944
sym:: ident => NonterminalKind :: Ident ,
936
945
sym:: lifetime => NonterminalKind :: Lifetime ,
@@ -949,8 +958,8 @@ impl NonterminalKind {
949
958
NonterminalKind :: Stmt => sym:: stmt,
950
959
NonterminalKind :: PatParam { inferred : false } => sym:: pat_param,
951
960
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,
954
963
NonterminalKind :: Ty => sym:: ty,
955
964
NonterminalKind :: Ident => sym:: ident,
956
965
NonterminalKind :: Lifetime => sym:: lifetime,
0 commit comments