273 lines
5.0 KiB
Rust
273 lines
5.0 KiB
Rust
//@ run-pass
|
|
#![allow(unused_macro_rules)]
|
|
|
|
//{{{ issue 40569 ==============================================================
|
|
|
|
macro_rules! my_struct {
|
|
($(#[$meta:meta])* $ident:ident) => {
|
|
$(#[$meta])* struct $ident;
|
|
}
|
|
}
|
|
|
|
my_struct!(#[derive(Debug, PartialEq)] Foo40569);
|
|
|
|
fn test_40569() {
|
|
assert_eq!(Foo40569, Foo40569);
|
|
}
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 26444 ==============================================================
|
|
|
|
macro_rules! foo_26444 {
|
|
($($beginning:ident),*; $middle:ident; $($end:ident),*) => {
|
|
stringify!($($beginning,)* $middle $(,$end)*)
|
|
}
|
|
}
|
|
|
|
fn test_26444() {
|
|
assert_eq!("a, b, c, d, e", foo_26444!(a, b; c; d, e));
|
|
assert_eq!("f", foo_26444!(; f ;));
|
|
}
|
|
|
|
macro_rules! pat_26444 {
|
|
($fname:ident $($arg:pat)* =) => {}
|
|
}
|
|
|
|
pat_26444!(foo 1 2 5...7 =);
|
|
pat_26444!(bar Some(ref x) Ok(ref mut y) &(w, z) =);
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 40984 ==============================================================
|
|
|
|
macro_rules! thread_local_40984 {
|
|
() => {};
|
|
($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => {
|
|
thread_local_40984!($($rest)*);
|
|
};
|
|
($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr) => {};
|
|
}
|
|
|
|
thread_local_40984! {
|
|
// no docs
|
|
#[allow(unused)]
|
|
static FOO: i32 = 42;
|
|
/// docs
|
|
pub static BAR: String = String::from("bar");
|
|
|
|
// look at these restrictions!!
|
|
pub(crate) static BAZ: usize = 0;
|
|
pub(in foo) static QUUX: usize = 0;
|
|
}
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 35650 ==============================================================
|
|
|
|
macro_rules! size {
|
|
($ty:ty) => {
|
|
std::mem::size_of::<$ty>()
|
|
};
|
|
($size:tt) => {
|
|
$size
|
|
};
|
|
}
|
|
|
|
fn test_35650() {
|
|
assert_eq!(size!(u64), 8);
|
|
assert_eq!(size!(5), 5);
|
|
}
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 27832 ==============================================================
|
|
|
|
macro_rules! m {
|
|
( $i:ident ) => ();
|
|
( $t:tt $j:tt ) => ();
|
|
}
|
|
|
|
m!(c);
|
|
m!(t 9);
|
|
m!(0 9);
|
|
m!(struct);
|
|
m!(struct Foo);
|
|
|
|
macro_rules! m2 {
|
|
( $b:expr ) => ();
|
|
( $t:tt $u:tt ) => ();
|
|
}
|
|
|
|
m2!(3);
|
|
m2!(1 2);
|
|
m2!(_ 1);
|
|
m2!(enum Foo);
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 39964 ==============================================================
|
|
|
|
macro_rules! foo_39964 {
|
|
($a:ident) => {};
|
|
(_) => {};
|
|
}
|
|
|
|
foo_39964!(_);
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 34030 ==============================================================
|
|
|
|
macro_rules! foo_34030 {
|
|
($($t:ident),* /) => {};
|
|
}
|
|
|
|
foo_34030!(a, b/);
|
|
foo_34030!(a/);
|
|
foo_34030!(/);
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 24189 ==============================================================
|
|
|
|
macro_rules! foo_24189 {
|
|
(
|
|
pub enum $name:ident {
|
|
$( #[$attr:meta] )* $var:ident
|
|
}
|
|
) => {
|
|
pub enum $name {
|
|
$( #[$attr] )* $var
|
|
}
|
|
};
|
|
}
|
|
|
|
foo_24189! {
|
|
pub enum Foo24189 {
|
|
#[doc = "Bar"] Baz
|
|
}
|
|
}
|
|
|
|
macro_rules! serializable {
|
|
(
|
|
$(#[$struct_meta:meta])*
|
|
pub struct $name:ident {
|
|
$(
|
|
$(#[$field_meta:meta])*
|
|
$field:ident: $type_:ty
|
|
),* ,
|
|
}
|
|
) => {
|
|
$(#[$struct_meta])*
|
|
pub struct $name {
|
|
$(
|
|
$(#[$field_meta])*
|
|
$field: $type_
|
|
),* ,
|
|
}
|
|
}
|
|
}
|
|
|
|
serializable! {
|
|
#[allow(dead_code)]
|
|
/// This is a test
|
|
pub struct Tester {
|
|
#[allow(dead_code)]
|
|
name: String,
|
|
}
|
|
}
|
|
|
|
macro_rules! foo_24189_c {
|
|
( $( > )* $x:ident ) => { };
|
|
}
|
|
foo_24189_c!( > a );
|
|
|
|
fn test_24189() {
|
|
let _ = Foo24189::Baz;
|
|
let _ = Tester { name: "".to_owned() };
|
|
}
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 50903 ==============================================================
|
|
|
|
macro_rules! foo_50903 {
|
|
($($lif:lifetime ,)* #) => {};
|
|
}
|
|
|
|
foo_50903!('a, 'b, #);
|
|
foo_50903!('a, #);
|
|
foo_50903!(#);
|
|
|
|
//}}}
|
|
|
|
//{{{ issue 51477 ==============================================================
|
|
|
|
macro_rules! foo_51477 {
|
|
($lifetime:lifetime) => {
|
|
"last token is lifetime"
|
|
};
|
|
($other:tt) => {
|
|
"last token is other"
|
|
};
|
|
($first:tt $($rest:tt)*) => {
|
|
foo_51477!($($rest)*)
|
|
};
|
|
}
|
|
|
|
fn test_51477() {
|
|
assert_eq!("last token is lifetime", foo_51477!('a));
|
|
assert_eq!("last token is other", foo_51477!(@));
|
|
assert_eq!("last token is lifetime", foo_51477!(@ {} 'a));
|
|
}
|
|
|
|
//}}}
|
|
|
|
//{{{ some more tests ==========================================================
|
|
|
|
macro_rules! test_block {
|
|
(< $($b:block)* >) => {}
|
|
}
|
|
|
|
test_block!(<>);
|
|
test_block!(<{}>);
|
|
test_block!(<{1}{2}>);
|
|
|
|
macro_rules! test_ty {
|
|
($($t:ty),* $(,)*) => {}
|
|
}
|
|
|
|
test_ty!();
|
|
test_ty!(,);
|
|
test_ty!(u8);
|
|
test_ty!(u8,);
|
|
|
|
macro_rules! test_path {
|
|
($($t:path),* $(,)*) => {}
|
|
}
|
|
|
|
test_path!();
|
|
test_path!(,);
|
|
test_path!(::std);
|
|
test_path!(std::ops,);
|
|
test_path!(any, super, super::super::self::path, X<Y>::Z<'a, T=U>);
|
|
|
|
macro_rules! test_lifetime {
|
|
(1. $($l:lifetime)* $($b:block)*) => {};
|
|
(2. $($b:block)* $($l:lifetime)*) => {};
|
|
}
|
|
|
|
test_lifetime!(1. 'a 'b {} {});
|
|
test_lifetime!(2. {} {} 'a 'b);
|
|
|
|
//}}}
|
|
|
|
fn main() {
|
|
test_26444();
|
|
test_40569();
|
|
test_35650();
|
|
test_24189();
|
|
test_51477();
|
|
}
|