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`
|