Skip to content

Commit

Permalink
rustc_parser: consider the in 2024 an expression
Browse files Browse the repository at this point in the history
This commit is adding the possibility to parse the `_` as
an expression inside the esition 2024.

Link: https://rust-lang.zulipchat.com/#narrow/stream/404510-wg-macros/topic/supporting.20.60_.60.20expressions
Signed-off-by: Vincenzo Palazzo <[email protected]>
  • Loading branch information
vincenzopalazzo committed Jun 19, 2024
1 parent 3186d17 commit 3d479a0
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 0 deletions.
3 changes: 3 additions & 0 deletions compiler/rustc_ast/src/token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,9 @@ pub fn ident_can_begin_expr(name: Symbol, span: Span, is_raw: IdentIsRaw) -> boo
kw::Static,
]
.contains(&name)
// Please note the order of the check here, the edition is not check on every
// token by only on the possible one.
|| (kw::Underscore == name && span.edition().at_least_rust_2024())
}

fn ident_can_begin_type(name: Symbol, span: Span, is_raw: IdentIsRaw) -> bool {
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_parse/src/parser/nonterminal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ impl<'a> Parser<'a> {
&& !token.is_keyword(kw::Let)
// This exception is here for backwards compatibility.
&& !token.is_keyword(kw::Const)
// FIXME(vincenzopalazzo): query less time the edition
&& (token.span.edition().at_least_rust_2024() && !token.is_keyword(kw::Underscore) )
}
NonterminalKind::Expr => {
token.can_begin_expr()
Expand Down
32 changes: 32 additions & 0 deletions tests/ui/macros/expr_2024_underscore_expr.edi2021.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
error: no rules expected the token `_`
--> $DIR/expr_2024_underscore_expr.rs:23:12
|
LL | macro_rules! m2021 {
| ------------------ when calling this macro
...
LL | m2021!(_);
| ^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$e:expr_2021`
--> $DIR/expr_2024_underscore_expr.rs:11:6
|
LL | ($e:expr_2021) => {
| ^^^^^^^^^^^^

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

error: aborting due to 2 previous errors

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

error: aborting due to 1 previous error

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

// This test ensures that the `_` tok is considered an
// expression on edition 2024.
#![feature(expr_fragment_specifier_2024)]
#![allow(incomplete_features)]

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

macro_rules! m2024 {
($e:expr) => {
$e = 1;
};
}

fn main() {
m2021!(_); //~ ERROR: no rules expected the token `_`
m2024!(_); //[edi2021]~ ERROR: no rules expected the token `_`
}

0 comments on commit 3d479a0

Please sign in to comment.