mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
mbe: Add test for macro_rules attributes
Test macros via path and local macros.
This commit is contained in:
@@ -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")
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user