Skip to content

Commit

Permalink
Macros: match const { ... } with expr nonterminal in edition 2024
Browse files Browse the repository at this point in the history
Co-authored-by: Eric Holk <[email protected]>
Signed-off-by: Vincenzo Palazzo <[email protected]>
  • Loading branch information
vincenzopalazzo and eholk committed Apr 16, 2024
1 parent e0b7d92 commit 09b6eca
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 1 deletion.
9 changes: 8 additions & 1 deletion compiler/rustc_parse/src/parser/nonterminal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use rustc_ast::token::{self, Delimiter, Nonterminal, Nonterminal::*, Nonterminal
use rustc_ast::HasTokens;
use rustc_ast_pretty::pprust;
use rustc_errors::PResult;
use rustc_span::edition::Edition;
use rustc_span::symbol::{kw, Ident};

use crate::errors::UnexpectedNonterminal;
Expand Down Expand Up @@ -37,13 +38,19 @@ impl<'a> Parser<'a> {
}

match kind {
NonterminalKind::Expr | NonterminalKind::Expr2021 => {
NonterminalKind::Expr2021 => {
token.can_begin_expr()
// This exception is here for backwards compatibility.
&& !token.is_keyword(kw::Let)
// This exception is here for backwards compatibility.
&& !token.is_keyword(kw::Const)
}
NonterminalKind::Expr => {
token.can_begin_expr()
// This exception is here for backwards compatibility.
&& !token.is_keyword(kw::Let)
&& (token.span.edition() >= Edition::Edition2024 || !token.is_keyword(kw::Const))
}
NonterminalKind::Ty => token.can_begin_type(),
NonterminalKind::Ident => get_macro_ident(token).is_some(),
NonterminalKind::Literal => token.can_begin_literal_maybe_minus(),
Expand Down
32 changes: 32 additions & 0 deletions tests/ui/macros/expr_2021_inline_const.edi2021.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
error: no rules expected the token `const`
--> $DIR/expr_2021_inline_const.rs:22:12
|
LL | macro_rules! m2021 {
| ------------------ when calling this macro
...
LL | m2021!(const { 1 });
| ^^^^^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$e:expr_2021`
--> $DIR/expr_2021_inline_const.rs:11:6
|
LL | ($e:expr_2021) => {
| ^^^^^^^^^^^^

error: no rules expected the token `const`
--> $DIR/expr_2021_inline_const.rs:23:12
|
LL | macro_rules! m2024 {
| ------------------ when calling this macro
...
LL | m2024!(const { 1 });
| ^^^^^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$e:expr`
--> $DIR/expr_2021_inline_const.rs:17:6
|
LL | ($e:expr) => {
| ^^^^^^^

error: aborting due to 2 previous errors

17 changes: 17 additions & 0 deletions tests/ui/macros/expr_2021_inline_const.edi2024.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error: no rules expected the token `const`
--> $DIR/expr_2021_inline_const.rs:22:12
|
LL | macro_rules! m2021 {
| ------------------ when calling this macro
...
LL | m2021!(const { 1 });
| ^^^^^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$e:expr_2021`
--> $DIR/expr_2021_inline_const.rs:11:6
|
LL | ($e:expr_2021) => {
| ^^^^^^^^^^^^

error: aborting due to 1 previous error

24 changes: 24 additions & 0 deletions tests/ui/macros/expr_2021_inline_const.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//@ revisions: edi2021 edi2024
//@[edi2024]compile-flags: --edition=2024 -Z unstable-options
//@[edi2021]compile-flags: --edition=2021

// This test ensures that the inline const match only on edition 2024
#![feature(expr_fragment_specifier_2024)]
#![feature(inline_const)]
#![allow(incomplete_features)]

macro_rules! m2021 {
($e:expr_2021) => {
$e
};
}

macro_rules! m2024 {
($e:expr) => {
$e
};
}
fn main() {
m2021!(const { 1 }); //~ ERROR: no rules expected the token `const`
m2024!(const { 1 }); //[edi2021]~ ERROR: no rules expected the token `const`
}

0 comments on commit 09b6eca

Please sign in to comment.