about summary refs log tree commit diff
path: root/tests/ui/proc-macro/mixed-site-span.rs
blob: 442b440c1211a6ee28bdd5c82f74e333dc0cfa1a (plain)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// Proc macros using `mixed_site` spans exhibit usual properties of `macro_rules` hygiene.

//@ aux-build: token-site-span.rs
//@ proc-macro: mixed-site-span.rs

extern crate mixed_site_span;
extern crate token_site_span;

use mixed_site_span::{proc_macro_rules, with_crate};
use token_site_span::{
    invoke_with_crate, invoke_with_ident,
    use_input_crate, use_mixed_crate, use_call_crate,
    use_input_krate, use_mixed_krate, use_call_krate,
};

pub struct ItemUse;

fn main() {
    'label_use: loop {
        let local_use = 1;
        proc_macro_rules!();
        //~^ ERROR cannot find type `ItemUse` in crate `$crate`
        //~| ERROR use of undeclared label `'label_use`
        //~| ERROR cannot find value `local_use` in this scope
        ItemDef; // OK
        local_def; //~ ERROR cannot find value `local_def` in this scope
    }
}

// Successful resolutions of `mixed_site_span::proc_macro_item`
const _: () = {
    invoke_with_crate!{mixed proc_macro_item}
    invoke_with_ident!{mixed proc_macro_item}
    invoke_with_ident!{krate mixed proc_macro_item}
    with_crate!{krate mixed proc_macro_item}

    macro_rules! test {() => {
        invoke_with_ident!{$crate mixed proc_macro_item}
        with_crate!{$crate mixed proc_macro_item}
    }}
    test!();
};

// Failed resolutions of `proc_macro_item`
const _: () = {
    // token_site_span::proc_macro_item
    invoke_with_crate!{input proc_macro_item}            //~ ERROR unresolved import `$crate`
    invoke_with_ident!{input proc_macro_item}            //~ ERROR unresolved import `$crate`
    invoke_with_crate!{call proc_macro_item}             //~ ERROR unresolved import `$crate`
    invoke_with_ident!{call proc_macro_item}             //~ ERROR unresolved import `$crate`
    invoke_with_ident!{hello call proc_macro_item}       //~ ERROR unresolved import `$crate`

    // crate::proc_macro_item
    invoke_with_ident!{krate input proc_macro_item}      //~ ERROR unresolved import `$crate::proc_macro_item`
    with_crate!{krate input proc_macro_item}             //~ ERROR unresolved import `$crate::proc_macro_item`
    with_crate!{krate call proc_macro_item}              //~ ERROR unresolved import `$crate`

    macro_rules! test {() => {
        // crate::proc_macro_item
        invoke_with_ident!{$crate input proc_macro_item} //~ ERROR unresolved import `$crate`
        with_crate!{$crate input proc_macro_item}        //~ ERROR unresolved import `$crate`
        with_crate!{$crate call proc_macro_item}         //~ ERROR unresolved import `$crate`

        // token_site_span::proc_macro_item
        invoke_with_ident!{$crate call proc_macro_item}  //~ ERROR unresolved import `$crate`
    }}
    test!();
};

// Successful resolutions of `token_site_span::TokenItem`
const _: () = {
    invoke_with_crate!{input TokenItem}
    invoke_with_ident!{input TokenItem}
    invoke_with_crate!{call TokenItem}
    invoke_with_ident!{call TokenItem}
    invoke_with_ident!{hello call TokenItem}

    macro_rules! test {() => {
        invoke_with_ident!{$crate call TokenItem}
    }}
    test!();
};

