forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#133274 - ehuss:macro_rules-edition-from-pm, r…
…=<try> Use edition of `macro_rules` when compiling the macro This changes the edition assigned to a macro_rules macro when it is compiled to use the edition of where the macro came from instead of the local crate's edition. This fixes a problem when a macro_rules macro is created by a proc-macro. Previously that macro would be tagged with the local edition, which would cause problems with using the correct edition behavior inside the macro. For example, the check for unsafe attributes would cause errors in 2024 when using proc-macros from older editions. This is partially related to rust-lang#132906. Unfortunately this is only a half fix for that issue. It fixes the error that happens in 2024, but does not fix the lint firing in 2021. I'm still trying to think of some way to fix that, but I'm running low on ideas.
- Loading branch information
Showing
5 changed files
with
109 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
//@ force-host | ||
//@ no-prefer-dynamic | ||
|
||
#![crate_type = "proc-macro"] | ||
|
||
extern crate proc_macro; | ||
|
||
use proc_macro::TokenStream; | ||
|
||
#[proc_macro] | ||
pub fn make_edition_macro(_input: TokenStream) -> TokenStream { | ||
"macro_rules! edition { | ||
($_:expr) => { | ||
2024 | ||
}; | ||
(const {}) => { | ||
2021 | ||
}; | ||
} | ||
" | ||
.parse() | ||
.unwrap() | ||
} | ||
|
||
#[proc_macro] | ||
pub fn make_nested_edition_macro(_input: TokenStream) -> TokenStream { | ||
"macro_rules! make_inner { | ||
() => { | ||
macro_rules! edition_inner { | ||
($_:expr) => { | ||
2024 | ||
}; | ||
(const {}) => { | ||
2021 | ||
}; | ||
} | ||
}; | ||
} | ||
" | ||
.parse() | ||
.unwrap() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
// Tests how edition hygiene works for macro_rules macros generated from a | ||
// proc-macro. | ||
// See https://github.com/rust-lang/rust/issues/132906 | ||
|
||
//@ aux-crate: macro_rules_edition_pm=macro_rules_edition_pm.rs | ||
//@ revisions: edition2021 edition2024 | ||
//@[edition2021] edition:2021 | ||
//@[edition2024] edition:2024 | ||
//@[edition2024] compile-flags: -Zunstable-options | ||
//@ check-pass | ||
|
||
// This checks how the expr fragment specifier works. | ||
macro_rules_edition_pm::make_edition_macro!{} | ||
|
||
const _: () = { | ||
assert!(edition!(const {}) == 2021); | ||
}; | ||
|
||
// This checks how the expr fragment specifier from a nested macro. | ||
macro_rules_edition_pm::make_nested_edition_macro!{} | ||
make_inner!{} | ||
|
||
const _: () = { | ||
assert!(edition_inner!(const {}) == 2021); | ||
}; | ||
|
||
fn main() {} |
22 changes: 22 additions & 0 deletions
22
tests/ui/rust-2024/unsafe-attributes/auxiliary/unsafe-attributes-pm.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
//@ force-host | ||
//@ no-prefer-dynamic | ||
|
||
#![crate_type = "proc-macro"] | ||
|
||
extern crate proc_macro; | ||
|
||
use proc_macro::TokenStream; | ||
|
||
#[proc_macro] | ||
pub fn missing_unsafe(_input: TokenStream) -> TokenStream { | ||
"#[no_mangle] pub fn abc() {}".parse().unwrap() | ||
} | ||
|
||
#[proc_macro] | ||
pub fn macro_rules_missing_unsafe(_input: TokenStream) -> TokenStream { | ||
"macro_rules! make_fn { | ||
() => { #[no_mangle] pub fn foo() { } }; | ||
}" | ||
.parse() | ||
.unwrap() | ||
} |
17 changes: 17 additions & 0 deletions
17
tests/ui/rust-2024/unsafe-attributes/unsafe-attributes-from-pm.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
// Test for unsafe attributes generated by a proc-macro. | ||
// See https://github.com/rust-lang/rust/issues/132906 | ||
|
||
//@ revisions: edition2021 edition2024 | ||
//@ check-pass | ||
//@[edition2021] edition:2021 | ||
//@[edition2024] edition:2024 | ||
//@[edition2024] compile-flags: -Zunstable-options | ||
//@ aux-crate: unsafe_attributes_pm=unsafe-attributes-pm.rs | ||
|
||
unsafe_attributes_pm::missing_unsafe!(); | ||
|
||
unsafe_attributes_pm::macro_rules_missing_unsafe!(); | ||
|
||
make_fn!(); | ||
|
||
fn main() {} |