1
Fork 0

Add tests for the edition of macro_rules from a proc-macro

This commit is contained in:
Eric Huss 2024-11-20 16:36:18 -08:00
parent 78993684f2
commit a1838660c3
7 changed files with 138 additions and 0 deletions

View file

@ -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()
}

View file

@ -0,0 +1,11 @@
error[E0080]: evaluation of constant value failed
--> $DIR/macro_rules_edition_from_pm.rs:24:5
|
LL | assert!(edition_inner!(const {}) == 2024);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'assertion failed: edition_inner!(const {}) == 2024', $DIR/macro_rules_edition_from_pm.rs:24:5
|
= note: this error originates in the macro `assert` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0080`.

View file

@ -0,0 +1,28 @@
// 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
//@[edition2024] 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 {}) == 2024);
//[edition2021]~^ ERROR evaluation of constant value failed
};
fn main() {}

View file

@ -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()
}

View file

@ -0,0 +1,17 @@
error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes-from-pm.rs:13:1
|
LL | unsafe_attributes_pm::macro_rules_missing_unsafe!();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ usage of unsafe attribute
...
LL | make_fn!();
| ---------- in this macro invocation
|
= note: this error originates in the macro `make_fn` (in Nightly builds, run with -Z macro-backtrace for more info)
help: wrap the attribute in `unsafe(...)`
|
LL | ununsafe(safe_attributes_pm::macro_rules_missing_unsafe!());
| +++++++ +
error: aborting due to 1 previous error

View file

@ -0,0 +1,18 @@
// Test for unsafe attributes generated by a proc-macro.
// See https://github.com/rust-lang/rust/issues/132906
//@ revisions: edition2021 edition2024
//@[edition2021] 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!();
//[edition2024]~^ ERROR unsafe attribute used without unsafe
make_fn!();
fn main() {}