| //@ 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"); |
| } |