// Failed resolutions of `TokenItem`
const _: () = {
    // crate::TokenItem
    invoke_with_ident!{krate input TokenItem}       //~ ERROR unresolved import `$crate::TokenItem`
    with_crate!{krate input TokenItem}              //~ ERROR unresolved import `$crate::TokenItem`
    with_crate!{krate call TokenItem}               //~ ERROR unresolved import `$crate`

    // mixed_site_span::TokenItem
    invoke_with_crate!{mixed TokenItem}             //~ ERROR unresolved import `$crate`
    invoke_with_ident!{mixed TokenItem}             //~ ERROR unresolved import `$crate`
    invoke_with_ident!{krate mixed TokenItem}       //~ ERROR unresolved import `$crate`
    with_crate!{krate mixed TokenItem}              //~ ERROR unresolved import `$crate`

    macro_rules! test {() => {
        // crate::TokenItem
        invoke_with_ident!{$crate input TokenItem}  //~ ERROR unresolved import `$crate`
        with_crate!{$crate input TokenItem}         //~ ERROR unresolved import `$crate`
        with_crate!{$crate call TokenItem}          //~ ERROR unresolved import `$crate`

        // mixed_site_span::TokenItem
        invoke_with_ident!{$crate mixed TokenItem}  //~ ERROR unresolved import `$crate`
        with_crate!{$crate mixed TokenItem}         //~ ERROR unresolved import `$crate`

    }}
    test!();
};


// Successful resolutions of `crate::ItemUse`
const _: () = {
    invoke_with_ident!{krate input ItemUse}
    with_crate!{krate input ItemUse}
    with_crate!{krate call ItemUse}

    macro_rules! test {() => {
        invoke_with_ident!{$crate input ItemUse}
        with_crate!{$crate input ItemUse}
        with_crate!{$crate call ItemUse}
    }}
    test!();
};

// Failed resolutions of `ItemUse`
const _: () = {
    // token_site_span::ItemUse
    invoke_with_crate!{input ItemUse}            //~ ERROR unresolved import `$crate`
    invoke_with_ident!{input ItemUse}            //~ ERROR unresolved import `$crate`

    // mixed_site_span::ItemUse
    invoke_with_crate!{mixed ItemUse}            //~ ERROR unresolved import `$crate`
    invoke_with_ident!{mixed ItemUse}            //~ ERROR unresolved import `$crate`
    invoke_with_ident!{krate mixed ItemUse}      //~ ERROR unresolved import `$crate`
    with_crate!{krate mixed ItemUse}             //~ ERROR unresolved import `$crate`

    invoke_with_crate!{call ItemUse}             //~ ERROR unresolved import `$crate`
    invoke_with_ident!{call ItemUse}             //~ ERROR unresolved import `$crate`
    invoke_with_ident!{hello call ItemUse}       //~ ERROR unresolved import `$crate`

    macro_rules! test {() => {
        invoke_with_ident!{$crate mixed ItemUse} //~ ERROR unresolved import `$crate`
        with_crate!{$crate mixed ItemUse}        //~ ERROR unresolved import `$crate`

        invoke_with_ident!{$crate call ItemUse}  //~ ERROR unresolved import `$crate`
    }}
    test!();
};


// Only mixed should see mixed_site_span::proc_macro_item
use_input_crate!{proc_macro_item}   //~ ERROR unresolved import `$crate`
use_input_krate!{proc_macro_item}   //~ ERROR unresolved import `$crate`
use_mixed_crate!{proc_macro_item}
use_mixed_krate!{proc_macro_item}
use_call_crate!{proc_macro_item}    //~ ERROR unresolved import `$crate`
use_call_krate!{proc_macro_item}    //~ ERROR unresolved import `$crate`

// Only mixed should fail to see token_site_span::TokenItem
use_input_crate!{TokenItem}
use_input_krate!{TokenItem}
use_mixed_crate!{TokenItem}         //~ ERROR unresolved import `$crate`
use_mixed_krate!{TokenItem}         //~ ERROR unresolved import `$crate`
use_call_crate!{TokenItem}
use_call_krate!{TokenItem}

// Everything should fail to see crate::ItemUse
use_input_crate!{ItemUse}           //~ ERROR unresolved import `$crate`
use_input_krate!{ItemUse}           //~ ERROR unresolved import `$crate`
use_mixed_crate!{ItemUse}           //~ ERROR unresolved import `$crate`
use_mixed_krate!{ItemUse}           //~ ERROR unresolved import `$crate`
use_call_crate!{ItemUse}            //~ ERROR unresolved import `$crate`
use_call_krate!{ItemUse}            //~ ERROR unresolved import `$crate`