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