about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-06-19 12:21:09 -0400
committerMichael Goulet <michael@errs.io>2024-06-19 12:37:49 -0400
commit3e8898a4e1afd44f09a5a80d466cd5b1a87e0fa8 (patch)
tree759ba772fbe6d0d5be600eaa040f085616ba56ba
parent50d1efa3e2aa3c1e91f9f7869225897800ce1cce (diff)
downloadrust-3e8898a4e1afd44f09a5a80d466cd5b1a87e0fa8.tar.gz
rust-3e8898a4e1afd44f09a5a80d466cd5b1a87e0fa8.zip
Allow naming expr_2021 in all editions
-rw-r--r--compiler/rustc_ast/src/token.rs19
-rw-r--r--compiler/rustc_expand/src/mbe/macro_rules.rs4
-rw-r--r--compiler/rustc_expand/src/mbe/quoted.rs3
-rw-r--r--compiler/rustc_parse/src/parser/nonterminal.rs5
-rw-r--r--tests/ui/macros/expr_2021_implicit_in_2024.rs2
-rw-r--r--tests/ui/macros/expr_2021_implicit_in_2024.stderr10
-rw-r--r--tests/ui/macros/expr_2021_old_edition.rs13
-rw-r--r--tests/ui/macros/expr_2021_old_edition.stderr26
8 files changed, 23 insertions, 59 deletions
diff --git a/compiler/rustc_ast/src/token.rs b/compiler/rustc_ast/src/token.rs
index 109c401bb6a..9c8b2451b79 100644
--- a/compiler/rustc_ast/src/token.rs
+++ b/compiler/rustc_ast/src/token.rs
@@ -884,7 +884,11 @@ pub enum NonterminalKind {
     PatWithOr,
     Expr,
     /// Matches an expression using the rules from edition 2021 and earlier.
-    Expr2021,
+    Expr2021 {
+        /// Keep track of whether the user used `:expr` or `:expr_2021` and we inferred it from the
+        /// edition of the span. This is used for diagnostics AND feature gating.
+        inferred: bool,
+    },
     Ty,
     Ident,
     Lifetime,
@@ -913,8 +917,13 @@ impl NonterminalKind {
                 Edition::Edition2021 | Edition::Edition2024 => NonterminalKind::PatWithOr,
             },
             sym::pat_param => NonterminalKind::PatParam { inferred: false },
-            sym::expr => NonterminalKind::Expr,
-            sym::expr_2021 if edition().at_least_rust_2021() => NonterminalKind::Expr2021,
+            sym::expr => match edition() {
+                Edition::Edition2015 | Edition::Edition2018 | Edition::Edition2021 => {
+                    NonterminalKind::Expr2021 { inferred: true }
+                }
+                Edition::Edition2024 => NonterminalKind::Expr,
+            },
+            sym::expr_2021 => NonterminalKind::Expr2021 { inferred: false },
             sym::ty => NonterminalKind::Ty,
             sym::ident => NonterminalKind::Ident,
             sym::lifetime => NonterminalKind::Lifetime,
@@ -933,8 +942,8 @@ impl NonterminalKind {
             NonterminalKind::Stmt => sym::stmt,
             NonterminalKind::PatParam { inferred: false } => sym::pat_param,
             NonterminalKind::PatParam { inferred: true } | NonterminalKind::PatWithOr => sym::pat,
-            NonterminalKind::Expr => sym::expr,
-            NonterminalKind::Expr2021 => sym::expr_2021,
+            NonterminalKind::Expr | NonterminalKind::Expr2021 { inferred: true } => sym::expr,
+            NonterminalKind::Expr2021 { inferred: false } => sym::expr_2021,
             NonterminalKind::Ty => sym::ty,
             NonterminalKind::Ident => sym::ident,
             NonterminalKind::Lifetime => sym::lifetime,
diff --git a/compiler/rustc_expand/src/mbe/macro_rules.rs b/compiler/rustc_expand/src/mbe/macro_rules.rs
index 49b1f5ce0e3..0050ff10539 100644
--- a/compiler/rustc_expand/src/mbe/macro_rules.rs
+++ b/compiler/rustc_expand/src/mbe/macro_rules.rs
@@ -1292,7 +1292,9 @@ fn is_in_follow(tok: &mbe::TokenTree, kind: NonterminalKind) -> IsInFollow {
                 // maintain
                 IsInFollow::Yes
             }
-            NonterminalKind::Stmt | NonterminalKind::Expr | NonterminalKind::Expr2021 => {
+            NonterminalKind::Stmt
+            | NonterminalKind::Expr
+            | NonterminalKind::Expr2021 { inferred: _ } => {
                 const TOKENS: &[&str] = &["`=>`", "`,`", "`;`"];
                 match tok {
                     TokenTree::Token(token) => match token.kind {
diff --git a/compiler/rustc_expand/src/mbe/quoted.rs b/compiler/rustc_expand/src/mbe/quoted.rs
index 74f78c0ef78..fdf187438d3 100644
--- a/compiler/rustc_expand/src/mbe/quoted.rs
+++ b/compiler/rustc_expand/src/mbe/quoted.rs
@@ -113,7 +113,8 @@ pub(super) fn parse(
                                                 );
                                                 token::NonterminalKind::Ident
                                             });
-                                    if kind == token::NonterminalKind::Expr2021
+                                    if kind
+                                        == (token::NonterminalKind::Expr2021 { inferred: false })
                                         && !features.expr_fragment_specifier_2024
                                     {
                                         rustc_session::parse::feature_err(
diff --git a/compiler/rustc_parse/src/parser/nonterminal.rs b/compiler/rustc_parse/src/parser/nonterminal.rs
index a0b704aeea5..59f6eff07b3 100644
--- a/compiler/rustc_parse/src/parser/nonterminal.rs
+++ b/compiler/rustc_parse/src/parser/nonterminal.rs
@@ -36,7 +36,7 @@ impl<'a> Parser<'a> {
         }
 
         match kind {
-            NonterminalKind::Expr2021 => {
+            NonterminalKind::Expr2021 { inferred: _ } => {
                 token.can_begin_expr()
                 // This exception is here for backwards compatibility.
                 && !token.is_keyword(kw::Let)
@@ -47,7 +47,6 @@ impl<'a> Parser<'a> {
                 token.can_begin_expr()
                 // This exception is here for backwards compatibility.
                 && !token.is_keyword(kw::Let)
-                && (!token.is_keyword(kw::Const) || token.span.edition().at_least_rust_2024())
             }
             NonterminalKind::Ty => token.can_begin_type(),
             NonterminalKind::Ident => get_macro_ident(token).is_some(),
@@ -149,7 +148,7 @@ impl<'a> Parser<'a> {
                 })?)
             }
 
-            NonterminalKind::Expr | NonterminalKind::Expr2021 => {
+            NonterminalKind::Expr | NonterminalKind::Expr2021 { inferred: _ } => {
                 NtExpr(self.parse_expr_force_collect()?)
             }
             NonterminalKind::Literal => {
diff --git a/tests/ui/macros/expr_2021_implicit_in_2024.rs b/tests/ui/macros/expr_2021_implicit_in_2024.rs
index d612c03650d..b3f7a31a802 100644
--- a/tests/ui/macros/expr_2021_implicit_in_2024.rs
+++ b/tests/ui/macros/expr_2021_implicit_in_2024.rs
@@ -1,6 +1,8 @@
 //@ compile-flags: --edition=2024 -Zunstable-options
 //@ aux-build:expr_2021_implicit.rs
 
+//@ check-pass
+
 extern crate expr_2021_implicit;
 
 // Makes sure that a `:expr` fragment matcher defined in a edition 2021 crate
diff --git a/tests/ui/macros/expr_2021_implicit_in_2024.stderr b/tests/ui/macros/expr_2021_implicit_in_2024.stderr
deleted file mode 100644
index 962d572ca07..00000000000
--- a/tests/ui/macros/expr_2021_implicit_in_2024.stderr
+++ /dev/null
@@ -1,10 +0,0 @@
-error: did not expect an expression to be parsed
-  --> $DIR/expr_2021_implicit_in_2024.rs:8:1
-   |
-LL | expr_2021_implicit::m!(const {});
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = note: this error originates in the macro `expr_2021_implicit::m` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: aborting due to 1 previous error
-
diff --git a/tests/ui/macros/expr_2021_old_edition.rs b/tests/ui/macros/expr_2021_old_edition.rs
deleted file mode 100644
index a7711266106..00000000000
--- a/tests/ui/macros/expr_2021_old_edition.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-//@  compile-flags: --edition=2018
-
-// This test ensures that expr_2021 is not allowed on pre-2021 editions
-
-macro_rules! m {
-    ($e:expr_2021) => { //~ ERROR: invalid fragment specifier `expr_2021`
-        $e
-    };
-}
-
-fn main() {
-    m!(()); //~ ERROR: no rules expected the token `(`
-}
diff --git a/tests/ui/macros/expr_2021_old_edition.stderr b/tests/ui/macros/expr_2021_old_edition.stderr
deleted file mode 100644
index bffa8a1ca17..00000000000
--- a/tests/ui/macros/expr_2021_old_edition.stderr
+++ /dev/null
@@ -1,26 +0,0 @@
-error: invalid fragment specifier `expr_2021`
-  --> $DIR/expr_2021_old_edition.rs:6:6
-   |
-LL |     ($e:expr_2021) => {
-   |      ^^^^^^^^^^^^
-   |
-   = help: fragment specifier `expr_2021` requires Rust 2021 or later
-           valid fragment specifiers are `ident`, `block`, `stmt`, `expr`, `pat`, `ty`, `lifetime`, `literal`, `path`, `meta`, `tt`, `item` and `vis`
-
-error: no rules expected the token `(`
-  --> $DIR/expr_2021_old_edition.rs:12:8
-   |
-LL | macro_rules! m {
-   | -------------- when calling this macro
-...
-LL |     m!(());
-   |        ^ no rules expected this token in macro call
-   |
-note: while trying to match meta-variable `$e:ident`
-  --> $DIR/expr_2021_old_edition.rs:6:6
-   |
-LL |     ($e:expr_2021) => {
-   |      ^^^^^^^^^^^^
-
-error: aborting due to 2 previous errors
-