Skip to content

Commit

Permalink
Add tests for nested macro_rules edition behavior
Browse files Browse the repository at this point in the history
This adds tests to check the behavior of how nested macro_rules
definitions work across edition boundaries. This covers a change in
behavior due to rust-lang#133274.

See rust-lang#135669
  • Loading branch information
ehuss committed Feb 3, 2025
1 parent f2c4ccd commit 3048aa2
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 0 deletions.
23 changes: 23 additions & 0 deletions tests/ui/editions/auxiliary/nested_macro_rules_dep_2021.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//@ edition: 2021

#[macro_export]
macro_rules! make_macro_with_input {
($i:ident) => {
macro_rules! macro_inner_input {
() => {
pub fn $i() {}
};
}
};
}

#[macro_export]
macro_rules! make_macro {
() => {
macro_rules! macro_inner {
() => {
pub fn gen() {}
};
}
};
}
23 changes: 23 additions & 0 deletions tests/ui/editions/auxiliary/nested_macro_rules_dep_2024.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//@ edition: 2024

#[macro_export]
macro_rules! make_macro_with_input {
($i:ident) => {
macro_rules! macro_inner_input {
() => {
pub fn $i() {}
};
}
};
}

#[macro_export]
macro_rules! make_macro {
() => {
macro_rules! macro_inner {
() => {
pub fn gen() {}
};
}
};
}
27 changes: 27 additions & 0 deletions tests/ui/editions/nested-macro-rules-edition.e2021.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
error: expected identifier, found reserved keyword `gen`
--> $DIR/nested-macro-rules-edition.rs:30:5
|
LL | macro_inner_input!{}
| ^^^^^^^^^^^^^^^^^^^^ expected identifier, found reserved keyword
|
= note: this error originates in the macro `macro_inner_input` (in Nightly builds, run with -Z macro-backtrace for more info)
help: escape `gen` to use it as an identifier
|
LL | nested_macro_rules_dep_2024::make_macro_with_input!{r#gen}
| ++

error: expected identifier, found reserved keyword `gen`
--> $DIR/nested-macro-rules-edition.rs:35:5
|
LL | macro_inner!{}
| ^^^^^^^^^^^^^^ expected identifier, found reserved keyword
|
= note: this error originates in the macro `macro_inner` (in Nightly builds, run with -Z macro-backtrace for more info)
help: escape `gen` to use it as an identifier
--> $DIR/auxiliary/nested_macro_rules_dep_2024.rs:19:24
|
LL | pub fn r#gen() {}
| ++

error: aborting due to 2 previous errors

39 changes: 39 additions & 0 deletions tests/ui/editions/nested-macro-rules-edition.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// This checks the behavior of how nested macro_rules definitions are handled
// with regards to edition spans. Prior to https://github.com/rust-lang/rust/pull/133274,
// the compiler would compile the inner macro with the edition of the local crate.
// Afterwards, it uses the edition where the macro was *defined*.
//
// Unfortunately macro_rules compiler discards the edition of any *input* that
// was used to generate the macro. This is possibly not the behavior that we
// want. If we want to keep with the philosophy that code should follow the
// edition rules of the crate where it is written, then presumably we would
// want the input tokens to retain the edition of where they were written.
//
// See https://github.com/rust-lang/rust/issues/135669 for more.
//
// This has two revisions, one where local=2021 and the dep=2024. The other
// revision is vice-versa.

//@ revisions: e2021 e2024
//@[e2021] edition:2021
//@[e2024] edition:2021
//@[e2021] aux-crate: nested_macro_rules_dep_2024=nested_macro_rules_dep_2024.rs
//@[e2024] aux-crate: nested_macro_rules_dep_2024=nested_macro_rules_dep_2021.rs
//@[e2024] check-pass

mod with_input {
// If we change the macro_rules input behavior, then this should pass when
// local edition is 2021 because `gen` is written in a context with 2021
// behavior. For local edition 2024, the reverse would be true and this
// should fail.
nested_macro_rules_dep_2024::make_macro_with_input!{gen}
macro_inner_input!{}
//[e2021]~^ ERROR found reserved keyword
}
mod no_input {
nested_macro_rules_dep_2024::make_macro!{}
macro_inner!{}
//[e2021]~^ ERROR found reserved keyword
}

fn main() {}

0 comments on commit 3048aa2

Please sign in to comment.