116 lines
3.5 KiB
Rust
116 lines
3.5 KiB
Rust
//@ run-pass
|
|
|
|
#![allow(dead_code, non_camel_case_types, non_upper_case_globals, unused_variables)]
|
|
#![feature(macro_metavar_expr_concat)]
|
|
|
|
macro_rules! create_things {
|
|
($lhs:ident) => {
|
|
struct ${concat($lhs, _separated_idents_in_a_struct)} {
|
|
foo: i32,
|
|
${concat($lhs, _separated_idents_in_a_field)}: i32,
|
|
}
|
|
|
|
mod ${concat($lhs, _separated_idents_in_a_module)} {
|
|
pub const FOO: () = ();
|
|
}
|
|
|
|
fn ${concat($lhs, _separated_idents_in_a_fn)}() {}
|
|
};
|
|
}
|
|
|
|
macro_rules! many_idents {
|
|
($a:ident, $c:ident) => {
|
|
const ${concat($a, B, $c, D)}: i32 = 1;
|
|
};
|
|
}
|
|
|
|
macro_rules! valid_tts {
|
|
($_0:tt, $_1:tt) => {
|
|
const ${concat($_0, $_1)}: i32 = 1;
|
|
}
|
|
}
|
|
|
|
macro_rules! without_dollar_sign_is_an_ident {
|
|
($ident:ident) => {
|
|
const ${concat(VAR, ident)}: i32 = 1;
|
|
const ${concat(VAR, $ident)}: i32 = 2;
|
|
};
|
|
}
|
|
|
|
macro_rules! combinations {
|
|
($ident:ident, $literal:literal, $tt_ident:tt, $tt_literal:tt) => {{
|
|
// tt ident
|
|
let ${concat($tt_ident, b)} = ();
|
|
let ${concat($tt_ident, _b)} = ();
|
|
let ${concat($tt_ident, "b")} = ();
|
|
let ${concat($tt_ident, $tt_ident)} = ();
|
|
let ${concat($tt_ident, $tt_literal)} = ();
|
|
let ${concat($tt_ident, $ident)} = ();
|
|
let ${concat($tt_ident, $literal)} = ();
|
|
// tt literal
|
|
let ${concat($tt_literal, b)} = ();
|
|
let ${concat($tt_literal, _b)} = ();
|
|
let ${concat($tt_literal, "b")} = ();
|
|
let ${concat($tt_literal, $tt_ident)} = ();
|
|
let ${concat($tt_literal, $tt_literal)} = ();
|
|
let ${concat($tt_literal, $ident)} = ();
|
|
let ${concat($tt_literal, $literal)} = ();
|
|
|
|
// ident (adhoc)
|
|
let ${concat(_b, b)} = ();
|
|
let ${concat(_b, _b)} = ();
|
|
let ${concat(_b, "b")} = ();
|
|
let ${concat(_b, $tt_ident)} = ();
|
|
let ${concat(_b, $tt_literal)} = ();
|
|
let ${concat(_b, $ident)} = ();
|
|
let ${concat(_b, $literal)} = ();
|
|
// ident (param)
|
|
let ${concat($ident, b)} = ();
|
|
let ${concat($ident, _b)} = ();
|
|
let ${concat($ident, "b")} = ();
|
|
let ${concat($ident, $tt_ident)} = ();
|
|
let ${concat($ident, $tt_literal)} = ();
|
|
let ${concat($ident, $ident)} = ();
|
|
let ${concat($ident, $literal)} = ();
|
|
|
|
// literal (adhoc)
|
|
let ${concat("a", b)} = ();
|
|
let ${concat("a", _b)} = ();
|
|
let ${concat("a", "b")} = ();
|
|
let ${concat("a", $tt_ident)} = ();
|
|
let ${concat("a", $tt_literal)} = ();
|
|
let ${concat("a", $ident)} = ();
|
|
let ${concat("a", $literal)} = ();
|
|
// literal (param)
|
|
let ${concat($literal, b)} = ();
|
|
let ${concat($literal, _b)} = ();
|
|
let ${concat($literal, "b")} = ();
|
|
let ${concat($literal, $tt_ident)} = ();
|
|
let ${concat($literal, $tt_literal)} = ();
|
|
let ${concat($literal, $ident)} = ();
|
|
let ${concat($literal, $literal)} = ();
|
|
}};
|
|
}
|
|
|
|
fn main() {
|
|
create_things!(behold);
|
|
behold_separated_idents_in_a_fn();
|
|
let _ = behold_separated_idents_in_a_module::FOO;
|
|
let _ = behold_separated_idents_in_a_struct {
|
|
foo: 1,
|
|
behold_separated_idents_in_a_field: 2,
|
|
};
|
|
|
|
many_idents!(A, C);
|
|
assert_eq!(ABCD, 1);
|
|
|
|
valid_tts!(X, YZ);
|
|
assert_eq!(XYZ, 1);
|
|
|
|
without_dollar_sign_is_an_ident!(_123);
|
|
assert_eq!(VARident, 1);
|
|
assert_eq!(VAR_123, 2);
|
|
|
|
combinations!(_hello, "a", b, "b");
|
|
}
|