File: allowed-operations.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, forky, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (115 lines) | stat: -rw-r--r-- 3,534 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//@ 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");
}