mbe: Add test for macro_rules attributes

Test macros via path and local macros.
This commit is contained in:
Josh Triplett
2025-07-28 02:00:13 -07:00
parent 549c2fee9f
commit 4f999f72de
3 changed files with 126 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
//@ run-pass
//@ check-run-results
#![feature(macro_attr)]
#![warn(unused)]
#[macro_export]
macro_rules! exported_attr {
attr($($args:tt)*) { $($body:tt)* } => {
println!(
"exported_attr: args={:?}, body={:?}",
stringify!($($args)*),
stringify!($($body)*),
);
};
{ $($args:tt)* } => {
println!("exported_attr!({:?})", stringify!($($args)*));
};
attr() {} => {
unused_rule();
};
attr() {} => {
compile_error!();
};
{} => {
unused_rule();
};
{} => {
compile_error!();
};
}
macro_rules! local_attr {
attr($($args:tt)*) { $($body:tt)* } => {
println!(
"local_attr: args={:?}, body={:?}",
stringify!($($args)*),
stringify!($($body)*),
);
};
{ $($args:tt)* } => {
println!("local_attr!({:?})", stringify!($($args)*));
};
attr() {} => { //~ WARN: never used
unused_rule();
};
attr() {} => {
compile_error!();
};
{} => { //~ WARN: never used
unused_rule();
};
{} => {
compile_error!();
};
}
fn main() {
#[crate::exported_attr]
struct S;
#[::exported_attr(arguments, key = "value")]
fn func(_arg: u32) {}
#[self::exported_attr(1)]
#[self::exported_attr(2)]
struct Twice;
crate::exported_attr!();
crate::exported_attr!(invoked, arguments);
#[exported_attr]
struct S;
#[exported_attr(arguments, key = "value")]
fn func(_arg: u32) {}
#[exported_attr(1)]
#[exported_attr(2)]
struct Twice;
exported_attr!();
exported_attr!(invoked, arguments);
#[local_attr]
struct S;
#[local_attr(arguments, key = "value")]
fn func(_arg: u32) {}
#[local_attr(1)]
#[local_attr(2)]
struct Twice;
local_attr!();
local_attr!(invoked, arguments);
}
@@ -0,0 +1,15 @@
exported_attr: args="", body="struct S;"
exported_attr: args="arguments, key = \"value\"", body="fn func(_arg: u32) {}"
exported_attr: args="1", body="#[self::exported_attr(2)] struct Twice;"
exported_attr!("")
exported_attr!("invoked, arguments")
exported_attr: args="", body="struct S;"
exported_attr: args="arguments, key = \"value\"", body="fn func(_arg: u32) {}"
exported_attr: args="1", body="#[exported_attr(2)] struct Twice;"
exported_attr!("")
exported_attr!("invoked, arguments")
local_attr: args="", body="struct S;"
local_attr: args="arguments, key = \"value\"", body="fn func(_arg: u32) {}"
local_attr: args="1", body="#[local_attr(2)] struct Twice;"
local_attr!("")
local_attr!("invoked, arguments")
+21
View File
@@ -0,0 +1,21 @@
warning: rule #3 of macro `local_attr` is never used
--> $DIR/macro-rules-attr.rs:43:9
|
LL | attr() {} => {
| ^^ ^^
|
note: the lint level is defined here
--> $DIR/macro-rules-attr.rs:4:9
|
LL | #![warn(unused)]
| ^^^^^^
= note: `#[warn(unused_macro_rules)]` implied by `#[warn(unused)]`
warning: rule #5 of macro `local_attr` is never used
--> $DIR/macro-rules-attr.rs:49:5
|
LL | {} => {
| ^^
warning: 2 warnings emitted