blob: 442b440c1211a6ee28bdd5c82f74e333dc0cfa1a [file] [log] [blame]
// 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`